警告:pdo::exec():sqlstate[42000]:语法错误或访问冲突:1064

afdcj2ne  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(373)

在这个问题之后,我运行以下脚本:

$newrecord='{"firsttime":"19.53","secondtime":null,"sX464time":"6.25","wX1X465time":"4.14"}';//JSON
$sql='UPDATE  `'.$tablesnames[$i].'` SET `postrecords`='.$newrecord.' WHERE `id`='.$id;
//var_dump($sql) here
$update3=$pdo->exec($sql);
``` `var_dump($sql)` 获取结果:

string 'UPDATE table651 SET postrecords={"firsttime":"19.53","secondtime":null,"sX464time":"6.25","wX1X465time":"4.14"} WHERE id=1'

但最后得到警告:
警告:pdo::exec():sqlstate[42000]:语法错误或访问冲突:1064您的sql语法有错误;请查看与您的mysql服务器版本对应的手册,以了解使用“firsttime”:“0”,“secondtime”:null,“sx464time”:null的正确语法
有什么问题吗?
w7t8yxp5

w7t8yxp51#

当您使用pdo或面向对象的mysql时,总是绑定参数。
字符串总是需要用引号括起来,数字可以不用引号。不要尝试生成json,而是创建一个数组,然后将其转换为json。

$post_records = json_encode(array(
    'firsttime'=> '19.53',
    'secondtime' => null,
    'sX464time' => '6.25',
    'wX1X465time' => '4.14'
));

$sql='UPDATE `'.$tablesnames[$i].'` SET `postrecords`="'.$newrecord.'" WHERE `id`='.$id;
blmhpbnm

blmhpbnm2#

语法错误是因为在sql中json字符串周围没有引号。
使用 bindParam() 以解决缺少引号的问题,以及确保所有内容都正确转义以防止sql注入。

$stmt = $pdo->prepare('UPDATE  `'.$tablesnames[$i].'` SET `postrecords` = :record WHERE `id`= :id');
$stmt->bindParam(':record', $newrecord);
$stmt->bindParam(':id', $id);
$stmt->execute();

相关问题