PHP动态更新功能错误?

时间:2013-07-24 12:29:28

标签: php mysql

我已经基于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->执行(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

3 个答案:

答案 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);

答案 1 :(得分:1)

这里的语法错误:

array_values($columns, $criteria)

由于1参数调用了array_values()函数,并且您传递了两个函数。所以删除任何一个并在此函数中传递数组。

有关详细信息,请参阅:array_values()

答案 2 :(得分:0)

应该是:

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

array_merge将连接$columns$criteria的值。