我的PDO / MySQL语法出了什么问题?

时间:2012-03-27 12:50:08

标签: php mysql pdo

我正在使用以下代码:

$query = $dbh->prepare("INSERT into crm_order_errors "
                      ."SET (order_id, number_of_attempts, last_attempt) "
                      ."VALUES (:order_id, 0, :last_attempt) "
                      ."ON DUPLICATE KEY UPDATE number_of_attempts = number_of_attempts + 1, last_attempt = :last_attempt"
         );

$query->execute(array(':order_id'=>$orderId, ':last_attempt'=>1332849904);

这会产生以下错误:

  

PHP警告:PDOStatement :: execute():SQLSTATE [42000]:语法错误   或访问冲突:1064您的SQL语法有错误;校验   与您的MySQL服务器版本对应的手册   在'(order_id,number_of_attempts,last_attempt)附近使用的语法   VALUES('10297',0,''在第1行   /_myClasses/MYSQL_Logger.php   在第57行

我不清楚错误在哪里。似乎找不到:last_attempt的值,因为警告的值为''Values ('10297', 0, ''。为什么会发生这种情况,是问题的根源?

另外,我是否允许在准备好的声明中使用相同的占位符两次(在本例中为:last_attempt)。

3 个答案:

答案 0 :(得分:4)

您在execute功能上缺少结束括号。

应该是:

$query->execute(array(':order_id'=>$orderId, ':last_attempt'=>1332849904));

您需要删除SET关键字。这是UPDATE语句,而不是INSERT语句。

答案 1 :(得分:0)

您不需要SQL语句中的SET

答案 2 :(得分:0)

您缺少一个括号:

$query->execute(array('order_id' => $orderId, 'last_attempt' => 1332849904));

同时从SET声明中删除INSERT INTO