我查看了所有其他具有相同问题的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行
不知道如何解决这个问题。任何想法?
答案 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名称和列名。