SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有错误 - PHP - PDO

wil*_*ium 60 php mysql sql pdo mysql-error-1064

我查看了所有其他stackoverflow(和谷歌)帖子同样的问题,但似乎没有解决我的问题.

我正在使用pdo和php.

我的代码:

$vals = array(
   ':from'    => $email,
   ':to'      => $recipient,
   ':name'    => $name,
   ':subject' => $subject,
   ':message' = >$message
);
print_r($vals);
try {
   $pdo = new PDOConfig();
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $sql = "SELECT * FROM messages WHERE `message` LIKE :message";
   $q = $pdo->prepare($sql);
   $q->execute(array(':message' => $vals[':message']));
   $resp = $q->fetchAll();

   foreach ($resp as $row) {
      throw new Exception('Please do not post the same message twice!');
   }

   $sql = "INSERT INTO messages (from, to, name, subject, message) VALUES (:from, :to, :name, :subject, :message)";
   $q = $pdo->prepare($sql);
   $q->execute($vals);
} 
catch(PDOException $e) {
   echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

并且第一个print_r给出

Array ( [:from]    => abc@gmail.com 
        [:to]      => lala@me.com 
        [:name]    => abc 
        [:subject] => abc 
        [:message] => abc )
Run Code Online (Sandbox Code Playgroud)

这是预期的(没有为null)

但它输出错误

QLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法中有错误; 查看与您的MySQL服务器版本对应的手册,以便在'from,to,name,subject,message)附近使用正确的语法VALUES('abc @gmail.com','lala@me.com'在第1行

不知道如何解决这个问题......想法?

Jan*_*ger 106

from是SQL中的关键字.如果不引用它,则不能将其用作列名.在MySQL中,使用反引号引用列名等内容,即`from`.

就个人而言,我不会打扰; 我只是重命名专栏.

PS.正如评论中指出的那样,to是另一个SQL关键字,所以它也需要引用.方便的是,drupal.org上的人员在SQL中维护一个保留字列表.

  • 谢谢.我使用的保留关键字是"引用".这是一个列表http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html (6认同)
  • “订单”也被保留。哦!谢谢你的帖子:-) (3认同)

uKo*_*lka 33

我有这个确切的错误,但在我的情况下,我是LIMIT条款的绑定值而没有指定类型.我只是放弃这个,以防有人因同样的原因得到这个错误.没有指定LIMIT :limit OFFSET :offset;导致的类型LIMIT '10' OFFSET '1';而不是LIMIT 10 OFFSET 1;.有助于纠正以下内容:

$stmt->bindParam(':limit', intval($limit, 10), \PDO::PARAM_INT);
$stmt->bindParam(':offset', intval($offset, 10), \PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)

  • 关闭仿真[也有帮助](http://stackoverflow.com/tags/pdo/info) (6认同)
  • @CoR在他链接到的Wiki中对此进行了很好的解释。默认情况下(启用仿真),PDO将占位符参数视为字符串。限制变为“ ... LIMIT'10'OFFSET'1';” 那不是你想要的。如果关闭仿真,MySQL将根据其类型处理占位符值。 (2认同)