[英]Why am I getting alert of "Wrong login details." 4 times as I have 4 user in database
if(isset($_POST['signin'])){
$password = $_POST['password'];
$email = $_POST['email'];
$query = "SELECT * from `accounts`;";
if(count(fetchAll($query)) > 0){ //this is to catch unknown error.
foreach(fetchAll($query) as $row){
if($row['email']==$email&&$row['password']==$password){
$_SESSION['login'] = true;
$_SESSION['type'] = $row['type'];
header('location:admin.php');
}else{
echo "<script>alert('Wrong login details.')</script>";
header("Location:login.php");
}
}
}else{
echo "<script>alert('Error.')</script>";
}
}
当我输入错误的电子邮件地址时,我会收到 4 次警报,而且我还有 4 个用户。 这是否意味着每一行都被计算在内,并且在检查每个用户后我会收到警报。 请帮我解决这个问题。
您收到 4 条消息,因为数据库中的 4 个值中的每一个都与您正在检查的值不匹配。 您需要将“错误登录详细信息”警报移出foreach
循环,而是使用$_SESSION['login']
来指示是否存在匹配项,如果不匹配,则输出“错误登录”警报。 像这样的东西:
$_SESSION['login'] = false;
$users = fetchAll($query);
if (count($users) > 0) { //this is to catch unknown error.
foreach ($users as $row){
if($row['email']==$email&&$row['password']==$password){
$_SESSION['login'] = true;
$_SESSION['type'] = $row['type'];
break;
}
}
if ($_SESSION['login']) {
header('location:admin.php');
}
else {
echo "<script>alert('Wrong login details.')</script>";
}
}
笔记
你永远不应该以纯文本形式存储密码,而是使用password_hash
和password_verify
来存储和检查它们。
您要两次获取查询的所有结果,您应该只将一次获取到数组中,然后在foreach
循环中迭代该数组。 我的代码就是这样做的。
您不能回显警报并使用header
语句。 假设这是login.php
,如果您失败了,则不需要header
语句。
最好简单地SELECT * FROM accounts WHERE email = '$email'
并查看是否返回了任何行,而不是遍历表中的所有值。 当表变大时,这将节省时间。 如果这样做,您将需要使用准备好的语句来避免 SQL 注入的风险。 有关如何执行此操作的详细信息,请参阅此问答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.