SQLSTATE :语法错误或访问冲突: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 ) 

这是预期的(没有是空的)

但它输出错误

QLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误; 检查与您的MySQL服务器版本相对应的手册,以在'from,to,name,subject,message'附近使用正确的语法)VALUES('abc@gmail.com','lala@me.com'at line 1

不知道如何解决这个想法?

from是SQL中的关键字。 您可能不会将其用作列名称而不引用它。 在MySQL中,像列名之类的东西是用引号引起来的,即`from`

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

PS。 正如在注释中指出的那样,另一个SQL关键字也是需要引用的。 方便的是,drupal.org的人员维护SQL中的保留字列表 。

我有这个确切的错误,但在我的情况下,我绑定LIMIT子句的值,而不指定types。 我只是放在这里,以防有人出于同样的原因这个错误。 没有指定types“… LIMIT:limit OFFSET:offset;” 导致“…限制”10“偏移”1“;” 而不是“…限制10偏移1”。 有什么有助于纠正这一点如下:

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

同时试图从multidimensional array插入到数据库值的SQL查询中的pdo错误:

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

从sql查询提取数组arr[$s][a] ,使用包含它的相反variables修复了这个问题。

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

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