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

多级管理员登录系统异常:Level2管理员显示Level1数据

嘿,我看到你的问题了,核心问题出在admin-pp-sipp-litbang.php里获取Session值的方式上,咱们一步步拆解:

问题根源:错误使用isset()获取Session值

你在admin-pp-sipp-litbang.php里写了这两行代码:

$admin_level = isset($_SESSION['levelSession']);
$admin_id = isset($_SESSION['adminSession']);

isset()函数的作用是判断变量是否存在,它返回的是布尔值(true/false),而不是Session里存储的实际数值!

举个例子:

  • 当你用level2的管理员登录时,$_SESSION['levelSession']的值是2,但isset($_SESSION['levelSession'])返回的是true,在SQL查询中布尔值true会被自动转换成整数1
  • 同理,$_SESSION['adminSession']是管理员的ID(比如2),isset()返回true也会被转成1

这就导致你的查询语句实际变成了:

SELECT * FROM admin WHERE id_admin=1 AND level=1

自然查到的就是level1管理员的信息了。

修正方案

1. 正确获取Session实际值,同时增加权限校验

在admin-pp-sipp-litbang.php开头,先校验用户是否有权限访问该页面,再直接取出Session里的真实值:

<?php
session_start();
require_once 'class.admin.php';

// 先校验:必须是已登录的level2管理员,否则跳回登录页
if(!isset($_SESSION['adminSession']) || !isset($_SESSION['levelSession']) || $_SESSION['levelSession'] != 2){
    header('Location: loginadmin.php');
    exit; // 跳转后必须终止脚本执行
}

$user = new ADMIN();
// 直接获取Session中的实际值
$admin_id = $_SESSION['adminSession'];
$admin_level = $_SESSION['levelSession'];

$stmt = $user->runQuery("SELECT * FROM admin WHERE id_admin=:admin_id AND level=:level");
$stmt->bindParam(":admin_id",$admin_id);
$stmt->bindParam(":level",$admin_level);
$stmt->execute();
$userRow=$stmt->fetch(PDO::FETCH_ASSOC);
?>

2. 额外优化建议

  • 你的cekSession()方法里跳转路径用了反斜杠\,建议改成正斜杠/,避免跨操作系统的路径问题:
    // 原代码
    header('Location: \SIPP-Litbang\admin.php');
    // 修改后
    header('Location: /SIPP-Litbang/admin.php');
    
  • 在loginadmin.php的登录成功分支里,最好手动调用cekSession()并终止脚本,避免后续可能的代码执行问题:
    if ($admin->login($user, $pass)){
        $admin->cekSession();
        exit;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:31