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

SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误—;PHP—;PDO,php,sql,mysql,pdo,mysql-error-1064,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

我已经浏览了所有其他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();
}
第一次打印

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)值('abc@gmail.com', 'lala@me.com“在1号线


不知道如何解决这个问题。有什么想法吗?

from
是SQL中的一个关键字。如果不引用它,就不能将它用作列名。在MySQL中,列名之类的内容使用反勾号引用,即
` from`

就我个人而言,我不想麻烦;我只想重新命名该列


注:正如评论中指出的,
to
是另一个SQL关键字,因此也需要引用它。drupal.org上的人员很方便地维护了一个。

我有一个确切的错误,但在我的例子中,我绑定了
LIMIT
子句的值,但没有指定类型。我只是把这个放在这里,以防有人得到这个error的原因相同。未指定类型
限制:限制偏移量:偏移量;
导致
限制“10”偏移量“1”;
而不是
限制10偏移量1;
。以下内容有助于更正此问题:

$stmt->bindParam(':limit', intval($limit, 10), \PDO::PARAM_INT);
$stmt->bindParam(':offset', intval($offset, 10), \PDO::PARAM_INT);

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

$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);    
$sth->execute();
从sql查询中提取数组
arr[$s][a]
,使用包含该数组的变量来解决问题

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

正确地添加backtick,即“`”。在backtick之间写下您的可获取名称和列名。

“order”也被保留。Doh!谢谢您的帖子:-)“UNLOCK”也被保留():-)谢谢,遇到了同样的问题。我通过搜索与此类似的另一个问题找到了此问答。他们(OP)确实勾选了中的
,之后没有勾选的是
到。看看他们在编辑后发布的错误:
使用near'to
的正确语法,编辑正在进行。应就此对答案进行编辑。OP还使用中勾选的
编辑了他们的问题,我已将问题回滚到原始状态。保留字链接已更改,关闭了emulation@Your Common Sense:为什么有用?我也有同样的极限值绑定问题,关闭仿真确实有帮助:)但为什么?@CoR他链接到的wiki中解释得很好。PDO默认情况下将占位符参数视为字符串(启用模拟)。限制变成“…限制'10'偏移量'1';”而这不是您想要的。如果关闭仿真,MySQL将根据占位符值的类型处理占位符值。这非常有用!谢谢!那太好了