2012-07-10 79 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