0

我在让登录功能正常工作时遇到问题。即使我输入了错误的凭据,它也总是返回 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

4 回答 4

3

使用rowCount。将您的条件更改为,

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

这将验证您的查询实际上返回了一个结果,而不仅仅是该查询存在。

于 2013-05-02T06:00:02.933 回答
2

查看 PDO 执行的文档:http: //php.net/manual/en/pdostatement.execute.php

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

于 2013-05-02T06:00:02.293 回答
0

选择函数始终返回 true。

查找 0 行不被视为失败。

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

于 2013-07-17T15:28:41.353 回答
-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!';
    }
}
于 2013-05-03T08:06:18.610 回答