You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:15:01