我遇到了使登录功能正常工作的问题。即使输入错误的凭据,它也始终返回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();
}
}
}
答案 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
将始终返回true; users
WHERE username
= ? AND password
= ?");
答案 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!';
}
}