问题描述
我正在使用 MysqL 和 PHP 创建一个注册系统。我已经能够将系统连接到数据库,并且它在输入的用户名和密码正确时有效。但是,当用户名和密码不正确时(即当用户名/密码对未存储在数据库中时),它只会导致空白页面。目前,我的代码有它,所以当用户名和密码不正确时,它会打印我们的“密码用户名无效”。请参阅下面的代码,任何帮助表示赞赏。提前致谢!
<?PHP
require_once 'source/session.PHP';
require_once 'source/db_connect.PHP';
if(isset($_POST['login-btn'])) {
$user = $_POST['user-name'];
$password = $_POST['user-pass'];
try {
$sqlQuery = "SELECT * FROM users WHERE username = :username";
$statement = $conn->prepare($sqlQuery);
$statement->execute(array(':username' => $user));
while($row = $statement->fetch()) {
$id = $row['id'];
$hashed_password = $row['password'];
$username = $row['username'];
if(password_verify($password,$hashed_password)) {
$_SESSION['id'] = $id;
$_SESSION['username'] = $username;
header('location: dashboard.PHP');
}
else {
echo "Error: Invalid username or password";
}
}
}
catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
}
?>
解决方法
好吧,目前您的 SQL 查询将为不存在的用户返回一个包含 0 行的集合,但这不会导致错误。它只是一个空的结果集。因此它不会通过 while
循环,它会终止而没有错误。
您的逻辑忽略了检查 $statement->rowCount()
是否为零。
澄清一下,以防这个答案令人困惑:如果您输入一个不存在的用户名,您将获得 0 个结果……然后您执行 while(0),这样您就永远不会进入代码的那部分。不进行密码检查。并且不会抛出任何错误,因此您永远不会逃避 try{} 并进入代码的 catch{} 部分。如果用户名从数据库中找到零结果,则此处不会返回任何内容。在这种情况下,您需要添加另一个错误。