
本文详解在 codeigniter 3 框架中,通过前端复选框选择多条数据并调用 ajax 发起 post 请求,安全高效地批量删除数据库记录的完整实现流程,含路由配置、控制器逻辑、视图渲染与常见 404 错误修复。
本文详解在 codeigniter 3 框架中,通过前端复选框选择多条数据并调用 ajax 发起 post 请求,安全高效地批量删除数据库记录的完整实现流程,含路由配置、控制器逻辑、视图渲染与常见 404 错误修复。
在 CodeIgniter 3 中实现“勾选复选框批量删除”是后台管理系统的高频需求。其核心在于前后端协同:前端收集选中项 ID,通过 AJAX 提交;后端接收并执行 WHERE IN 批量删除。但初学者常因路由定义不规范(如错误使用 $route['itemDelete']['post'])导致 404 报错——CodeIgniter 3 的路由数组语法不支持直接在键名后附加 HTTP 方法修饰符,这是本方案最关键的易错点。
✅ 正确的路由配置(修复 404 根本原因)
在 application/config/routes.php 中,应使用纯字符串映射,而非嵌套数组语法:
$route['item'] = 'item'; // GET /item → 显示列表页 $route['itemDelete'] = 'item/deleteAll'; // POST /itemDelete → 处理删除
⚠️ 注意:CodeIgniter 3 的 $route 数组不支持 $route['xxx']['post'] 这类写法,该语法仅适用于 CI4。若强行使用,框架无法识别路由,直接返回 404。
如需严格限定仅允许 POST 访问(推荐),可在控制器方法内校验请求方式,而非依赖路由层限制:
// application/controllers/Item.php
public function deleteAll()
{
// 强制校验请求方法(更可靠的安全措施)
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
show_404();
}
$ids = $this->input->post('ids');
if (empty($ids)) {
echo json_encode(['error' => 'No IDs provided']);
return;
}
// 安全过滤:确保所有 ID 均为正整数
$idArray = array_map('intval', explode(',', $ids));
$idArray = array_filter($idArray, function($id) { return $id > 0; });
if (empty($idArray)) {
echo json_encode(['error' => 'Invalid IDs']);
return;
}
// 执行批量删除
$this->db->where_in('id', $idArray);
$deletedCount = $this->db->delete('items');
echo json_encode([
'success' => true,
'message' => "Deleted {$deletedCount} item(s) successfully.",
'count' => $deletedCount
]);
}
? 前端视图关键优化(增强健壮性)
application/views/item.php 中的 JavaScript 需同步调整,避免冗余 DOM 操作,并统一错误处理:
<script type="text/javascript">
$(document).ready(function() {
// 全选/取消全选
$('#master').on('change', function() {
$('.sub_chk').prop('checked', this.checked);
});
// 批量删除按钮
$('.delete_all').on('click', function(e) {
e.preventDefault();
const selectedIds = $('.sub_chk:checked').map(function() {
return $(this).data('id');
}).get();
if (selectedIds.length === 0) {
alert('⚠️ 请至少选择一项!');
return;
}
if (!confirm(`确认删除 ${selectedIds.length} 条记录?此操作不可撤销!`)) {
return;
}
$.ajax({
url: '/itemDelete', // 确保与路由定义完全一致
type: 'POST',
data: { ids: selectedIds.join(',') },
dataType: 'json',
beforeSend: function() {
$('.delete_all').prop('disabled', true).text('删除中...');
},
success: function(res) {
if (res.success) {
// 逐行移除已删除的行(视觉反馈)
selectedIds.forEach(id => {
$('tr').has(`[data-id="${id}"]`).fadeOut(300, function() {
$(this).remove();
});
});
alert('✅ ' + res.message);
} else {
alert('❌ ' + (res.error || '删除失败,请重试'));
}
},
error: function(xhr) {
alert('❌ 请求异常:' + (xhr.responseJSON?.error || xhr.statusText));
},
complete: function() {
$('.delete_all').prop('disabled', false).text('删除所选项');
}
});
});
});
</script>
? 安全与最佳实践总结
- 输入验证必做:永远不要信任 $_POST 数据,对 ids 字符串进行 intval 转换与正整数过滤;
- CSRF 保护建议:生产环境应在表单或 AJAX 请求头中添加 CSRF Token(CodeIgniter 3 内置支持);
- 事务支持(进阶):若业务要求强一致性,可在 deleteAll() 中包裹 trans_start() / trans_complete();
- 空值防御:控制器中增加 empty($ids) 和 empty($idArray) 双重校验;
- 前端体验优化:禁用按钮防重复提交、删除动画、明确的成功/失败提示。
通过以上修正与增强,即可稳定运行批量删除功能。记住:CI3 的路由是扁平字符串映射,HTTP 方法控制请交由控制器逻辑完成——这既是解决 404 的钥匙,也是构建可维护后台的基础准则。











