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

Posted

技术标签:

【中文标题】SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 — PHP — PDO [重复]【英文标题】:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax — PHP — PDO [duplicate] 【发布时间】:2011-05-31 10:51:08 【问题描述】:

我浏览了所有其他 ***(和 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 行附近使用的正确语法

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

【问题讨论】:

【参考方案1】:

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

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

PS。正如 cmets 中所指出的,to 是另一个 SQL 关键字,因此也需要引用。方便的是,drupal.org 上的人们维护了一个 list of reserved words in SQL。

【讨论】:

"order" 也是保留的。嗬!感谢您的帖子:-) "UNLOCK" 也是保留的 (dev.mysql.com/doc/refman/5.5/en/keywords.html) :-) 谢谢,遇到了同样的问题。 我通过搜索另一个与此类似的问题找到了此问答。他们(OP)确实勾选了from,之后没有勾选的是to。看看他们在编辑后发布的错误:right syntax to use near 'to,编辑为***.com/posts/4544051/revisions。应该对此进行编辑。 OP 还用勾选的from 编辑了他们的问题,我已将问题恢复到原来的状态。 保留字链接已更改dev.mysql.com/doc/refman/5.7/en/keywords.html【参考方案2】:

我遇到了这个确切的错误,但在我的情况下,我绑定了 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);

【讨论】:

关闭模拟also helps @Your 常识:为什么会有帮助?我有相同的限制值绑定问题,关闭仿真确实有帮助:) 但是为什么呢? @CoR 在他链接的wiki中解释得很好。 PDO 默认将占位符参数视为字符串(启用仿真)。限制变为“... LIMIT '10' OFFSET '1';”这不是你想要的。如果你关闭仿真,MySQL 根据它们的类型处理占位符值。【参考方案3】:
ALTER TABLE `$installer->getTable('sales/quote_payment')`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
    ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;

正确添加反引号,即“`”。在反引号之间写下您的 getTable 名称和列名称。

【讨论】:

很好【参考方案4】:

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

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

从 sql 查询中提取数组 arr[$s][a],使用包含它的变量来解决问题。

【讨论】:

以上是关于SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 — PHP — PDO [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Cakephp SQLSTATE [42000]:语法错误或访问冲突:1064

带有消息“SQLSTATE [42000]”的未捕获异常“PDOException”:语法错误或访问冲突:

SQLSTATE [42000]:语法错误或访问冲突:1064 PHP/MySQL [关闭]

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误