CodeIgniter 3.1.8数据更新异常:保存时新增而非修改数据求助
解决CodeIgniter 3中数据更新时误新增记录的问题
嘿,你遇到的这个问题是CodeIgniter里更新操作变新增的典型坑——大概率是因为没给更新逻辑指定唯一的目标记录标识,或者误用了新增数据的方法。我帮你一步步梳理解决方案:
1. 给Model补上正确的更新方法
你贴的Model代码只有查询逻辑,没有专门的更新方法。首先要在Model_anggota里添加一个更新方法,核心是用**主键(比如自增ID,不建议用nama,因为可能重复)**作为WHERE条件,确保只更新指定记录:
public function update_anggota($id, $update_data) { // 用主键锁定要更新的单条记录 $this->db->where('id_anggota', $id); // 执行更新操作,第一个参数是表名,第二个是待更新的数据数组 return $this->db->update('tb_anggota', $update_data); }
注意:如果你的表主键不是id_anggota,替换成你实际的主键字段名,比如anggota_id之类的。
2. 控制器里正确传递更新参数
在处理编辑保存的控制器方法中,要先拿到待编辑记录的主键(通常从表单隐藏域或者URL参数获取),再收集表单提交的更新数据,调用上面的Model更新方法,绝对不要用insert()方法:
public function simpan_edit() { // 从表单隐藏域获取主键(表单里必须加这个隐藏域) $anggota_id = $this->input->post('id_anggota'); // 整理要更新的数据 $data = [ 'nama' => $this->input->post('nama'), 'email' => $this->input->post('email'), // 其他需要更新的字段都放这里 ]; // 调用Model的更新方法 $this->model_anggota->update_anggota($anggota_id, $data); // 更新完成后跳转回列表页或者提示成功 redirect('anggota/daftar'); }
对应的编辑表单里,一定要加一个隐藏域传递主键:
<!-- 假设你从Model拿到了待编辑的$anggota对象 --> <input type="hidden" name="id_anggota" value="<?php echo $anggota->id_anggota; ?>">
3. 排查几个常见错误点
- 别用错方法:确认你用的是
$this->db->update()而不是$this->db->insert()——后者是新增数据的,用错了肯定会加新记录。 - WHERE条件要精准:如果WHERE条件匹配不到任何记录,CodeIgniter不会报错,但也不会更新数据;如果你的逻辑里后续又执行了
insert(),就会触发新增。所以一定要用主键这种唯一标识当条件。 - 主键值不能为空:检查表单是否正确传递了主键值,如果主键是空的,WHERE条件无效,更新操作等于没执行,若代码里有兜底的新增逻辑就会出问题。
- 优化查询方法:你现有的
getdata($key)是按nama查询,万一有同名用户会拿到多条记录,建议改成按主键查询:public function getdata_by_id($id) { $this->db->where('id_anggota', $id); // 返回单条记录对象 return $this->db->get('tb_anggota')->row(); }
只要把这些点都落实,更新操作就只会修改指定的那条记录,不会再新增啦。
内容的提问来源于stack exchange,提问作者Aditya Nanda
相关产品推荐
相关产品推荐

