我在Codeigniter更新上读过类似的问题和答案,但无法解决我的问题。
我有一个用户表和一个用户角色表。用户表具有userid、名称、地址等信息,user_role表具有userid和role_id,其中role_id s是Entry、Edit、View等角色的id。
现在,管理员可以更改用户的角色并更新用户信息。角色显示为复选框。为了更新用户的角色,我删除了user_role表中该用户的所有行,并插入了新的角色。我试过这个:
if(!empty($_POST['role'])) {
$this->db->where('user_id', $id);
$this->db->delete('user_role');
foreach ($_POST['role'] as $val) {
$arr['user_id'] = $id;
$arr['role_id'] = $val;
$this->db->insert('user_role', $arr);
}
}
else {
$this->db->where('user_id', $id);
$this->db->delete('user_role');
}
如果取消选中所有复选框,则删除所有行。它运行良好。但这似乎不是一种恰当的方式。请引导。
首先。$id在哪里定义??
第二。Codeigniter有一个库,不需要使用$_POST或$_GET。
第三。一个用户有必要拥有多个角色吗??我建议你使用像这样的选择
<select name="role">
<option value="user">User</option>
<option value="employee">Employee</option>
<option value="admin">Admin</option>
</select>
也许你需要在选项的值中使用角色的id。。。类似的东西
<option value="1">User</option>
<option value="2">Employee</option>
<option value="3">Admin</option>
第四。如果您想要更新。。。为什么不使用代码生成器ORM的更新方法呢。通过这种方式,我在models文件夹上创建了一个名为general_model.php的文件(你在使用这个文件夹和MVC模式吗?),在那里我在ORM和控制器之间有一个类似于门面的东西。其中一个功能是更新:
public function update($tablename, $data, $where)
{
foreach($where as $key=>$value)
$this->db->where($key, $value);
$this->db->update($tablename, $data);
if ($this->db->affected_rows() >= 0) return TRUE;
else return FALSE;
}
对于您的情况(用户只使用一个角色),控制器的使用示例可能是:
$this->general_model->update("users_role", array("role_id"=>$this->input->post("")) , array("user_id"=>$id));
我希望它能帮助你。
PS:如果你愿意,我可以给你general_model.php
if($_POST['role']){
foreach ($_POST['role'] as $val) {
$arr['user_id'] = $id;
$arr['role_id'] = $val;
// You need to run Update query. do not need to delete the records every time.
$where = array('user_id'=>$arr['user_id']);
$this->modelname->updateRecord($tablename,$arr,$where);
//It will update the records on post
}
}