【问题标题】:PDOStatement execute SQLSTATE invalid parameter numberPDOStatement 执行 SQLSTATE 参数号无效
【发布时间】:2014-02-28 23:17:12
【问题描述】:

我开始使用 PDO 来支持 PHP/MySQL 中的多数据库,但由于某种原因,一个查询不断产生错误消息:

$account_email = 'test@test.com';

$statement = $pdo->prepare("SELECT id FROM account WHERE account_email = :email");
$statement->execute( array(':email' => $account_email ));

警告:PDOStatement::execute(): SQLSTATE[HY093]: 参数号无效:绑定变量的数量与标记的数量不匹配

出于兴趣,我尝试了其他实现方法,但它抛出了同样的错误:

$statement = $pdo->prepare("SELECT id FROM account WHERE account_email = ?");
$statement->execute( array( $account_email ));

我已经做了很多研究,显然 PDO 对格式很挑剔。 PDO 是否不喜欢这个查询?间距?

仅供参考:我已经阅读了 StackOverflow 的大部分其他问题。有时人们在数组中有额外的参数,有时是拼写错误,有些人的语法错误不会产生错误,但仍然会影响参数的数量。在这种情况下,一切似乎都很完美。

【问题讨论】:

  • 对我来说看起来不错。那是您的脚本的精确副本,还是您在复制到 SO 时进行了更改?实际代码中可能存在拼写错误。
  • 它是复制和粘贴,但出于安全原因更改电子邮件地址除外。另一个有趣的事情是,我在它上面有一个插入语句(用于记录),它工作正常,并且遵循完全相同的格式。我还在 $account_email 之后回显并停止了脚本,以确保所有值都正确传递给脚本。他们都很好。我就是想不通。
  • 脚本中是否有对bindParambindValue 的调用?
  • 如果您遵循here 的建议并将您的代码减少到最低限度,您可以隔离您的问题,甚至可以解决它。作为一名老程序员,我逐步开发代码。

标签: php mysql sql pdo


【解决方案1】:

你不必传入一个数组,尤其是只有一个参数,试试这个:

$account_email = 'test@test.com';

$statement = $pdo->prepare("SELECT id FROM account WHERE account_email = :email");
$statement->bindParam(':email', $account_email);
$statement->execute();

【讨论】:

  • 感谢 meda 的回答——虽然我正在使用包装类,但我不想例外。我还没有找到解决方法。
  • 顺便说一句,您的解决方案是我在这种情况下使用的解决方案,因此我将其标记为可接受的答案。仍然很想知道为什么这不起作用——我最好的猜测是一个错误。我已经消除了几乎所有其他选项。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多