如何修复SQLSTATE [42000]错误;用准备好的陈述

时间:2016-08-23 18:07:30

标签: php mysql mysql-error-1064

我正在尝试创建电子邮件确认脚本。

这是我的PHP代码:

...
$q = $dbh->prepare("INSERT INTO `email_confirm` (UserID,token,tokenDate) VALUES(:id, :token, UTC_TIMESTAMP()) ON DUPLICATE KEY UPDATE token = VALUES(:token), tokenDate = UTC_TIMESTAMP();");
$result = $q -> execute( array( ":id" => $this->id, ":token" => $token ) );
...

运行时,我收到以下错误:

 Caught exception: 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 '?), tokenDate = UTC_TIMESTAMP()' at line 1

我不是MySQL的专家,但我的代码中找不到任何语法错误,我希望得到一些帮助。

1 个答案:

答案 0 :(得分:4)

正如PDO::prepare所述:

  

当您致电PDOStatement::execute()时,您必须为要传递给语句的每个值添加唯一参数标记。除非启用了仿真模式,否则不能在预准备语句中多次使用同名的命名参数标记。

虽然您可以添加恰好绑定到相同值的:token2占位符或类似内容,但实际上ON DUPLICATE KEY UPDATE子句中的MySQL VALUES()函数的列名不是文字。因此,这将解决问题:

$q = $dbh->prepare('
  INSERT INTO email_confirm
    (UserID, token, tokenDate)
  VALUES
    (:id, :token, UTC_TIMESTAMP())
  ON DUPLICATE KEY UPDATE
    token = VALUES(token),
    tokenDate = UTC_TIMESTAMP()
');

但是,您可能需要查看Automatic Initialization and Updating for TIMESTAMP and DATETIME,而不是尝试重新实现轮子。