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

CodeIgniter实现复选框批量删除记录报404错误咨询

CodeIgniter 复选框批量删除返回404排查修复方案

核心问题1:请求路径写死导致路由匹配失败

这是90%同类报错的原因:你视图中删除按钮写的data-url="/itemDelete",开头的前导斜杠代表请求站点根路径,如果你项目部署在子目录(比如本地访问地址是http://localhost/ci_project/item),这个路径会直接请求http://localhost/itemDelete,完全跳过你的项目目录,必然返回404。
修复步骤:

  1. 打开Item控制器,在构造方法中加载url辅助函数,修改后构造方法代码如下:
public function __construct()
{
    parent::__construct();
    $this->load->database();
    $this->load->helper('url');
}
  1. 打开application/config/config.php,找到$config['base_url']项,配置为你项目的实际访问根地址,末尾加斜杠,例如本地部署在ci_demo目录下就写:
$config['base_url'] = 'http://localhost/ci_demo/';
  1. 修改视图里的删除按钮,用CI自带的site_url()函数生成正确的请求路径,替换原来硬编码的路径:
<button style="margin-bottom: 10px" class="btn btn-primary delete_all" data-url="<?php echo site_url('itemDelete');?>">删除选中项</button>

如果暂时不想改配置,也可以直接把data-url="/itemDelete"的前导斜杠去掉,写成data-url="itemDelete",但优先用site_url()生成路径,适配线上线下不同部署环境。

核心问题2:控制器或路由配置不符合CI规范

  1. 检查控制器文件名大小写:线上服务器大多是Linux系统,对大小写敏感,你的控制器文件必须命名为application/controllers/Item.php,首字母大写,类名class Item extends CI_Controller也要和文件名一致,不能写成item.php。
  2. 修正控制器里的拼写错误:你贴的代码里入口判断行写错了单词,No direct dcript not allowed里的dcript应为script,修正为:
defined('BASEPATH') OR exit('No direct script access allowed');
  1. 检查路由顺序:打开application/config/routes.php,确认你添加的$route['itemDelete']['post'] = "item/deleteAll";规则放在所有通配符路由(比如$route['(:any)']这类规则)的前面,CI路由是从上到下匹配的,通配符规则放前面会直接拦截请求导致404。

核心问题3:Web服务器重写规则配置错误

如果你配置了隐藏index.php,错误的重写规则会导致POST请求无法正确转发到CI入口文件,直接返回404:

  • Apache环境:确认项目根目录有.htaccess文件,规则如下:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

同时确认Apache配置里开启了rewrite模块,站点目录配置允许.htaccess生效。

  • Nginx环境:确认站点配置中添加了PATH_INFO转发规则,把不存在的路径统一转给index.php处理,否则Nginx会直接找itemDelete实体文件,找不到就返回404。

额外逻辑bug修复

你现有代码里还有两个逻辑问题,一并修复避免后续报错:

  1. JS代码里把删除表格行的逻辑写在了AJAX请求外面,点击确认后不管请求是否成功都会执行,而且你给tr标签没加data-row-id属性,这段代码本身不生效,直接删掉AJAX请求后面的这段代码即可:
// 删掉这段无效逻辑
$.each(allVals, function(index, value) {
    $('table tr').filter("[data-row-id='" + value + "']").remove();
});

删除行的逻辑已经在AJAX的success回调里写了,不需要重复加。
2. 控制器的deleteAll方法增加参数校验,避免空请求报错:

public function deleteAll(){
    $ids = $this->input->post('ids');
    if(empty($ids)){
        echo json_encode(['error'=>"请选择要删除的记录"]);
        return;
    }
    $idArr = array_filter(explode(",", $ids));
    if(empty($idArr)){
        echo json_encode(['error'=>"参数错误"]);
        return;
    }
    $this->db->where_in('id', $idArr);
    $this->db->delete('items');
    echo json_encode(['success'=>"记录删除成功"]);
}

内容的提问来源于stack exchange,提问作者Shubham Bhattaniya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:30:45