-1

我已经基于 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
4

3 回答 3

2

这种带有辅助功能的方法是错误的。

您真正需要的是一个支持一些扩展占位符类型的通用 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);
于 2013-07-24T12:41:59.830 回答
1

你在这里有错误的语法:

array_values($columns, $criteria)

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

在此处阅读更多内容:array_values()

于 2013-07-24T12:34:00.573 回答
0

它应该是:

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

array_merge将连接来自$columns和的值$criteria

于 2013-07-24T12:36:33.287 回答