2012-09-18 61 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