codeigniter 关联数组插入数据需键名与字段名严格一致,仅支持关联数组,须避开主键和时间戳字段;推荐显式组装并类型转换,插入后检查 affected_rows 并用事务保障一致性。

CodeIgniter 中用关联数组插入数据,核心是确保键名与数据库字段名严格一致,并避开主键、时间戳等特殊字段。直接传数组最简洁,但需注意字段映射和安全过滤。
关联数组必须是 key-value 结构
CodeIgniter 的 $this->db->insert() 只接受关联数组(即形如 ['title' => 'xxx', 'price' => 199]),不能传对象、索引数组或嵌套数组。若从查询结果获取数据,需先转为数组并清理:
-
$row = $query->row(); $data = (array)$row;—— 将对象转为数组 -
unset($data['id'], $data['created_at']);—— 移除主键和自动时间字段,避免冲突 - 若主键名不是
id(如invoice_id或uuid),要对应修改 unset 键名
表单数据直接映射(字段名完全匹配时)
当 HTML 表单的 name 属性与数据库列名一一对应,且无多余字段,可直接使用 POST 全量插入:
$this->db->insert('products', $this->input->post());- CI 自动忽略空值、非法键,且默认启用 XSS 过滤(CI3)
- ⚠️ 前提:表单中不能含
name="items[]"类数组字段,否则会破坏结构
显式组装字段(推荐用于生产环境)
更可控、易维护的方式是手动构建数组,同时做类型转换和基础校验:
$data = [ 'title' => $this->input->post('title', TRUE), 'price' => (float)$this->input->post('price'), 'qty' => (int)$this->input->post('qty'), 'status' => $this->input->post('status') ?: 'draft' ];- 对数字字段强制类型转换,防止字符串注入或逻辑错误
- 对可选字段设默认值(如
?: 'draft'),避免 NULL 冲突
插入后检查与反馈
插入操作完成后应验证结果,而非仅靠返回布尔值:
if ($this->db->affected_rows() > 0) { echo "成功,新ID:" . $this->db->insert_id(); }- 失败时可用
$this->db->error()查看具体 SQL 错误(尤其在批量或事务中) - 关键业务建议包裹事务:
$this->db->trans_start(); ... $this->db->trans_complete();











