更新PDO绑定键和值


Update PDO bind key and values

所以我最近改为使用pdo而不是mysqli。现在我有一个关于用mysqli绑定键值的问题。我循环遍历它,转义了键和值,并在查询中使用它们。现在我想在pdo中做同样的事情,但这不起作用,我不知道为什么这是我的代码:

foreach($userdata as $key => $value){
    $sql = $this->db->prepare("UPDATE `users` SET :key = :value WHERE `id` = :userid");
    $sql->execute(
        array(
            'key' => $key,
            'value' => $value,
            'userid' => $userid
        )
    );
}

当然,还有更多的代码来查看它是否需要更新和其他类型的输入,这些输入需要更多的验证,但这是我使用的主要查询,但没有绑定。对于pdo和绑定参数和值,这可能吗?这就是我得到的错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'username' = 'sjerdus' WHERE `id` = '2'' 

您出现此错误是因为您试图动态更新名为的字段。SET :key = ...无法工作,因为当参数将被其值替换时,它将被PDO转义(并引用)。

如果你想放一个将要更新的变量字段名,你必须手动连接字段名,但你必须自己检查安全性。

试试这样的东西:

//Security checks for $field variable...
$sql = $this->db->prepare("UPDATE `users` SET " . $field . " = :value WHERE `id` = :userid");
$sql->execute(
    array(
        'value' => $value,
        'userid' => $userid
    )
);

你可以这么做。我假设你提供的$userid是一个整数。其中,当您直接在execute()中使用params时。它们被认为是字符串。

foreach($userdata as $key => $value){
    $sql = $this->db->prepare("UPDATE `users` SET :key = :value WHERE `id` = :userid");
    $sql->bindParam(':key', $key);
    $sql->bindParam(':value', $value);
    $sql->bindParam(':userid', $userid);
    $sql->execute()
    );
}

http://php.net/manual/en/pdostatement.bindparam.php