用户名和密码不匹配输出

问题描述

我正在使用 MysqLPHP 创建一个注册系统。我已经能够将系统连接到数据库,并且它在输入的用户名密码正确时有效。但是,当用户名和密码不正确时(即当用户名/密码对未存储在数据库中时),它只会导致空白页面。目前,我的代码有它,所以当用户名和密码不正确时,它会打印我们的“密码用户名无效”。请参阅下面的代码,任何帮助表示赞赏。提前致谢!

    <?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{} 部分。如果用户名从数据库中找到零结果,则此处不会返回任何内容。在这种情况下,您需要添加另一个错误。