2012-12-25 81 views
1

由於某些原因,無論參數是什麼以及SQL行內部的內容如何,​​以下代碼總是返回true。它也引發一個錯誤「通知:未定義抵消:0在C:\ WAMP \ WWW \線路7社交網絡\ INC \ login.inc」,但我看不出有什麼不妥:使用fetchAll()從PDO對象中選擇

<?php 
function checkAccount($username, $password){ 
    include("INC/dbconnect.inc");/*"INC/dbconnect.inc" is <?php $pdo = new PDO("mysql:host=localhost;dbname=socialnetwork","user","123"); ?>*/ 
    $select = $pdo->prepare("SELECT id,password FROM users WHERE user_username = :username"); 
    $select->execute(array(':username'=>$username)); 
    $q_rows = $select->fetchAll(); 
    if($q_rows[0][0]/*the ID of the user, it should always be greater than 1, if not then the username does not exist*/ > 0 && $q_rows[0][0] != null){ 
     if($q_rows[0][1]/*the password of the user*/ == $password) 
      return true; 
     else 
      return false; 
    } 
    else 
     return false; 
    $pdo=null; 
} ?> 

人請告訴我什麼是錯的?我在代碼裏面評論了我遇到的問題,並且我嘗試了正常的$select->fetch()而不是$select->fetchAll()無濟於事。在發佈之前,我已經閱讀了PDO(http://php.net/manual/en/pdostatement.fetchall.php)。這裏是我的文件http://pastebin.com/YCkrRivs的其餘部分,謝謝。

+0

確保你真正瞭解的回報 「假」 之間'的區別;'和'返回false;'。 – goat

回答

0

如果數據庫沒有返回任何行,那麼將不會有條目$q_rows[0]。因此,當您嘗試檢索不存在的數組中的行時,未定義的偏移量爲0。對於不存在的用戶,您的「ID」不是> 0不是正確的摘要。

採樣返回看起來是這樣的(如果你的print_r()倒是它)

用戶存在:

$q_rows = Array (
    [0] => Array ( 
    [id] => 1, 
    [password] => 'dno23n3io3' 
) 
) 

沒有用戶存在:

$q_rows = Array (
) 

你應該這樣做:

if(size($q_rows) > 0) { 
    //Handle user present 
} else { 
    //Handle no user present 
} 
+0

我已經嘗試了這一點,並嘗試了print_r()來找出什麼是錯誤的,但由於某種原因print_r()不會寫任何東西到頁面,現在所有的函數都會返回false(修復「true」和「false」返回... derp!) – Spectrewiz

+0

我做了一些調試,發現問題。我認爲sha512始終保持32位數字,但事實並非如此。因此,我表中的所有數字都不匹配密碼輸入中較長的加密。修復哈希後,這工作謝謝:) – Spectrewiz

0

你不需要t Ø使用fetchAll,只需使用fetch

$q_row = $select->fetch(); 

if ($q_row) { 
    // do your logic ... 
} 

你正在返回字符串"true"/"false",而不是布爾值,你應該使用true/false代替。

更簡單,你可以只是做象下面這樣:

$q_row = $select->fetch(); 
return $q_row && $q_row[0] > 0 && $q_row[1] === $password; 
+0

也是一個很好的答案,因爲你不應該有多個用戶使用相同的用戶名,所以'fetchAll'沒有價值。我不確定崩潰的回報是否特別透明,但它是整潔的.. –

+0

這是一個很好的答案,但不幸的是,即使添加count($ q_row)> 0'並取出$ q_row [ 0]> 0'作爲[Philip Whitehouse](http://stackoverflow.com/users/1052931/philip-whitehouse)在他之前的回答中說。現在所有的函數都返回false(在修復「true」和「false」返回... derp!之後) – Spectrewiz

+0

@Spectrewiz代碼中可能存在一些其他問題,請執行一些調試工作。 – xdazz