如何将SQL查询结果用作过滤条件?角色权限控制代码异常排查
这种实现思路是可行的!但你的代码里有几个关键问题导致条件判断被忽略
先直接给结论:通过角色ID加载对应页面头部的思路完全没问题,只是你的代码里存在语法、逻辑层面的错误,才导致条件判断被忽略。我帮你拆解下问题,再给出修正后的代码:
你的代码里的核心问题
SQL查询获取了所有用户的角色ID,而非当前登录用户的
你写的SELECT role_id from users会返回数据库里所有用户的role_id,根本不是当前登录用户的角色,这直接导致后续判断完全偏离预期。必须加上WHERE条件,根据当前登录用户的唯一标识(比如SESSION里存的user_id或用户名)来查询他的role_id。错误地直接用mysqli_result对象和字符串比较
$conn->query($sql)返回的是一个mysqli_result对象,不是具体的role_id值,你直接拿它和'202000'比较肯定永远不成立。得从结果集中取出当前用户的role_id值才行。逻辑运算符优先级错误+冗余判断
你的条件isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] == true && $result === '202000'有两个问题:||的优先级比&&低,导致逻辑完全混乱- 前面已经判断过用户是否登录了,这里的
isset和==true属于冗余判断
语法错误:大括号不匹配
include_once "premierHeader.php";后面没有闭合if的大括号就直接写else了,这会导致PHP语法报错,脚本直接中断。
修正后的代码示例
<?php // Initialize the session session_start(); // Check if the user is logged in, if not then redirect him to login page if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){ header("location: login.php"); exit; } // 假设你的users表主键是id,且登录时把用户id存在了SESSION['user_id']里 $conn = new mysqli('localhost','root','','mes'); // 用预处理语句避免SQL注入,同时只查询当前登录用户的role_id $stmt = $conn->prepare("SELECT role_id FROM users WHERE id = ?"); $stmt->bind_param("i", $_SESSION['user_id']); // 假设user_id是整数类型,用"i";如果是字符串用"s" $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $user_role_id = $row['role_id']; // 获取当前用户的role_id // 正确的条件判断:用户已登录且角色ID是202000 if($_SESSION["loggedin"] === true && $user_role_id === '202000'){ include_once "premierHeader.php"; } else{ include_once "header.php"; } // 记得关闭连接和预处理语句 $stmt->close(); $conn->close(); ?>
额外的优化建议
- 登录时直接把role_id存入SESSION:其实没必要每次加载页面都查数据库,用户登录验证成功后,直接把他的role_id存入
$_SESSION['role_id'],之后直接用SESSION里的值判断即可,减少数据库查询开销。 - 处理数据库查询失败的情况:比如如果查询不到当前用户的role_id(理论上不会出现,但要做容错),可以默认加载普通头部或者做错误处理。
内容的提问来源于stack exchange,提问作者Ashisuto Technology
相关产品推荐
相关产品推荐

