SQLSTATE[42000]: 语法错误或访问冲突: 1064 SQL 语法中出现错误 — PHP — PDO

2022-08-30 08:17:06

我已经查看了所有其他具有相同问题的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服务器版本相对应的手册,以获取正确的语法,以便在“从,到,名称,主题,消息”附近使用值)值(“abc@gmail.com”,“lala@me.com”在第1行

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


答案 1

from是 SQL 中的关键字。如果不引用它,则不能将其用作列名。在MySQL中,像列名这样的东西是使用反引号引用的,即.`from`

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

PS.如注释中指出的那样,是另一个SQL关键字,因此也需要引用。方便的是,drupal.org 维护 SQL 中的保留字列表to


答案 2

我得到了这个确切的错误,但在我的情况下,我在没有指定类型的情况下绑定了子句的值。我只是在这里删除它,以防有人出于同样的原因得到这个错误。在不指定类型的情况下,导致 而不是 。有助于纠正这一点的是:LIMITLIMIT :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);

推荐