11

就在最近,我转而在 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]:无效的参数号:绑定变量的数量与...中的标记数量不匹配

经过研究,我发现了这个链接: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));

但仍然得到相同的结果。有没有人看到明显的错误,或者为什么这个查询在所有其他人都做的时候不起作用?

非常感谢您!

4

2 回答 2

15

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

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

应该

$sql->execute(array(':username' => $username));
于 2012-07-10T06:50:51.860 回答
7

':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 语句中使用更多占位符时,该函数会按顺序将所有变量从数组中取出。

于 2012-07-10T06:59:48.533 回答