我在fetch函数的基础上创建了这个动态更新函数(相同的方法,只是SET的另一个数组)。
但它似乎有一个错误。
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行=`$update->execute(array_values($columns,$criteria)):
它怎么了?为什么我会犯那个错误?
编辑新错误:
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
这种使用辅助函数的方法是错误的。
您真正需要的是一个支持一些扩展占位符类型的泛型query()函数。或者,至少是一个从数组和允许字段列表中创建SET语句的函数。
这样你就会得到这样的东西:
$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);
这里的语法错误:
array_values($columns, $criteria)
由于array_values()函数由1个参数调用,而您正在传递两个参数。因此,移除任意一个,并在该函数中传递数组。
欲了解更多信息,请阅读此处:array_values()。
应该是:
$update->execute(array_merge(array_values($columns), array_values($criteria)));
CCD_ 1将连接来自CCD_ 2和CCD_ 3的值。