2014-02-21 58 views
0

因此,我有以下PDO语句,它是页面上几个类似构造的语句之一。其余的工作正常,所以我很困惑,为什么这个说明无效的语法。无效的PDO MySQL语句 - 语法错误

$test_id = '1'; 
$option = 'a'; 
$ab_email = '[email protected]'; 

$stmt = $pdo_db->prepare("INSERT INTO `ab_tests_visitors` (test_id,option,visits,email) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE email=?"); 
$stmt->execute(array($test_id,$option,1,$ab_email,$ab_email)); 

该数据库的模式有5列,其中2个是索引。

  • visitor_id为int(10)和AUTO_INCREMENT,以及伯
  • 为test_id为int(10)
  • 选项为varchar(100)
  • 访问为int(10)和默认的1
  • 电子邮件为varchar(255)和独特的

报错错误是:

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以找到正确的语法,用于选项,访问,电子邮件附近)VALUES(?,?,?,?)ON DUPLICATE KEY UPDATE email =?'在线1'

+0

尝试在反引号(')中包含字段 – T0xicCode

+0

旁注:4个VALUES,但数组为5个。可能是一个因素,但不会修复你的代码。编辑:'选项'是一个保留字。见下面的答案。 –

+0

最后一个变量用于SQL“ON DUPLICATE KEY UPDATE”,因此它不是额外的。 –

回答

1

optionMySQL keyword。如果你想使用它作为一个标识符,确保始终与反引号括起来(你应该使用标识符反正做):

$stmt = $pdo_db->prepare("INSERT INTO `ab_tests_visitors` (`test_id`,`option`,`visits`,`email`) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE `email`=?"); 
+0

作为补充说明,我在阅读另一篇SO文章后刚更正了我的陈述。除了在保留关键字周围使用反引号之外,为php代码中使用的变量添加前缀也有帮助,因为我的函数的一部分是返回一个名称为$ name的浏览器名称,而不是我正在寻找的名称。所以与这个函数相关的所有变量现在都以abt为前缀。 –

1

对于这个问题,在你列的名称,必须使用反引号`围绕列名称(alt + 96)