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
相关产品推荐
相关产品推荐

