Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更新PDO绑定键和值_Php_Mysql_Pdo_Mysqli - Fatal编程技术网

Php 更新PDO绑定键和值

Php 更新PDO绑定键和值,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,所以我最近改用pdo而不是mysqli。现在我有一个关于用mysqli绑定键值的问题。我循环通过它,转义了键和值,并在查询中使用它们。现在我想在pdo中做同样的事情,但这不起作用,我不知道为什么这是我的代码: foreach($userdata as $key => $value){ $sql = $this->db->prepare("UPDATE `users` SET :key = :value WHERE `id` = :userid"); $sql-&

所以我最近改用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()
    );
}

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

你有什么错误吗?看起来你什么都没做。尝试使用“:key”=>$key等。。。注意“:”不确定它是否有区别,但我总是这样做是@JayBlanchard这是错误消息SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在“username”=“sjerdus”附近使用的正确语法,其中
id
=“2”@Shaeldon:“是可选的。您可以放置,也可以不放置,结果是一样的。您不能别名列(
:key
),您必须像使用
id
一样声明它们。因此无法将字段名与pdo绑定?这是一个pityNope,因为prepared语句不仅仅是用来替换参数的。查询准备在服务器端使用不同的参数执行多次,但查询的“核心”(被查询的表和字段)没有改变。这不是一个设计缺陷吗?在我看来,查询中的字段很可能会发生变化,特别是如果您不想编写100 if else语句的话。事实上,RDBMS做了很多事情来优化查询。你应该读@IMSoP,这是关于为什么不能将字段或表名作为绑定参数的更完整的说明。嘿,没有mysql或mysqli,我如何转义字符串,因为quote和bind做了相同的清理,它给出了相同的错误。