为啥我不能通过取消选中 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="#">×</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="#">×</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->db->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怎么实现,选中添加,不选中就取消刚才添加的数据,但是不能取消其他选中的数据