用户名和密码不匹配输出
Posted
技术标签:
【中文标题】用户名和密码不匹配输出【英文标题】:Username and Password Don't Match Output 【发布时间】:2021-04-10 00:05:15 【问题描述】:我正在使用 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();
?>
【问题讨论】:
猜测它是实际上将您引导到dashboard.php,但它在那个页面上没有得到正确处理。 或您的帖子变量未设置。如果您在所有 if 语句之外添加回显,则输出是什么,例如if($post)... echo "didn't go in"
;
【参考方案1】:
嗯,目前您的 SQL 查询将为不存在的用户返回一个包含 0 行的集合,但这不会导致错误。它只是一个空的结果集。因此它不会通过while
循环,它只会终止而没有错误。
您的逻辑忽略了检查$statement->rowCount()
是否为零。
澄清一下这个答案是否令人困惑:如果您输入一个不存在的用户名,您将得到 0 个结果...然后您执行 while(0),这样您就永远不会进入代码的那部分。没有进行密码检查。并且不会引发错误,因此您永远不会逃避 try 并进入代码的 catch 部分。如果用户名从数据库中出现零结果,则此处不返回任何内容。在这种情况下,您需要添加另一个错误。
【讨论】:
感谢您的回复。你能解释一下我应该如何解决这个问题吗? 在 $statement->execute 之后,您需要使用 $statement->rowCount() 测试返回了多少行。如果数字为零,则用户名不匹配任何内容,您应该立即发送错误。 如果此答案对您有帮助,请标记为正确。以上是关于用户名和密码不匹配输出的主要内容,如果未能解决你的问题,请参考以下文章
如果“父”文档没有任何匹配的用户名和密码,则护照匹配子文档中的用户名和密码