2012-09-18 60 views
1

我想設置一個登錄系統,並且在檢查從我的PDO調用返回到我的數據庫的行數時遇到問題。當提供錯誤的用戶名和/或密碼時,以下代碼應該返回0行,但無論密碼或用戶名如何,它似乎都返回1行。計數PDO獲取返回意外數

require_once("includes/database.php"); 
session_start(); 
$dbh = db_connect(); 
$response = array(); 

$user = $_POST['username']; 
$password = $_POST['password']; 

$check_login = "SELECT * FROM user WHERE user=:user AND password=:password LIMIT 1"; 
$check_login_stmt = $dbh->prepare($check_login); 
$check_login_stmt->bindParam(":user", $user); 
$check_login_stmt->bindParam(":password", $password); 

if(!$check_login_stmt->execute()) { 
    $response['code'] = "failure"; 
    $response['err'] = $check_login_stmt->errorInfo(); 
    $response['reason'] = "bad_query"; 
} else { 
    if(count($user = $check_login_stmt->fetch()) > 0) { 
     $_SESSION['login'] = true; 
     $_SESSION['pb_committee'] = $user['pb_committee']; 
     $response['code'] = "success"; 
     $response['count'] = count($user); 
    } else { 
     $response['code'] = "failure"; 
     $response['reason'] = "bad_reqs"; 
    } 
} 

echo json_encode($response); 

當我做一個計數($ user = $ check_login_stmt-> fetchAll())> 0它的作品。但我不明白爲什麼,我寧願使用fetch(),因爲我將它限制在SELECT語句中的一行。

任何建議,非常感謝。

+0

那一行包含什麼? – hjpotter92

+0

@GiantofaLannister當我添加print_r($ user)時,它只是說「真」 – jrubins

回答

0

任何傳遞給count()不是已經陣列被轉換爲陣列。對於大多數情況,這將導致count()返回1NULL是我現在可以想到的唯一例外)。

也就是說,你應該檢查PDOfetch mode,因爲你可能會得到一個非數組,這將導致描述的行爲。

0

我不知道什麼count($nonArrayVariable)會做保證,但你可能會與此一個更好的時間:

} else { 
    if ($check_login_statement->rowCount() > 0) { 
     $user = $check_login_stmt->fetch() 
     // etc. 
    } 

注意,> 0是多餘的。

此外,請不要將密碼以純文本形式存儲在數據庫中。

+0

PHP文檔說不應該依賴rowCount()來返回SELECT語句的行數。這不是一個可以更改密碼的用戶系統。它們被賦予給它們,並且非常受控制。 – jrubins

+0

@jrubins我從來沒有使用'rowCount'爲此目的與MySQL ..它可能不適用於其他一些API。如果你真的不相信它,那麼你將不得不做的是獲取所有的行來獲得行計數,或者只是像'$ user = $ check_login_stmt-> fetch();如果($ user){...' –

+0

@jrubins:無論它如何受控,將它們以明文存儲都不是一個好主意。所需要的只是一個不滿的員工...... – FtDRbwLXw6