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
相关产品推荐
相关产品推荐

