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

时间:2018-04-29 16:43:20

标签: mysql pdo

this question之后,我在脚本下面运行:

$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服务器版本相对应的手册,以便在'"""" 0"," secondtime":null附近使用正确的语法" sX464time":null

问题是什么?

2 个答案:

答案 0 :(得分:0)

语法错误是因为您没有在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();

答案 1 :(得分:0)

当您使用PDO或Object Orient MySQL时,始终bind parameters

字符串总是需要用引号括起来,数字可以没有引号。并且不要尝试创建一个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;