【问题标题】:PHP PDO unnamed bound variables does not match number of tokensPHP PDO 未命名的绑定变量与令牌数不匹配
【发布时间】:2012-08-18 17:48:37
【问题描述】:

我尝试使特定的 MySQL 查询与 PDO 未命名占位符一起工作,我怀疑问题可能与第三个问号周围的“”有关,但我就是想不通。

我得到了例外: '无效的参数号:绑定变量的数量与标记的数量不匹配'

为了便于阅读,这里去掉了函数的相关部分,try-catch之类的。在我将其更改为 PDO-MySQL 之前,使用包含简单字母数字字符串的 $column 和 $mytype 调用函数,这些字符串与早期的纯 MySQL 代码配合良好,所以它们应该没问题。

define('SQL_TABLE', 'mytable');

function listThem($column, $mytype) {

   # These lines succeed
   $databaseHandle = new PDO('mysql:host=' . SQL_HOST . ';dbname=' . SQL_DATABASE, SQL_USER, SQL_PASSWORD);
   $databaseHandle->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

   # The following three lines cast the exception
   $input = array(SQL_TABLE, $column, $mytype);
   $statementHandle = $databaseHandle->prepare('SELECT *, ((100 * likes) / (dislikes + 1)) '
      . "AS rating FROM ? WHERE ? REGEXP '?' ORDER BY rating DESC;");
   $statementHandle->execute($input);

   # . . .  more code here
}

【问题讨论】:

  • REGEXP 指的是这个吗? launchpad.net/mysql-udf-regexp - 如果是你可能想检查你的语法
  • 我不记得能够将表名绑定为查询中的参数。
  • 谢谢!我不确定我使用的是哪个 REGEXP 实现,但这并不重要,因为在我开始为 PDO 重写代码之前它工作得很好,而对正则表达式没有任何更改。即使 $mytype 只是一个没有空格的简单六字母小写字符串,我也会遇到异常,所以我猜错误隐藏在其他地方......
  • 感谢阿克萨纳斯!你走在正确的轨道上。

标签: php mysql exception pdo


【解决方案1】:

您不能使用准备好的语句将表名或字段名绑定为参数。参数绑定只针对值。

您需要将它们构建到字符串中。只需确保正确过滤值即可。

另外,你不应该使用'?',绑定参数会处理这个问题。

【讨论】:

  • 这就解决了。谢谢!并感谢'?'的改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多