codeigniter 3 中批量删除需用 where_in() 配合 delete(),并严格校验 id 合法性、控制请求方式;避免路由方法限制错误和未清洗 id 导致的安全问题,推荐结合事务与日志保障数据一致性。

在 CodeIgniter 3 中,用数组批量删除数据库记录非常直接,核心就是 $this->db->where_in() 配合 $this->db->delete(),但必须注意 ID 数据的合法性校验和请求方式控制,否则容易出错或被攻击。
✅ 正确写法:用 where_in + delete 删除 ID 数组
CI 框架原生支持基于 ID 数组的批量删除,无需手拼 SQL 或循环执行单条 delete:
- 控制器中接收 POST 提交的 ID 数组(如
ids[]形式) - 过滤并确保每个 ID 都是正整数(防止注入或类型错误)
- 调用
$this->db->where_in('id', $clean_ids)->delete('table_name')
示例代码:
$ids = $this->input->post('ids'); // 前端复选框 name="ids[]"
if (empty($ids) || !is_array($ids)) {
echo json_encode(['error' => '请选择要删除的记录']);
return;
}
// 安全清洗:只保留数字且转为整型
$clean_ids = array_map('intval', $ids);
$clean_ids = array_filter($clean_ids, function($id) { return $id > 0; });
$clean_ids = array_values($clean_ids); // 重排键名
if (empty($clean_ids)) {
echo json_encode(['error' => '无效的ID']);
return;
}
$this->db->where_in('id', $clean_ids);
$result = $this->db->delete('users'); // 删除 users 表中匹配的记录
echo json_encode(['success' => $result, 'deleted_count' => count($clean_ids)]);
⚠️ 必须避开的两个典型坑
很多开发者卡在这两步上,导致删不掉、报错或 404:
-
路由不能限制 HTTP 方法:CI3 不支持
$route['xxx']['post'] = 'xxx'这种写法,会直接 404;应把路径纯映射(如$route['item/deleteAll'] = 'item/deleteAll';),再在控制器里用$this->input->is_post()或$_SERVER['REQUEST_METHOD']校验 -
别信前端传来的任何 ID:不能直接用
explode(',', $ids_string)—— 如果用户篡改表单提交ids=1,2,abc,4,未经清洗就进where_in可能触发 SQL 错误甚至绕过校验。始终用array_map('intval', ...)+array_filter(... > 0)
? 前端配合要点(复选框 + 批量提交)
视图中复选框需统一 name,并加全选/反选 JS 支持:
- 每个 checkbox:
<input type="checkbox" name="ids[]" value="123"> - 全选按钮:
<input type="checkbox" id="checkall">,JS 绑定点击同步所有子项 - 提交用 form 或 AJAX;若用 AJAX,data 应为
{ids: $('input[name="ids[]"]:checked').map(function(){return this.value;}).get()}
注意:不要把 ID 拼成逗号字符串再传(如 ids=1,2,3),而应让浏览器自动按数组格式提交(ids[]=1&ids[]=2&ids[]=3),CI 的 $this->input->post('ids') 才能正确解析为 PHP 数组。
? 进阶建议:加事务与日志(生产环境推荐)
对关键业务表,建议包裹在事务中,并记录操作日志:
- 开始事务:
$this->db->trans_start(); - 执行
where_in + delete - 插入日志(如操作人、时间、删除 ID 列表)
- 提交:
$this->db->trans_complete();,失败时自动回滚
这样即使中途出错,也不会出现“删了一半”的数据不一致问题。











