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

Codeigniter 3工单系统更新状态时报主键重复错误求助

问题分析与解决方法

错误原因

你遇到的Duplicate entry '2' for key 'PRIMARY'错误,核心原因是Codeigniter 3的update方法使用不当:

  • 你将主键id直接放入了待更新的$data数组,但未指定WHERE条件。
  • 这会让框架试图把tickets表中所有行的id修改为传入的ticket_id值,而主键是唯一约束,当表中已有其他行存在时,必然触发重复主键的冲突错误。

修正后的代码

调整更新工单状态的逻辑,把id从更新数据中移除,改用where()方法精准定位要修改的工单:

/*** Reply Ticket Post */
public function admin_reply_ticket_post()
{

    /// Admin Authority Checkup Getting Started
    adminCheck();
    // Admin Authority Check End
    
    $data = array(
        'ticket_id' => $this->input->post('ticket_id'),
        'admin_id' => $this->session->userdata('adminid'),
        'first_name' => $this->session->userdata('first_name'),
        'last_name' => $this->session->userdata('last_name'),
        'message' => $this->input->post('message')
    );

    $this->db->insert('tickets_sub', $data);

    // Make Ticket Status "in the transaction"
    $data = array(
        'status' => 1 
    );
    $this->db->where('id', $this->input->post('ticket_id'));
    $this->db->update('tickets', $data);

}

额外优化建议

  • 开启数据库事务,避免insert成功但update失败的不一致情况:
    $this->db->trans_start();
    $this->db->insert('tickets_sub', $data);
    
    $update_data = array('status' => 1);
    $this->db->where('id', $this->input->post('ticket_id'));
    $this->db->update('tickets', $update_data);
    
    $this->db->trans_complete();
    
    if ($this->db->trans_status() === FALSE) {
        // 事务失败的处理逻辑,比如回滚后提示用户
    }
    
  • 增加ticket_id合法性校验,先查询该工单是否存在,避免无效更新操作。

内容的提问来源于stack exchange,提问作者Codeigniter Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:55:20