CodeIgniter实现复选框批量删除记录报404错误咨询
CodeIgniter 复选框批量删除返回404排查修复方案
核心问题1:请求路径写死导致路由匹配失败
这是90%同类报错的原因:你视图中删除按钮写的data-url="/itemDelete",开头的前导斜杠代表请求站点根路径,如果你项目部署在子目录(比如本地访问地址是http://localhost/ci_project/item),这个路径会直接请求http://localhost/itemDelete,完全跳过你的项目目录,必然返回404。
修复步骤:
- 打开Item控制器,在构造方法中加载url辅助函数,修改后构造方法代码如下:
public function __construct() { parent::__construct(); $this->load->database(); $this->load->helper('url'); }
- 打开
application/config/config.php,找到$config['base_url']项,配置为你项目的实际访问根地址,末尾加斜杠,例如本地部署在ci_demo目录下就写:
$config['base_url'] = 'http://localhost/ci_demo/';
- 修改视图里的删除按钮,用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规范
- 检查控制器文件名大小写:线上服务器大多是Linux系统,对大小写敏感,你的控制器文件必须命名为
application/controllers/Item.php,首字母大写,类名class Item extends CI_Controller也要和文件名一致,不能写成item.php。 - 修正控制器里的拼写错误:你贴的代码里入口判断行写错了单词,
No direct dcript not allowed里的dcript应为script,修正为:
defined('BASEPATH') OR exit('No direct script access allowed');
- 检查路由顺序:打开
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修复
你现有代码里还有两个逻辑问题,一并修复避免后续报错:
- 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
相关产品推荐
相关产品推荐

