CodeIgniter中通过AJAX加载指定登录用户专属视图数据的方法
问题根因
模型层查询kpi_result表时未绑定当前登录用户的唯一标识做过滤,默认返回全表数据,导致不同账号访问时加载完全相同的内容。
前置校验:确认kpi_result表已设置关联用户的字段(通用命名为user_id),若未添加需先调整表结构,且新增、编辑KPI数据时必须同步写入当前操作人的用户ID,否则过滤逻辑无法生效。
修复方案
1. 确认登录态可用
先确认用户登录成功后,已将用户ID存入CodeIgniter的Session中,即登录逻辑中存在类似如下代码:
// 登录验证通过后执行,存储当前登录用户ID $this->session->set_userdata('user_id', $verified_user['id']);
后续所有业务逻辑都从服务端Session取用户ID,禁止从前端AJAX参数传递用户ID,避免用户篡改参数越权访问他人数据。
2. 调整控制器代码
控制器中先获取当前登录用户ID,校验登录状态后将用户ID传入模型查询方法,修改后代码如下:
public function loaddatatest() { // 从服务端session获取当前登录用户ID $current_user_id = $this->session->userdata('user_id'); // 未登录直接返回空数据,可根据业务需求调整为跳转登录页 if (empty($current_user_id)) { echo json_encode([]); return; } // 传入用户ID到模型查询方法 $data = $this->Kpi_model->loaddatatest($current_user_id); echo json_encode($data ?: []); }
3. 调整模型查询逻辑
模型方法接收用户ID参数,查询时增加WHERE条件过滤专属数据,同时修正原代码中排序关键字的拼写错误(原代码写的ASCE为无效关键字,升序正确写法为ASC),修改后代码如下:
/** * 查询指定用户的KPI数据 * @param int $user_id 当前登录用户ID * @return array */ public function loaddatatest(int $user_id) { // 增加用户维度过滤条件,若你的表中用户关联字段不是user_id,请替换为实际字段名 $this->db->where('user_id', $user_id); $this->db->order_by('id', 'ASC'); $query = $this->db->get('kpi_result'); return $query->num_rows() > 0 ? $query->result() : []; }
4. 配套补全其他操作的权限校验
你当前代码中包含KPI新增、删除的交互逻辑,这类写操作接口也需要同步做两层校验:
- 新增KPI数据写入表时,必须带上当前登录用户的
user_id - 编辑、删除KPI时,需要先根据传入的数据ID查询对应记录,校验记录关联的
user_id和当前登录用户ID一致,才允许执行修改/删除操作,防止越权。
补充说明
视图层的AJAX请求逻辑无需额外修改,后端过滤逻辑生效后,接口会自动返回当前登录用户的专属数据,前端直接渲染即可。
内容的提问来源于stack exchange,提问作者helloimriz
相关产品推荐
相关产品推荐

