You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP登录验证中pending、approve状态判断逻辑不生效问题咨询

问题根因
  • 你写了两个独立的if (isset($_POST['login_btn']))判断块,第一个块在校验账号密码正确后直接执行了header跳转,PHP脚本在输出header响应后就会终止后续逻辑执行,所以第二段的状态校验代码完全不会运行,这就是pending状态用户也能正常登录的核心原因。
  • 你删除第一段用户类型判断后JS跳转失效,是因为输出JS跳转代码后没有加exit终止脚本执行,后续输出的内容会破坏JS代码结构,导致浏览器无法正常解析执行跳转逻辑。
修复方案

把两段逻辑合并,先校验账户状态,再根据用户类型跳转,所有跳转逻辑执行后都加exit终止脚本执行:

if (isset($_POST['login_btn'])) {
    $username = mysqli_real_escape_string($db, $_POST['username']);
    $password = mysqli_real_escape_string($db, $_POST['password']);
    
    if (empty($username)) {
        array_push($errors, "Username is Required");
    }
    if (empty($password)) {
        array_push($errors, "Password is Required");
    }
    
    if (count($errors) == 0) {
        $password = md5($password);
        $query = "SELECT * FROM request WHERE username='$username' AND password='$password' ";
        $results = mysqli_query($db, $query);
        
        if (mysqli_num_rows($results) == 1){
            $logged_in_user = mysqli_fetch_assoc($results);
            // 先校验账户状态
            if($logged_in_user["status"] == 'pending'){
                echo '<script type = "text/javascript">';
                echo 'alert("Your account is still pending for approval!")';
                echo 'window.location.href = "login.php"';
                echo '</script>';
                exit; // 终止后续逻辑执行
            }
            // 状态为approved再走用户类型判断跳转
            $_SESSION['user'] = $logged_in_user;
            if ($logged_in_user['user_type'] == 'admin') {
                $_SESSION['success']  = "Welcome Admin";
                header('location: admin/home.php'); 
            }elseif($logged_in_user['user_type'] == 'employee') {
                $_SESSION['success']  = "Welcome Employee";
                header('location: admin/employee.php'); 
            }else{
                $_SESSION['success']  = "Welcome User";
                header('location: index.php');
            }
            exit; // 跳转后终止执行
        }else {
            array_push($errors, "Wrong username/password combination");
        }
    }
}

如果需要登录成功的弹框提示,可以在跳转后的目标页面加成功提示逻辑,不要在登录接口同时输出弹框JS和header跳转,两种跳转方式混用会导致逻辑冲突。

内容的提问来源于stack exchange,提问作者sKy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:39:01