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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:01:13