繁体   English   中英

为什么我会收到“错误的登录详细信息”的警报。 4 倍,因为我在数据库中有 4 个用户

[英]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>";
    }
}

笔记

  1. 你永远不应该以纯文本形式存储密码,而是使用password_hashpassword_verify来存储和检查它们。

  2. 您要两次获取查询的所有结果,您应该只将一次获取到数组中,然后在foreach循环中迭代该数组。 我的代码就是这样做的。

  3. 您不能回显警报并使用header语句。 假设这是login.php ,如果您失败了,则不需要header语句。

  4. 最好简单地SELECT * FROM accounts WHERE email = '$email'并查看是否返回了任何行,而不是遍历表中的所有值。 当表变大时,这将节省时间。 如果这样做,您将需要使用准备好的语句来避免 SQL 注入的风险。 有关如何执行此操作的详细信息,请参阅此问答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM