用户级别更新异常:目标用户与实际变更用户不匹配
解决CodeIgniter后台用户级别更新错误问题
问题根源
当前操作仅传递level参数,控制器通过level查询用户执行更新——这是错误逻辑:多个用户可能拥有相同级别,必然导致更新对象匹配错误。必须通过用户ID或用户名这类唯一标识定位目标用户。
修复步骤
1. 修改视图层:传递用户唯一标识
无论是链接跳转还是表单提交,必须携带目标用户的user_id或username参数:
- 链接方式示例:
<!-- 假设用户数据存储在$user变量中 --> <a href="<?= site_url('admin/updateLevel?user_id=' . $user['id'] . '&level=editor') ?>">设为编辑</a> <a href="<?= site_url('admin/updateLevel?user_id=' . $user['id'] . '&level=admin') ?>">设为管理员</a>
- 表单方式示例:
<form action="<?= site_url('admin/updateLevel') ?>" method="post"> <input type="hidden" name="user_id" value="<?= $user['id'] ?>"> <select name="level"> <option value="user">普通用户</option> <option value="editor">编辑</option> <option value="admin">管理员</option> </select> <button type="submit">更新级别</button> </form>
2. 修正控制器的updateLevel方法
接收用户唯一标识参数,以此定位用户后再更新级别,禁止用level作为查询条件:
public function updateLevel() { // 接收参数(优先用user_id,也可替换为username) $user_id = $this->input->get('user_id') ?? $this->input->post('user_id'); $new_level = $this->input->get('level') ?? $this->input->post('level'); // 参数校验 if (!$user_id || !$new_level) { $this->session->set_flashdata('error', '参数错误'); redirect('admin/userList'); return; } // 调用模型执行更新 $update_result = $this->user_model->update_user_level($user_id, $new_level); $this->session->set_flashdata( $update_result ? 'success' : 'error', $update_result ? '用户级别更新成功' : '更新失败,请重试' ); redirect('admin/userList'); }
3. 模型层实现精准更新逻辑
在User_model中添加专用更新方法,通过唯一标识锁定目标用户:
public function update_user_level($user_id, $new_level) { $data = ['level' => $new_level]; // 用user_id作为查询条件,确保仅更新目标用户 $this->db->where('id', $user_id); return $this->db->update('users', $data); }
若使用username作为标识,只需将where条件改为$this->db->where('username', $username)即可。
额外提示
- 始终用唯一标识(如自增ID)定位数据库记录,避免使用级别、昵称等可能重复的字段。
- 增加权限校验:确保当前登录用户拥有修改其他用户级别的权限,防止越权操作。
内容的提问来源于stack exchange,提问作者triahmad maulana
相关产品推荐
相关产品推荐

