2017-07-28 80 views
1

我在PHP OOP中編寫代碼,我試圖發送$ _POST數據 由一個Class函數過濾到另一個Class函數,將數據添加到數據庫 。具體登錄和密碼登記 表格。PHP如何發送數組變量到類函數

我有3類,將做到這一點:

  1. 是處理與數據庫的連接(我認爲這是沒有必要把這裏的代碼)
  2. 簡單類是過濾來的類$ _ POST-S:

    class Filter extends Dbconnect { 
    protected $login; 
    protected $haslo; 
    
    public function regFilter() { 
        if (isset($_POST)) 
         { 
         foreach($_POST as $key => $val) 
          { 
          $filterVal = strip_tags($val); 
          $filterVal = htmlspecialchars($filterVal); 
          $filterVal = stripslashes($filterVal); 
          $filterVal = str_replace("\\", "", $filterVal); 
          $filter = array(
           $key => $filterVal 
          ); 
          foreach($filter as $key => $val) 
           { 
           echo "[$$key]"; 
           echo "$val"; 
           $ 
            { 
            $key 
            } = $val; 
           } 
          } 
    
         return $filter = array(
          'login' => $login, 
          'haslo' => $haslo 
         ); 
         } 
         else 
         { 
         echo "Proszę podać login i hasło!"; 
         } 
        } 
    } 
    
  3. 類,將得到用戶名和密碼,並將其發送給DB:

    class Dbinsert extends regFilter{ 
    //protected $login; 
    //protected $haslo; 
    protected $query; 
    protected $dbo; 
    public function insert(){ 
    //$this->extract = extract($filter); 
    //$this->login = $login; 
    //$this->haslo = $haslo; 
    $this->connect(); 
    $this->query = "INSERT INTO uzytkownik (id, nazwa, haslo) VALUES ('', :login, OLD_PASSWORD(:haslo))"; 
    if(!$result = $this->connect()->prepare($this->query)){ 
    echo 'Zapytanie nie powiodło się'; 
    } 
    else{ 
    $result->bindParam(':login', $login); 
    $result->bindParam(':haslo', $haslo); 
    $login = $_POST['login']; 
    $haslo = $_POST['haslo']; 
    $result->execute(); 
    } 
    $dbo = null; 
    } 
    } 
    

現在,當我試圖從形式對象發送數據:

$rejestruj = new Dbinsert(); 
    $filtruj = $rejestruj->regFilter(); 
    var_dump($filtruj); 
    $dodaj = $filtruj->insert(); 

我得到以下結果:

[$login]login 
    [$haslo]password123 
    array(2) { ["login"]= string(5) "login" ["haslo"]= string(11) "password123" } 
    Fatal error: Call to a member function insert() on array in `E:\Xampp\htdocs\php\bazy_danych\obiektowe\my\register.php` on line 78 

這並不讓我驚訝,因爲:登錄和haslo是從 「foreach」循環中類Filter(它只是爲了測試)「數組(2)」 從「var_dump($ filtruj);」(以檢查它是否實際上是 工作)和錯誤返回,因爲我發送一個數組到類 Dbinsert - 但在函數中,我把「提取」獲取變量。

我該如何發送這個濾波後的數組中的變量到類 Dbinsert?

編輯:作爲@Twinfriends建議我更正了類Dbinsert中的函數插入以實際使用預準備語句,這就是爲什麼(現在)登錄和haslo變量正在接受$ _POST。現在我需要回答我的問題。

(第一次發帖,感謝編輯的建議,也可以是任何建議表示讚賞,因爲我在PHP相當初學者 )

+1

請重新格式化您的代碼,以便可以閱讀它 –

+0

您的查詢沒有任何意義。 YOu嘗試將變量綁定到沒有任何佔位符的查詢。 – Twinfriends

+0

@Twinfriends你可能是對的,因爲我的工作方法是編寫程序,然後將其轉換爲OOP。但查詢無需過濾功能。 – korni

回答

0

抱歉花了這麼長時間來回答,我完全忘了你的問題。那麼,讓我們看看你的問題,希望解決它。

