2012-07-10 76 views
5

就在最近我已经转向在PHP/MySQL中使用PDO,并转换了几十个查询。他们中的大多数工作,但是这很容易抛出一个在$sql->execute()PDO - 无效参数

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

PDOStatement对象::执行()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)); 

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

非常感谢您提前!

+0

“* PDO - 无效的参数编号**虽然它是正确的***”。不,这是不正确的。 – Lion 2012-07-10 06:53:38

+0

@Lion:是的,你是对的...已经改变了标题...我就像失明,谢谢你的帮助! – Chris 2012-07-10 06:55:01

回答

5

':username',$username作品仅在bindParam()方法:

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

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

对于执行你需要传递正确的输入数值列表:

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

占位符:

您也可以使用此:

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

但对于这一点,你需要查询改成这样:

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

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

11

这不是bug,你只为一个占位符提供两个参数。

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

应该

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

哦,我的上帝......谢谢你!多可惜! – Chris 2012-07-10 06:51:53