执行PDO UPDATE语句触发SQLSTATE[42000]语法错误,求解决
解决PDO执行UPDATE语句时的SQL语法错误(JSON字段赋值问题)
嘿,这个问题我一眼就看出来啦——你的SQL语句里给postrecords字段赋值的JSON字符串没加单引号,MySQL把JSON里的大括号、冒号这些符号当成SQL语法的一部分了,自然就抛出1064的语法错误啦!
先看你输出的错误SQL:
string 'UPDATE
table651SETpostrecords={"firsttime":"19.53","secondtime":null,"sX464time":"6.25","wX1X465time":"4.14"} WHEREid=1'
看到没?{"firsttime"...}直接跟在等号后面,没有任何引号包裹,这完全不符合SQL的字符串赋值规则,哪怕是JSON类型的字段,赋值时也得把JSON字符串当成普通字符串用单引号括起来才行。
给你两种解决方案,优先推荐第一种:
方案一:使用PDO预处理语句(强烈推荐)
预处理语句不仅能完美解决这个语法问题,还能从根源上防止SQL注入,安全性拉满。代码改成这样:
$newrecord = '{"firsttime":"19.53","secondtime":null,"sX464time":"6.25","wX1X465time":"4.14"}'; // 用占位符代替直接拼接值 $sql = 'UPDATE `'.$tablesnames[$i].'` SET `postrecords` = :json WHERE `id` = :id'; $stmt = $pdo->prepare($sql); // 绑定参数,PDO会自动处理引号和转义 $stmt->bindParam(':json', $newrecord); $stmt->bindParam(':id', $id); $update3 = $stmt->execute();
这样PDO会自动帮你把JSON字符串用单引号包裹,还会处理字符串内部的特殊字符,完全不用你手动操心。
方案二:手动给JSON字符串加转义后的单引号(不推荐,有注入风险)
如果你一定要直接拼接SQL语句,记得用PDO的quote()方法给JSON字符串加上转义后的单引号,避免内部有单引号时出错:
$newrecord = '{"firsttime":"19.53","secondtime":null,"sX464time":"6.25","wX1X465time":"4.14"}'; // quote()方法会自动添加单引号并转义内部特殊字符 $escapedJson = $pdo->quote($newrecord); $sql = 'UPDATE `'.$tablesnames[$i].'` SET `postrecords`='.$escapedJson.' WHERE `id`='.$id; $update3 = $pdo->exec($sql);
不过这种方法还是存在SQL注入风险,所以尽量用方案一的预处理语句。
修正后的正确SQL应该是这样的:
UPDATE `table651` SET `postrecords`='{"firsttime":"19.53","secondtime":null,"sX464time":"6.25","wX1X465time":"4.14"}' WHERE `id`=1
这样MySQL就能正确识别这是一个JSON字符串,顺利完成更新操作啦!
内容的提问来源于stack exchange,提问作者kittygirl
相关产品推荐
相关产品推荐

