$_SESSION['user_level']权限验证失效问题求助
问题分析与修复方案
我帮你找到了两个核心问题,这就是为什么你的权限控制没生效的原因:
1. 登录逻辑中未正确获取用户级别(user_level)
在你的server.php登录处理部分,你执行了数据库查询但没有从结果集中取出用户数据行,直接调用$row['user_level']会导致这个变量为空,自然无法正确设置$_SESSION['user_level']。
修复后的登录代码片段:
// LOGIN USER if (isset($_POST['login_user'])) { $useremail = mysqli_real_escape_string($db, $_POST['useremail']); $password = mysqli_real_escape_string($db, $_POST['password']); if (empty($useremail)) { array_push($errors, "Email is required"); } if (empty($password)) { array_push($errors, "Password is required"); } if (count($errors) == 0) { $password = md5($password); $query = "SELECT * FROM users WHERE email='$useremail' AND password='$password'"; $results = mysqli_query($db, $query); if (mysqli_num_rows($results) == 1) { // 关键:从结果集中取出用户数据行 $row = mysqli_fetch_assoc($results); $_SESSION['user_level'] = $row['user_level']; // 现在能正确获取user_level了 $_SESSION['useremail'] = $useremail; $_SESSION['success'] = "You are now logged in"; header('location: index.php'); exit; // 加上exit防止跳转后执行后续代码 } else { array_push($errors, "Wrong username/password combination"); } } }
2. 首页权限控制逻辑错误 + 缺少会话启动
你提到的index.html顶部的PHP代码有三个关键问题:
- HTML文件默认不会解析PHP,你需要把文件名改成
index.php - 逻辑完全写反了:你想要的是"user_level低于1时拒绝访问",但原代码是等于1就跳转到自身,否则跳登录页
- 没有调用
session_start(),导致无法读取$_SESSION变量
修复后的首页权限控制代码(放在index.php最顶部):
<?php session_start(); // 必须先启动会话才能访问$_SESSION // 检查用户是否登录,且user_level >=1 if (!isset($_SESSION['user_level']) || $_SESSION['user_level'] < 1) { header("Location: login.php"); exit; } // 到这里说明权限符合要求,继续加载首页内容 ?>
这样逻辑就正确了:如果用户未登录,或者级别低于1,就跳转到登录页;权限符合要求则正常显示首页。
额外建议(可选)
- 不要使用
md5加密密码,它已经不安全了,推荐使用password_hash()和password_verify()来处理密码 - 注册新用户时可以默认设置
user_level为0(等待审核状态),这样新用户登录后会被自动拦截,符合你注册时提示的"需要管理员审核"的逻辑
内容的提问来源于stack exchange,提问作者NeedtoKnow Basis
相关产品推荐
相关产品推荐

