我已经浏览了所有其他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] => [email protected]
[:to] => [email protected]
[:name] => abc
[:subject] => abc
[:message] => abc )
这是预期的(没有为null)
但它输出错误
SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在'from,to,name,subject,message)附近使用正确的语法VALUES('abc @gmail.com','[email protected]'在第1行
不知道如何解决这个问题。有任何想法吗?
from
是SQL中的关键字。如果不引用它,则不能将其用作列名。在MySQL中,使用反引号(即`from`
)引用列名等内容。
就个人而言,我不会打扰;我只是重命名专栏。
PS。正如评论中指出的那样,to
是另一个SQL关键字,所以它也需要引用。方便的是,drupal.org上的人们保持着list of reserved words in 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);
尝试从multidimential数组插入数据库值时,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名称和列名。