更新 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'' 

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

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

您遇到此错误是因为您试图更新一个动态命名的字段。 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
    )
);