PHP点餐系统实现管理员仅可操作自有菜品的权限控制方案
餐饮点餐系统菜品数据权限隔离实现方案
具体实现步骤
第一步:修改数据库表结构
打开phpMyAdmin,对菜品表tbl_food执行如下SQL,新增字段存储上传菜品的管理员ID:ALTER TABLE `tbl_food` ADD COLUMN `admin_id` INT NOT NULL DEFAULT 0 COMMENT '菜品所属管理员ID' AFTER `id`;如果你的管理员表主键不是INT类型,对应调整这个字段的类型即可。
第二步:修改菜品新增逻辑
打开add-food.php文件,在插入菜品数据的逻辑里,把当前登录管理员的ID一并写入admin_id字段。
正常管理员登录成功后,ID会存在Session中,一般键名为$_SESSION['admin_id'](如果你的项目里键名不同自行替换),调整插入SQL如下:// 获取当前登录管理员ID $admin_id = $_SESSION['admin_id']; // 插入SQL新增admin_id字段赋值,和你原有参数保持一致即可 $sql = "INSERT INTO tbl_food SET title = '$title', price = '$price', image_name = '$image_name', featured = '$featured', active = '$active', admin_id = '$admin_id' ";第三步:修改菜品列表查询逻辑(即你提供的manage-food.php页面)
找到原代码中查询全量菜品的SQL语句,增加管理员ID过滤条件,只查询当前管理员自己上传的菜品:// 原有SQL:$sql = "SELECT * FROM tbl_food"; // 替换为以下代码 $current_admin_id = $_SESSION['admin_id']; $sql = "SELECT * FROM tbl_food WHERE admin_id = $current_admin_id";第四步:给更新、删除接口增加权限校验
仅做列表过滤无法防止用户手动修改URL参数操作他人菜品,必须在update-food.php、delete-food.php两个文件的业务逻辑最开头增加校验:- 获取URL传入的菜品ID
- 查询该菜品对应的所属管理员ID
- 和当前登录管理员的Session ID比对,不一致就返回无权限提示,跳转回菜品列表页
参考校验代码:
// 获取传入的菜品ID $food_id = intval($_GET['id']); $current_admin_id = $_SESSION['admin_id']; // 查询菜品归属 $check_sql = "SELECT admin_id FROM tbl_food WHERE id = $food_id"; $check_res = mysqli_query($conn, $check_sql); $food_row = mysqli_fetch_assoc($check_res); // 归属不匹配直接拦截 if($food_row['admin_id'] != $current_admin_id){ $_SESSION['unauthorize'] = "<div class='error'>无权操作其他管理员上传的菜品</div>"; header('location:'.SITEURL.'admin/manage-food.php'); exit(); } // 校验通过后再执行原有的更新/删除逻辑第五步:处理历史数据
上线前如果表中已有历史菜品数据,手动在phpMyAdmin中给这些数据的admin_id字段绑定对应管理员ID即可,不需要保留历史数据的话可以直接清空表内旧数据。
现有页面效果

内容的提问来源于stack exchange,提问作者Mathew Garry Karrington
相关产品推荐
相关产品推荐

