一尘不染

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

mysql

我已经浏览了所有其他StackOverflow(和Google)中相同问题的帖子,但似乎都没有解决我的问题。

我正在使用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();
}

而第一个print_r给

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

这是预期的(没有一个为空)

但它输出错误

SQLSTATE [42000]:语法错误或访问冲突:1064
SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“从,到,名称,主题,消息”附近使用VALUES(第1行的“
abc@gmail.com”,“ lala@me.com”)

不知道如何解决此问题。有任何想法吗?


阅读 440

收藏
2020-05-17

共1个答案

一尘不染

from是SQL中的关键字。您必须在未引用的情况下将其用作列名。在MySQL中,列名之类的内容使用反引号引起来,即from

就个人而言,我不会打扰。我只是将列重命名。

PS。正如注释中指出的那样,它to是另一个SQL关键字,因此也需要将其引起来。方便地,drupal.org上的人员维护SQL保留字列表

2020-05-17