Php 更新PDO绑定键和值
所以我最近改用pdo而不是mysqli。现在我有一个关于用mysqli绑定键值的问题。我循环通过它,转义了键和值,并在查询中使用它们。现在我想在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-&
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做了相同的清理,它给出了相同的错误。