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

时间:2010-12-28 06:13:23

标签: php sql mysql pdo mysql-error-1064

我查看了所有其他具有相同问题的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服务器版本相对应的手册,以便在'from,to,name,subject,message)附近使用正确的语法VALUES('abc @gmail.com','lala @me.com'在第1行

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

4 个答案:

答案 0 :(得分:100)

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

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

PS。正如评论中指出的那样,to是另一个SQL关键字,所以它也需要引用。方便的是,drupal.org上的人员保持list of reserved words in SQL

答案 1 :(得分:31)

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

LIMIT 10 OFFSET 1;

答案 2 :(得分:1)

尝试从multidimential数组插入数据库值时,sql查询中出现相同的pdo错误:

$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);    
$sth->execute();

从sql查询中提取数组arr[$s][a],使用包含它的变量来修复问题。

答案 3 :(得分:0)

ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
    ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;

正确添加反引号,即“`”。在反引号之间写下你的getTable名称和列名。