为啥我不能通过取消选中 CodeIgniter 中的复选框来更改数据库中的数据?

Posted

技术标签:

【中文标题】为啥我不能通过取消选中 CodeIgniter 中的复选框来更改数据库中的数据?【英文标题】:Why I can't change data in database by unchecking checkboxes in CodeIgniter?为什么我不能通过取消选中 CodeIgniter 中的复选框来更改数据库中的数据? 【发布时间】:2015-10-13 05:07:56 【问题描述】:

所以我从这个网站得到了这个简单的论坛项目:

CIBB Basic Forum with Codeigniter

但是我在用复选框解决这一问题时遇到了问题。问题来自网站的原始代码。而且我现在快 2 天都无法解决问题。

问题很简单,当我想为某个角色(管理员、编辑器等)添加权限时,我可以选中一些复选框来做到这一点。如果我想添加权限,它工作得很好,但我不能删除我已经添加到角色中的每一个权限。代码如下:

控制器

 public function role_edit($role_id)

    if ($this->session->userdata('role_edit') == 0) 
        redirect('admin');
    
    if ($this->input->post('btn-edit')) 
        $this->admin_model->role_edit();
        if ($this->admin_model->error_count != 0)                 
            $this->data['error'] = $this->admin_model->error;
         else 
            $this->session->set_userdata('tmp_success', 1);
            redirect('admin/role_edit/'.$role_id);
        
    
    $tmp_success = $this->session->userdata('tmp_success');
    if ($tmp_success != NULL) 
        // role updated
        $this->session->unset_userdata('tmp_success');
        $this->data['tmp_success'] = 1;
    
    $this->data['role'] = $this->db->get_where(TBL_ROLES, array('id' => $role_id))->row();
    $this->data['title']   = 'Admin Role Edit :: '.CIBB_TITLE;
    $this->load->view('header', $this->data);
    $this->load->view('admin/sidebar');
    $this->load->view('admin/role_edit');
    $this->load->view('footer');

型号

public function role_edit()

    $row = $this->input->post('row');

    // check role name
    if (strlen($row['role']) == 0) 
        $this->error['role'] = 'Role name cannot be empty';
     else 
        if ($row['role'] != $row['role_c']) 
            $role_check = $this->db->get_where(TBL_ROLES, array('role' => $row['role']));
            if ($role_check->num_rows() > 0) 
                $this->error['role'] = 'Role name "'.$row['role'].'" already in use';
            
        
    

    // check roles
    if (!isset($row['roles'])) 
        $this->error['roles'] = 'Choose minimum 1 role';
    

    if (count($this->error) == 0) 
        unset($row['role_c']);

        // reset row value
        $row_reset = $row['roles'];
        foreach ($row_reset as $key => $value) 
            $row_reset[$key] = 0;
        

        $this->db->where('id', $row['id']);
        $this->db->update(TBL_ROLES, $row_reset);

        // update role
        $data = array();
        $data['role'] = $row['role'];
        foreach ($row['roles'] as $key => $value) 
            $data[$key] = 1;
        
        $this->db->where('id', $row['id']);
        $this->db->update(TBL_ROLES, $data);
     else 
        $this->error_count = count($this->error);
    

观看次数

<div class="span10">  
<div class="page-header">
    <h1>Edit Role</h1>
