用户名和密码不匹配输出

Posted

技术标签:

【中文标题】用户名和密码不匹配输出【英文标题】:Username and Password Don't Match Output 【发布时间】:2021-04-10 00:05:15 【问题描述】:

我正在使用 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();
    



?>

 

【问题讨论】:

猜测它实际上将您引导到dashboard.php,但它在那个页面上没有得到正确处理。 您的帖子变量未设置。如果您在所有 if 语句之外添加回显,则输出是什么,例如 if($post)... echo "didn't go in"; 【参考方案1】:

嗯,目前您的 SQL 查询将为不存在的用户返回一个包含 0 行的集合,但这不会导致错误。它只是一个空的结果集。因此它不会通过while 循环,它只会终止而没有错误。

您的逻辑忽略了检查$statement-&gt;rowCount() 是否为零。

澄清一下这个答案是否令人困惑:如果您输入一个不存在的用户名,您将得到 0 个结果...然后您执行 while(0),这样您就永远不会进入代码的那部分。没有进行密码检查。并且不会引发错误,因此您永远不会逃避 try 并进入代码的 catch 部分。如果用户名从数据库中出现零结果,则此处不返回任何内容。在这种情况下,您需要添加另一个错误。

【讨论】:

感谢您的回复。你能解释一下我应该如何解决这个问题吗? 在 $statement->execute 之后,您需要使用 $statement->rowCount() 测试返回了多少行。如果数字为零,则用户名不匹配任何内容,您应该立即发送错误。 如果此答案对您有帮助,请标记为正确。

以上是关于用户名和密码不匹配输出的主要内容,如果未能解决你的问题,请参考以下文章

C++:从文件/用户名和密码读取

如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码

Spring:验证用户登录

重写GenericServlet源代码并实现登录用户名密码的匹配

提示“用户名或密码不正确”,怎么办?

如何匹配区分大小写的用户名和密码