2011-12-27 94 views
1

爲什麼這部分代碼即使不應該也會返回truePHP的PDO語句返回不正確的行數與SELECT?

$stmt = $dbh->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username`= :username LIMIT 1"); 
$stmt->bindParam(':username', $username); 
$stmt->execute(); 
return ($stmt->rowCount() == 1) ? true : false; 

如果我進入一個領域的用戶名已經被註冊,則返回true,然後輸出:

That username has already been taken! 

但是,如果我輸入沒有註冊一個用戶名,它仍然返回true並輸出上面的行。我不確定這是爲什麼,以及如何修復。

我知道PHP manual指出rowCount()有一些問題SELECT查詢,但我不能找到一種解決方法,返回受一個SELECT查詢的行數。

回答

2

因爲COUNT()將始終返回1行,但它的價值可能爲0

你可以做一個選擇True代替:

SELECT TRUE FROM `users` WHERE `username`= :username LIMIT 1 

或者你可以檢查是否值大於0:

return ($stmt->fetchColumn() > 0); 

順便說一句 - 「true:false」部分是多餘的;具有布爾條件本身就是這樣做的。

+0

謝謝你的回答 - 我想知道更多關於選擇true。有沒有關於它的文檔?我試過搜索但找不到任何東西。 – ReactingToAngularVues

+0

它與執行'select 1'或'select'blahblahblah'或'select 1 + 1'沒有區別。你不必從表格中選擇,你可以選擇返回的固定文本(或者在'1 + 1'的情況下返回'2')。但是,有些DB(如oracle)要求您爲這些查詢選擇一個名爲'dual'的特殊僞表。 –

1

您正在檢查結果行的數量。由於您的查詢始終只返回一個結果行,因此rowCount()會返回1.一個結果行將包含計數,例如, 0或1與您的查詢。

您需要檢查結果行中的計數值,或更改查詢以在用戶不存在的情況下不返回任何行。

0

嘗試簡單的無約束力:

$res = $dbh->query('SELECT COUNT(`user_id`) AS total FROM `users` WHERE `username`= "'.$username.'" ')->fetch(); 

return ($res['total'] == 1) ? true : false;