【问题标题】:PHP PDOException -- Invalid parameter number: Columns/Parameters are 1-based [duplicate]PHP PDOException - 无效的参数号:列/参数是基于 1 的 [重复]
【发布时间】:2014-04-27 22:41:06
【问题描述】:

我的代码是:

.....
.....

$sql = 'SELECT '.$return_fields.' FROM '.$table.' WHERE '.$search_field.'=:'.$search_field;
$stmt = $conn->prepare($sql);
$stmt->bindParam($search_field, $search_val);
$stmt->execute();

....
....

$search_field = 'reg_user_linked', $search_val = 'aa@gmail.com'.

执行语句时出现此错误,我无法弄清楚原因:

参数编号无效:列/参数从 1 开始

谁能帮忙?


经过几个小时的尝试,我发现这个错误只发生在我处于调试模式时。如果我运行代码并打印结果,它可以工作...... 有谁知道为什么会这样? (我的IDE是NetBeans 7.2,调试工具是xdebug)...

【问题讨论】:

  • 显示您的 $search_field$search_val 内容。您所展示的内容对于诊断问题几乎毫无用处。
  • 我同意@MarcB。我猜$search_field 是 0 或 '0'''falsenull - 任何对 bindParam() 评估为零的东西。
  • 谢谢各位。 $search_field = 'reg_user_linked', $search_val = 'aa@gmail.com'
  • 也值得在你的代码中临时打印出$sql,以防你对这些变量名之一犯了错误。
  • @halfer 我把 sql 粘贴到 mysql 中,它工作正常,当然,我用它的值替换了 binding_variable。

标签: php mysql exception pdo


【解决方案1】:

绑定参数时需要在参数名中指定:

$stmt->bindParam(':' . $search_field, $search_val);

您收到一个错误,因为它缺少并且代码回退到期望一个整数值来指示参数位置(就像您使用 ? 样式参数一样)。

请注意文档中对PDOStatement::bindParam() 第一个参数的描述。

参数

参数标识符。对于使用命名占位符的准备好的语句,这将是一个形式为 :name 的参数名称。为一个 使用问号占位符准备好的语句,这将是 参数的 1 索引位置。

【讨论】:

  • 这是错的:他没有。它可以在没有冒号的情况下工作。虽然你的回答不会造成任何伤害,但它不能解决任何问题
  • @MikeBrant 尝试添加 :,仍然得到同样的错误
  • @YourCommonSense 老实说,我从来没有尝试绑定没有冒号的命名参数,所以不知道它是否有效。然而,文档清楚地说明了预期的字符串格式是什么。依赖未记录的行为不是一个好主意。
  • 仍然不是答案,根据您对答案的严格标准,如果有的话
  • @YourCommonSense 所有答案都不能解决问题。这是 StackOverflow 所期望的答案。我指出了一个我认为他的代码中存在问题的特定项目,我解释了为什么我认为这是一个问题,并提供了一个解决方案。
猜你喜欢
  • 2013-08-04
  • 2020-08-11
  • 2023-01-27
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多