CodeIgniter复制数据库表行插入同表报SQL语法错误的解决方法
CodeIgniter 同表复制指定行数据报错修复方案
问题场景
基于CodeIgniter搭建的站点需要将tbl_invoices表中指定ID的业务行复制后插入同一张表,原实现代码如下:
$id = $this->uri->segment(3); $details = $this->db->where("id", $id)->get('tbl_invoices'); foreach ($details->result() as $row) { $this->db->insert('tbl_invoices',$row); }
执行后抛出如下错误:
SQL语法错误;请对照你使用的MariaDB服务器版本对应手册,检查
0) VALUES (Array)附近的语法是否正确,第1行实际生成的SQL为:INSERT INTO tbl_invoices (0) VALUES (Array)
报错原因
代码存在两个核心问题:
- 调用查询结果的
result()方法返回的是stdClass对象集合,并非CodeIgniter的insert()方法要求的关联数组格式,框架无法正确解析对象属性映射为表字段和对应值,最终生成了语法错误的SQL语句。 - 查询返回的结果自带原行的主键
id值,直接插入会触发主键唯一约束冲突,就算格式解析正确,也会因为主键重复导致插入失败。
正确实现代码
按主键ID查询本身只会返回1条记录,不需要写循环,直接用row_array()获取关联数组格式的单条结果,移除主键字段后执行插入即可:
$id = $this->uri->segment(3); // 查询指定ID的记录,直接返回关联数组格式结果 $invoice = $this->db->where('id', $id)->get('tbl_invoices')->row_array(); // 移除主键ID,插入时数据库会自动为新记录生成新的自增主键 unset($invoice['id']); // 按需处理时间类字段,示例如下 // $invoice['create_time'] = date('Y-m-d H:i:s'); // $invoice['update_time'] = date('Y-m-d H:i:s'); // 执行插入 $this->db->insert('tbl_invoices', $invoice);
如果业务场景中同一个查询条件会返回多条记录需要批量复制,就用result_array()获取全部结果的关联数组集合,循环时逐行移除主键后插入:
$id = $this->uri->segment(3); $invoice_list = $this->db->where('id', $id)->get('tbl_invoices')->result_array(); foreach ($invoice_list as $row) { unset($row['id']); // 按需更新时间等字段 $this->db->insert('tbl_invoices', $row); }
内容的提问来源于stack exchange,提问作者ZNO
相关产品推荐
相关产品推荐

