【问题标题】:Warning: PDO::exec(): SQLSTATE[42000]: Syntax error or access violation: 1064警告:PDO::exec(): SQLSTATE[42000]:语法错误或访问冲突:1064
【发布时间】:2018-10-09 20:52:08
【问题描述】:

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

有什么问题?

【问题讨论】:

  • 在另一个问题中,您被告知不能对表名使用参数。为什么还要删除数据的参数?
  • 在那个问题中,我知道prepare中不能使用参数,那我直接使用exec。我的错误是什么?
  • 您应该只删除表名的参数,您可以保留它们用于其他所有内容。
  • 您打印了 SQL,但没有看到明显的错误,即您的字符串周围没有引号?

标签: mysql pdo


【解决方案1】:

当您使用 PDO 或面向对象的 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;

【讨论】:

  • json数据来自我的json_encode(unserialize())数据,见this post。我觉得应该是string然后不明白为什么要加"
  • 因为你是连接一个变量而不是绑定它。如果要绑定它,则不需要引号。但是,如果您直接写入字符串,则需要它。您可以看到您的查询输出,您的 json 字符串周围没有引号。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2015-10-12
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多