</div>
<form class="form-horizontal" action="" method="post">
    <?php if (isset($tmp_success)): ?>
    <div class="alert alert-success">
        <a class="close" data-dismiss="alert" href="#">&times;</a>
        <h4 class="alert-heading">Role updated!</h4>
    </div>
    <?php endif; ?>

    <?php if (isset($error)): ?>
    <div class="alert alert-error">
        <a class="close" data-dismiss="alert" href="#">&times;</a>
        <h4 class="alert-heading">Error!</h4>
        <?php if (isset($error['role'])): ?>
            <div>- <?php echo $error['role']; ?></div>
        <?php endif; ?>
        <?php if (isset($error['roles'])): ?>
            <div>- <?php echo $error['roles']; ?></div>
        <?php endif; ?>

    </div>
    <?php endif; ?>
    <fieldset>
      <input type="hidden" name="row[id]" value="<?php echo $role->id; ?>"/>
      <input type="hidden" name="row[role_c]" value="<?php echo $role->role; ?>"/>
      <div class="control-group">
        <label class="control-label" for="input01">Role Name</label>
        <div class="controls">
          <input class="input-xlarge" id="role-name" value="<?php echo $role->role; ?>" name="row[role]" type="text">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="input01"></label>
        <div class="controls">
            <p class="help-block"><strong>Note:</strong> pick at least one role function below</p>
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="optionsCheckbox"><b>Admin</b></label>
        <div class="controls">
          <label class="checkbox inline">
            <input id="cb_thread_create" name="row[roles][admin_area]" <?php if ( $role->admin_area == 1 ): ?>checked<?php endif; ?> type="checkbox"> access area 
          </label>
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="optionsCheckbox"><b>Thread</b></label>
        <div class="controls">
          <label class="checkbox inline">
            <input id="cb_thread_create" name="row[roles][thread_create]" <?php if ( $role->thread_create == 1 ): ?>checked<?php endif; ?> type="checkbox"> create 
          </label>
          <label class="checkbox inline">
            <input id="cb_thread_edit" name="row[roles][thread_edit]" <?php if ( $role->thread_edit == 1 ): ?>checked<?php endif; ?> type="checkbox"> edit 
          </label>
          <label class="checkbox inline">
            <input id="cb_thread_delete" name="row[roles][thread_delete]" <?php if ( $role->thread_delete == 1 ): ?>checked<?php endif; ?> type="checkbox"> delete 
          </label>
        </div>
      </div>

      <div class="control-group">
        <label class="control-label" for="optionsCheckbox"><b>Post</b></label>
        <div class="controls">
          <label class="checkbox inline">
            <input id="cb_post_create" name="row[roles][post_create]" <?php if ( $role->post_create == 1 ): ?>checked<?php endif; ?> type="checkbox"> create 
          </label>
          <label class="checkbox inline">
            <input id="cb_post_edit" name="row[roles][post_edit]" <?php if ( $role->post_edit == 1 ): ?>checked<?php endif; ?> type="checkbox"> edit 
          </label>
          <label class="checkbox inline">
            <input id="cb_post_delete" name="row[roles][post_delete]" <?php if ( $role->post_delete == 1 ): ?>checked<?php endif; ?> type="checkbox"> delete 
          </label>
        </div>
      </div>

      <div class="control-group">
        <label class="control-label" for="optionsCheckbox"><b>Role</b></label>
        <div class="controls">
          <label class="checkbox inline">
            <input id="cb_post_create" name="row[roles][role_create]" <?php if ( $role->role_create == 1 ): ?>checked<?php endif; ?> type="checkbox"> create 
          </label>
          <label class="checkbox inline">
            <input id="cb_post_edit" name="row[roles][role_edit]" <?php if ( $role->role_edit == 1 ): ?>checked<?php endif; ?> type="checkbox"> edit 
          </label>
            <label class="checkbox inline">
            <input id="cb_post_delete" name="row[roles][role_delete]" <?php if ( $role->role_delete == 1 ): ?>checked<?php endif; ?> type="checkbox"> delete 
          </label>
      </div>

      <div class="form-actions">
        <input type="submit" name="btn-edit" class="btn btn-primary" value="Save Role"/>
      </div>
    </fieldset>
  </form>

我的问题:

    为什么取消选中复选框不会更改数据库中的数据? 我看了一篇关于类似问题的文章,根据这篇文章我可以用 Ajax 解决这个问题,是真的吗?怎么样? 如果我可以添加但不能删除它,我怀疑可能是原始编码器写了错误的更新语句,对吗?为什么?

【问题讨论】:

可能您需要使用$this-&gt;db-&gt;delete(TBL_ROLES, $row_reset); 删除未选择的角色 【参考方案1】:

在检查您的代码以更新角色后,我非常确定这是由于以下代码造成的。

    $row_reset = $row['roles'];
    foreach ($row_reset as $key => $value) 
        $row_reset[$key] = 0;
    

    $this->db->where('id', $row['id']);
    $this->db->update(TBL_ROLES, $row_reset);

这里所有角色子列都重置为零,但是如果您没有选中复选框,它将不会关联 row['roles'] 帖子字段,因此 $row['roles'] 将是一个数组选中的复选框,因此它不会正确更新。要解决这个问题。让我给你解决方案。

     $row_reset = $row['roles'];

将此行替换为以下数组。

    $row_reset = array('admin_area','thread_create','thread_edit','thread_delete','post_create','post_edit','post_delete','role_create','role_edit','role_delete');

【讨论】:

以上是关于为啥我不能通过取消选中 CodeIgniter 中的复选框来更改数据库中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我取消选中内容布局指南后通过了自动布局检查

为啥在单击“全选”按钮后,复选框会被选中,然后又被取消选中?

js怎么实现,选中添加,不选中就取消刚才添加的数据,但是不能取消其他选中的数据

为啥我不能在“foreach”循环中取消设置变量?

为啥我通过 jquery ajax 和 codeigniter 得到验证错误?

微信小程序 单选框选中之后为啥取消不了