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

如何将SQL查询结果用作过滤条件?角色权限控制代码异常排查

这种实现思路是可行的!但你的代码里有几个关键问题导致条件判断被忽略

先直接给结论:通过角色ID加载对应页面头部的思路完全没问题,只是你的代码里存在语法、逻辑层面的错误,才导致条件判断被忽略。我帮你拆解下问题,再给出修正后的代码:

你的代码里的核心问题

  1. SQL查询获取了所有用户的角色ID,而非当前登录用户的
    你写的SELECT role_id from users会返回数据库里所有用户的role_id,根本不是当前登录用户的角色,这直接导致后续判断完全偏离预期。必须加上WHERE条件,根据当前登录用户的唯一标识(比如SESSION里存的user_id或用户名)来查询他的role_id。

  2. 错误地直接用mysqli_result对象和字符串比较
    $conn->query($sql)返回的是一个mysqli_result对象,不是具体的role_id值,你直接拿它和'202000'比较肯定永远不成立。得从结果集中取出当前用户的role_id值才行。

  3. 逻辑运算符优先级错误+冗余判断
    你的条件isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] == true && $result === '202000'有两个问题:

    • ||的优先级比&&低,导致逻辑完全混乱
    • 前面已经判断过用户是否登录了,这里的isset和==true属于冗余判断
  4. 语法错误:大括号不匹配
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 23:03:01