【问题标题】:PDO - Invalid parameter numberPDO - 无效的参数号
【发布时间】:2012-07-09 14:49:57
【问题描述】:

就在最近,我转而在 PHP/MySQL 中使用 PDO 并转换了几十个查询。他们中的大多数都可以工作,但是这个非常简单的方法会在$sql->execute() 处引发异常@

$sql=$pdo->prepare("SELECT id FROM user WHERE username = :username LIMIT 1");
$sql->execute(array(':username',$username));

PDOStatement::execute() pdostatement.execute SQLSTATE[HY093]: Invalid parameter number: 绑定变量数与...中的标记数不匹配

经过研究,我找到了这个链接:https://bugs.php.net/bug.php?id=60515

...因此尝试将查询更改为

$sql=$pdo->prepare("SELECT `id` FROM `user` WHERE `username` = :username LIMIT 1");
$sql->execute(array(':username',$username));

但结果还是一样。有没有人看到明显的错误或者为什么这个查询在所有其他人都没有工作时不起作用?

非常感谢您!

【问题讨论】:

  • PDO - 无效的参数号虽然它是正确的”。不,这是不正确的。
  • @Lion:是的,你是对的……已经改了标题……我瞎了,谢谢你的帮助!

标签: php mysql pdo


【解决方案1】:

这不是错误,您只为一个占位符提供了两个参数。

$sql->execute(array(':username',$username));

应该是

$sql->execute(array(':username' => $username));

【讨论】:

    【解决方案2】:

    ':username',$username 仅适用于 bindParam() 方法:

    $sql->bindParam(':username', $username, PDO::PARAM_STR);
    

    看这里:http://www.php.net/manual/en/pdostatement.bindparam.php

    对于执行,您需要传递一个正确的仅输入值数组:

    $sql->execute(array(':username' => $username));
    

    占位符:

    你也可以这样用:

    $sql->execute(array($username));
    

    但是为此,您需要将查询更改为:

    $sql=$pdo->prepare("SELECT `id` FROM `user` WHERE `username` = ? LIMIT 1");    
    

    ?用作占位符并从数组中获取变量。当您在 SQL 语句中使用更多占位符时,该函数会按顺序将所有变量从数组中取出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2016-03-13
      • 2017-01-31
      相关资源
      最近更新 更多