1

我正在尝试设置登录系统,但无法检查从我的 PDO 调用返回到我的数据库的行数。当提供错误的用户名和/或密码时,以下代码应返回 0 行,但无论密码或用户名如何,它似乎都返回 1 行。

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);

当我执行 count($user = $check_login_stmt->fetchAll()) > 0 时,它可以工作。但我不明白为什么,我宁愿使用 fetch() 因为我将它限制在 SELECT 语句中的一行。

任何建议都非常感谢。

4

2 回答 2

0

我不能保证count($nonArrayVariable)会做什么,但你可能会玩得更好:

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

请注意,这> 0是多余的。

另外,请不要将密码以纯文本形式存储在数据库中。

于 2012-09-18T23:26:12.177 回答
0

任何传递给count()它的还不是数组的东西都被转换为数组。对于大多数事情,这将导致count()返回1NULL这是我现在能想到的唯一例外)。

也就是说,您应该检查fetch modePDO ,因为您可能会返回一个非数组,这将导致所描述的行为。

于 2012-09-18T23:36:07.287 回答