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

我已经查看了所有其他 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();
}

第一个 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行

不知道怎么解决,有办法吗?

662342 次浏览

from是 SQL 中的关键字。如果不引用它,则不能将其用作列名。在 MySQL 中,诸如列名之类的内容使用反勾引用,例如 `from`

就我个人而言,我不会费心; 我只会重命名这个专栏。

附言。正如在评论中指出的那样,to是另一个 SQL 关键字,因此它也需要被引用。方便的是,drupal.org 的用户维护一个 SQL 中保留字列表

我得到了这个确切的错误,但是在我的例子中,我绑定了 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);

在试图从多维数组插入数据库值时,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;

正确地添加反勾,即“‘”。在反勾之间写出 getTable 名称和列名称。