PHP PDO准备语句给出“无效语法”错误[重复]

Posted

技术标签:

【中文标题】PHP PDO准备语句给出“无效语法”错误[重复]【英文标题】:PHP PDO prepared statements giving 'invalid syntax' error [duplicate] 【发布时间】:2014-11-11 04:22:42 【问题描述】:

我在 PDO 中使用准备好的语句从我的 SQL 服务器中选择一些数据,但出现语法错误:

QLSTATE[HY000]: General error: 10007 Incorrect syntax near 'memb_user'. [10007] (severity 5) [(null)] in

memb_user 是表名。这是准备好的语句和我正在使用的数组:

$query =   "SELECT ?, ? FROM ? WHERE ? = ? AND ? = ?";

   $data    =   array($this->columns['username'], $this->columns['password'], $this->table,
                      $this->columns['username'], $this->user , $this->columns['password'], $this->pass);

这就是我执行语句的方式:

$statement  =   $this->connection->prepare($query);
        $statement->execute($data);

我已经尝试将查询放入 sql server 并用正确的值替换占位符,这似乎没问题,唯一需要关注的是需要在 WHERE 条件中的引号。那我是不是执行错了?

【问题讨论】:

列名或表名不能使用占位符 -> SELECT ?, ? FROM ?,只能用于值。 【参考方案1】:

正如@sean 所说,“您不能将占位符用于列名或表名。”但是,您可以通过 sprintf() 将它们注入到查询中。注意:确保所有 POST/GET 数据都已正确转义。

试试这个:(未经测试)

$query = sprintf('SELECT `%1$s`, `%2$s` FROM `%3$s` WHERE ? = ? AND ? = ?', $this->columns['username'], $this->columns['password'], $this->table);

$data  = array($this->columns['username'], $this->user , $this->columns['password'], $this->pass);

【讨论】:

感谢您的回答,不知道列名或表名不能作为占位符。将列/表变量放入通常可以解决问题。

以上是关于PHP PDO准备语句给出“无效语法”错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP在准备SQL语句时抛出致命错误[重复]

PDO - 使用准备好的语句[重复]

PDO 准备语句中的 SQLSTATE[22018] 错误

如何查看准备好的 PDO SQL 语句 [重复]

PHP PDO准备插入-不插入数据并且不显示错误[重复]

使用 PDO 准备好的语句 MySQL 错误