PHP项目优化:如何通过ID筛选指定用户/管理员实现专属审批
解决方案:通过ID筛选+权限控制实现指定用户访问
当然可以通过users表的id字段来筛选指定用户,结合type字段还能更灵活地实现权限控制,解决当前所有用户都能查看用户列表的问题。下面是具体实现思路和代码示例:
1. 先做权限拦截(核心)
在显示用户列表或执行审批操作前,先校验当前登录用户的身份。假设你用Session存储登录用户信息(PHP项目通用做法),比如$_SESSION['logged_user']包含当前用户的id和type字段。
场景1:仅允许指定ID的用户访问
如果只开放给几个特定用户(比如超级管理员),可以定义允许的ID列表,然后判断当前用户ID是否在列表内:
// 定义允许访问的用户ID集合 $allowed_ids = [1, 4, 6]; $current_user_id = $_SESSION['logged_user']['id']; // 权限校验 if (!in_array($current_user_id, $allowed_ids)) { echo "你没有权限访问此页面"; exit; // 终止后续代码执行 } // 有权限才执行查询 $users = $conn->query("SELECT * FROM `users`");
场景2:结合用户类型+指定ID
如果需要开放给所有管理员(type=1),再额外允许几个特定普通用户,可以这样做:
$current_user = $_SESSION['logged_user']; $allowed_extra_ids = [3, 7]; // 额外允许的普通用户ID // 校验:管理员 或 在指定ID列表内 if ($current_user['type'] != 1 && !in_array($current_user['id'], $allowed_extra_ids)) { echo "权限不足,无法访问"; exit; } // 执行查询 $users = $conn->query("SELECT * FROM `users`");
2. 按需筛选用户列表(可选)
如果不仅要限制访问,还要让用户只能看到指定ID的用户数据(比如自己的信息),可以在SQL查询中直接加id条件,注意一定要用预处理语句防止SQL注入:
$current_user_id = $_SESSION['logged_user']['id']; // 预处理查询,避免注入风险 $stmt = $conn->prepare("SELECT * FROM `users` WHERE id = ?"); $stmt->bind_param("i", $current_user_id); // "i"表示参数为整数类型 $stmt->execute(); $user_data = $stmt->get_result()->fetch_assoc();
注意事项
- 务必确保Session的安全性:开启
httponly和secure属性,防止前端篡改Session数据。 - 你的原代码中两次执行相同的
SELECT * from users where type = 3查询,属于冗余操作,建议合并或按需调整。
内容的提问来源于stack exchange,提问作者Donald
相关产品推荐
相关产品推荐

