登录功能始终返回true

时间:2013-05-02 05:55:53

标签: php mysql pdo

我遇到了使登录功能正常工作的问题。即使输入错误的凭据,它也始终返回true。谁能告诉我为什么会这样?

这是函数

public function login($username, $password) {
    global $pdo;

    $users = new Users;
    $user_id = $users->get_user_id($username);

    $query = $pdo->prepare("SELECT * FROM `users` WHERE `username` = ? AND `password` = ?");
    $query->bindValue(1, $username);
    $query->bindValue(2, $password);
    $query->execute();

    if (!$query) {
        return false;
    }

    return $user_id;
}

以及实施的地方。

if (isset($_SESSION['user_id']) === true) {
    header('Location: backend.php');
    exit();
} else {
if (empty($_POST) === false) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    if (empty($username) === true || empty($password) === true) {
        $errors[] = 'All fields are required!';
    } else {
        $login = $users->login($username, $password);

        if ($login === false) {
            $errors[] = 'Username or password incorrect!';
        } else {
            $_SESSION['user_id'] = $login;
            header('Location: backend.php');
            exit();
        }
    }
}

4 个答案:

答案 0 :(得分:3)

使用rowCount。将你的状况改为,

if ($query->rowCount() > 0) {
    return $user_id;
}
return false;

这会验证您的查询实际上是否返回结果,而不仅仅是查询存在。

答案 1 :(得分:2)

请参阅PDO执行文档: http://php.net/manual/en/pdostatement.execute.php

如果查询成功,它将返回“true”。这意味着查询运行成功,它没有说明返回的结果数量。根据您的尝试,返回0结果可能是一个成功的查询。

答案 2 :(得分:0)

select函数始终返回true。

查找0行不被视为失败。

所以这个查询: $query = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");将始终返回true;

答案 3 :(得分:-1)

看起来这个功能基于'phpacademy'课程。由于某种原因,它包含非常奇怪的部分,使代码非常纠结和膨胀。它实际上对数据库运行两个查询,这完全没有意义。

它必须是什么:

public function login($username, $password) {
    global $pdo;

    $query = "SELECT user_id FROM `users` WHERE `username` = ? AND `password` = ?";
    $stmt  = $pdo->prepare();
    $stmt->execute(func_get_args());
    return $stmt->fetchColumn();
}

应用程序代码也非常膨胀。为什么这么多无用且重复的代码?输入和阅读需要更多的时间。

if (!empty($_SESSION['user_id'])) {
    header('Location: backend.php');
    exit();
} elseif ($_POST) {
    $login = $users->login($_POST['username'], $_POST['password']);

    if ($login) {
        $_SESSION['user_id'] = $login;
        header('Location: backend.php');
        exit();
    } else {
        $errors[] = 'Username or password incorrect!';
    }
}