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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:21:50