CodeIgniter角色权限模块勾选值无法插入数据库问题求助
问题排查与修复方案
1. 控制器核心逻辑错误(最主要原因)
你处理POST提交的逻辑中,$main['roles'] 仅在 form_validation->run() == FALSE 时才会初始化赋值。当你提交表单时,如果没有配置表单验证规则,或者验证规则通过,第一个if分支不会执行,$main['roles'] 是未定义状态,后续遍历角色的foreach循环根本不会执行,$loginid 始终为false,自然进入错误分支。
修复方式:在处理POST逻辑前先加载角色列表,把公共查询逻辑提到两个if分支外面:
public function permission() { // 公共查询逻辑提前 $main['permissions']=$this->users_model->get_permission_array(); $main['roles']=$this->users_model->get_roles_array(); foreach($main['roles'] as $key => $val): $main['access'][$val['roles_id']]=$this->users_model->get_access_array(array('roles_id'=>$val['roles_id'])); endforeach; if ($this->form_validation->run() == FALSE) { $main['page'] = 'crm/users/permission'; $this->load->view('crm/index', $main); } if($this->input->post()) { $loginid=false; foreach($main['roles'] as $key => $val): // 跳过禁用的超级管理员角色,避免无效处理 if($val['roles_id'] == 1) continue; if(isset($_POST['roleid'.$val['roles_id']])){ $this->users_model->clear_access(array('roles_id'=>$val['roles_id'])); foreach($_POST['roleid'.$val['roles_id']] as $id => $access): $data=array('roles_id'=>$val['roles_id'],'permissions_id'=>$access); $res = $this->users_model->permission_access($data); // 只要有一次插入成功就标记为成功,避免最后一个角色无权限时覆盖结果 if($res) $loginid = true; endforeach; } endforeach; if($loginid){ $this->session->set_flashdata('message', '<p>Permission updated Successfully.</p>'); redirect('users/permission'); } else { $this->session->set_flashdata('message', '<p>Error!! - Permission not updated.</p>'); redirect('users/permission'); } } }
2. 视图表单结构错误
你把form_open_multipart输出的form标签错误放在了div的属性位置,导致表单结构完全异常,提交的参数可能无法正常被后端接收。
修复方式:修正HTML结构:
<?php echo form_open_multipart('users/permission'); ?> <div> <table> <!-- 原有表格内容保持不变 --> </table> <div class="text-center"> <button type="submit" class="btn btn-info">Save Permission</button> <a href="<?php echo site_url('users/roles') ?>" class="btn btn-warning">Cancel</a> </div> <?php echo form_close(); ?> </div>
3. 表名不一致潜在问题
你模型中get_access_array查询的权限关联表是crm_client_role_access,但删除和插入权限用的表是crm_clients_access,确认两个表是不是同一张表,如果是表名写错要统一,否则会出现权限查询和修改不同步的问题。
4. 禁用元素提交问题
角色ID为1的checkbox加了disabled属性,这类元素的值不会随表单提交,所以超级管理员的权限不会被修改属于设计预期,但要注意如果你测试时只勾选了超级管理员的权限,后端不会收到对应参数,自然不会做修改操作,返回错误是正常的。
内容的提问来源于stack exchange,提问作者H2O
相关产品推荐
相关产品推荐

