2013-07-24 26 views
-1

我已經做了這個動態更新函數,基於獲取函數,(相同的方法,只是另一個數組的SET)。PHP動態更新函數錯誤?

但它看起來像它有一個錯誤。

public function update($table, $columns = array(), array $criteria = null) 
    { 
     // The query base 
     $query = "UPDATE $table"; 

     $query .= ' SET ' . implode(', ', array_map(function($column) { 
      return "$column = ?"; 
     }, array_keys($columns))); 

     // Start checking 
     if ($criteria) { 
      $query .= ' WHERE ' . implode(' AND ', array_map(function($column) { 
       return "$column = ?"; 
      }, array_keys($criteria))); 
     } 

     $update = $this->pdo->prepare($query) or die('An error has occurred with the following message:' . $query); 
     $update->execute(array_values($criteria)); 
    } 

,這是錯誤我收到(行179 =`$最新情況:>執行(array_values($列,$標準));):

有什麼不對呢?爲什麼我得到那個錯誤?

編輯新的錯誤:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\xampp\htdocs\argonite\includes\class\MYSQL\Database.class.php:179 Stack trace: #0 C:\xampp\htdocs\argonite\includes\class\MYSQL\Database.class.php(179): PDOStatement->execute(Array) #1 C:\xampp\htdocs\argonite\index.php(8): Database->update('argonite_server...', Array, Array) #2 {main} thrown in C:\xampp\htdocs\argonite\includes\class\MYSQL\Database.class.php on line 179 
+4

array_values()期望的是1個參數,2給出 –

+0

php.net/manual/en/function.array-values.php – insanebits

+0

這個功能是脆弱的到sql注入 –

回答

1

你有錯誤的語法在這裏:

array_values($columns, $criteria) 

由於array_values()函數由1個參數調用,你傳遞了兩個。所以刪除任何一個,並在這個函數中傳遞數組。

更多請點擊這裏:array_values()

+0

爲什麼downvote可以downvoter告訴我爲什麼這樣? –

+0

沒有$列我只會得到缺少參數的SQL錯誤,爲什麼? –

+0

@Junatanm由於array_values的降級使得索引值爲0,1,2,並且它需要參數,所以我認爲你不應該使用這個函數。 –

0

它應該是:

$update->execute(array_merge(array_values($columns), array_values($criteria))); 

array_merge$columns$criteria串聯值。

+0

是的,但我仍然收到無效的參數編號錯誤。 –

+0

它還說「沒有參數綁定」? – Barmar

+0

綁定變量的數量與令牌的數量不匹配 –

2

這種方法與輔助函數是錯誤的。

你真正需要的是一個支持幾個擴展佔位符類型的通用query()函數。或者至少,a function to create SET statement out of array and a list of allowed fields

這樣你就會有這樣的事情:

$allowed = array("name","surname","email","password"); // allowed fields 

$sql = "UPDATE users SET ".pdoSet($allowed,$values)." WHERE id = :id"; 
$stm = $dbh->prepare($sql); 
$values['id'] = $_POST['id']; 
$stm->execute($values);