CodeIgniter 3 的 insert() 接收表名和关联数组,要求字段名与数据库严格匹配,成功返回 TRUE,ID 需调用 insert_id() 获取;CI4 改为模型或 Query Builder 链式调用,不支持批量插入,需用 insertBatch()。

CodeIgniter 3 的 insert() 基本写法
直接调用 $this->db->insert() 即可,它会自动拼接 INSERT INTO 语句并执行。关键不是“怎么写”,而是数据格式和表名是否匹配。
- 第一个参数是表名(字符串),必须和数据库中真实表名一致,区分大小写(尤其在 Linux 环境)
- 第二个参数是关联数组,键名必须是字段名(不能多、不能少、不能拼错),值按字段类型传(如
int字段别传字符串"123") - 成功返回
TRUE,失败返回FALSE;不返回插入的 ID —— 要 ID 得用$this->db->insert_id()
示例:
$data = [
'title' => '新文章',
'content' => '正文内容',
'status' => 1,
'created_at' => date('Y-m-d H:i:s')
];
$this->db->insert('posts', $data);
$id = $this->db->insert_id(); // 获取刚插入的主键
为什么 insert() 执行后查不到数据?
常见原因不是语法错,而是事务未提交或字段约束拦截。CodeIgniter 默认关闭事务,但如果你手动开启了 $this->db->trans_start() 却没调 trans_complete(),数据就卡在事务里。
- 检查是否有未闭合的事务块,尤其是封装在模型方法里时容易遗漏
$this->db->trans_complete() - 字段有
NOT NULL但没传值,或UNIQUE冲突(比如重复插入相同邮箱),insert()会静默失败(FALSE),需配合$this->db->error()查看具体报错 - 表名或字段名用了 MySQL 保留字(如
order、group),CodeIgniter 不自动加反引号,得手动处理或改字段名
调试建议:
if (!$this->db->insert('users', $data)) {
var_dump($this->db->error()); // 输出真实错误,比如 "Duplicate entry 'xxx' for key 'email'"
}
CodeIgniter 4 的 insert() 完全不一样
CI4 没有全局 $this->db->insert() 方法,它用实体(Entity)+ 模型(Model)驱动,或者直接用 Query Builder 的 insert(),但调用方式和参数结构都变了。
- 若用原生 Query Builder:
$this->db->table('users')->insert($data),注意这里insert()是链式方法,返回布尔值 - 若用扩展模型(如
MyUserModel extends UserModel),应调用$model->insert($data),它会自动处理时间戳、加密等逻辑 - CI4 的
insert()不再支持批量插入(CI3 支持数组数组),批量得用insertBatch()
CI4 示例(Query Builder):
$builder = $this->db->table('posts');
$result = $builder->insert([
'title' => 'CI4 新文章',
'slug' => 'ci4-xin-wen',
'created_at' => date('Y-m-d H:i:s')
]);
容易被忽略的默认行为:自动过滤与转义
insert() 默认会对所有值做转义(escape),防止 SQL 注入,这是好事,但也会带来副作用——比如你传入的是已加密的哈希值(含 $ 符号)、JSON 字符串、或需要原样存入的 HTML 片段,可能被意外修改。
- 如果确定某字段内容安全且需原样写入,可用
set()+insert()组合绕过自动转义:$this->db->set('raw_html', $html, FALSE)->insert('pages'),第三个参数FALSE关闭转义 - 时间字段如
created_at如果设为CURRENT_TIMESTAMP,别传 PHP 时间字符串,改用$this->db->set('created_at', 'CURRENT_TIMESTAMP', FALSE) - CI3 中
insert()不触发模型的before_insert回调(除非你用的是Model::insert()),这点常被误以为“钩子没生效”
真正要稳,别只盯着函数怎么写,先确认你在用 CI3 还是 CI4,再看数据来源是否干净、字段定义是否匹配、有没有隐式事务或约束挡路。


