我試着儘可能地解釋它,以便你瞭解發生了什麼事情。首先,讓我們看看你的錯誤信息

Fatal error: Call to a member function insert() on array in E:\Xampp\htdocs\php\bazy_danych\obiektowe\my\register.php on line 78

好的。調用陣列上的函數...讓我們看看你如何實際調用函數:

$rejestruj = new Dbinsert(); 
$filtruj = $rejestruj->regFilter(); 
var_dump($filtruj); 
$dodaj = $filtruj->insert(); 

而正是在這裏是你的錯誤。你必須明白,你調用對象的方法並將你的數據傳遞給這個方法,而不是調用你的數據的方法。我的意思是什麼?

$rejestruj是您的Dbinsert對象。你在你的第一行代碼中創建它。然後,你可以調用它的regFilter函數。還有一切都很好。正如你所看到的,var_dump給你預期的結果。所以錯誤必須在你的最後一道代碼上。實際上,您嘗試在陣列上調用方法insert()。這不會奏效,因爲你的數組不知道任何叫做insert()的方法。

給該方法的正確的判罰會(不是最後一個!):

$dodaj = $rejestruj->insert();

現在的方法調用應該工作。但事實上,它不會插入任何東西。爲什麼?因爲insert()方法嘗試綁定變量$login$haslo - 該方法不知道的兩個變量。所以我們需要在你的方法中傳遞數據。要做到這一點,你必須做如下修改:

方法調用:

$rejestruj->insert($filtruj); // $filtruj contains your array

和你Dbinsert應該像這樣:

class Dbinsert extends Dbconnect{ 
protected $query; 
protected $dbo; 

    public function insert($data){ 

     $this->connect(); 
     $this->query = "INSERT INTO uzytkownik (id, nazwa, haslo) VALUES ('', :login, OLD_PASSWORD(:haslo))"; 
     if(!$result = $this->connect()->prepare($this->query)){ 
      echo 'Zapytanie nie powiodło się'; 
     } 
     else { 
      $result->bindParam(':login', $data["login"]); 
      $result->bindParam(':haslo', $data["haslo"]); 
      $result->execute(); 
     } 
     $dbo = null; 
    } 
} 

我希望你的代碼與這個變化一起工作。所以,雖然在我看來代碼應該現在可以工作,但我想提一下,有很多事情可以改進。例如,你不是編程真正的「面向對象」......它更多的是你在這裏寫的僞OOP。有些事情是非常糟糕的做法(可以做得更容易)。我不想深入細節,因爲我不知道你是否對它感興趣。如果你希望我可以給你更多的建議,但只有你想。

否則我真的希望我的回答能幫助你。如果整件事情仍然不起作用,請讓我知道,這樣我可以再看一遍。

有一個愉快的一天;)

編輯:

因爲它似乎我沒有足夠清楚,這裏的代碼應該如何看起來像現在:

$rejestruj = new Dbinsert(); 
$filtruj = $rejestruj->regFilter(); 
$dodaj = $rejestruj->insert($filtruj); 
+0

它的工作原理,但我收到一條警告消息: 「警告:缺少Dbinsert :: insert()的參數1,在E:\ Xampp \ htdocs \ php \ bazy_danych \ obiektowe \ my中調用\ register.php在第78行,並且在第45行的E:\ Xampp \ htdocs \ php \ bazy_danych \ obiektowe \ my \ test_service.php中定義,我也會真正地對你的主題提供幫助,因爲我想進入PHP編程和學習做它應該這樣做。 (現在我正慢慢走向Laraver) – korni

+0

@korni你確定你調用的方法像'$ rejestruj-> insert($ filtruj);'?還請檢查我所有的變量拼寫,因爲我手動輸入了它們。我可能會誤輸變量名稱,可能會導致此警告。 – Twinfriends

+0

拼寫看起來恰到好處。警告消息行: 「$ filtruj = $ rejestruj-> insert();」 並在類功能: 「公共功能插入($數據){」 ,因爲它似乎缺少$數據 – korni