
本文讲解如何修复 CodeIgniter 中因多余空格导致 URL 编码出现 %20 的问题,通过正确拼接 site_url() 与动态 ID,生成干净、可路由的编辑链接。
本文讲解如何修复 codeigniter 中因多余空格导致 url 编码出现 `%20` 的问题,通过正确拼接 `site_url()` 与动态 id,生成干净、可路由的编辑链接。
在使用 CodeIgniter 构建 CRUD 应用时,常需为每条数据行生成「编辑」链接,例如跳转到 CrudController/edit/1。但若链接拼接不当(如在 PHP 输出中混入不可见空格),浏览器会将空格自动编码为 %20,导致 URL 变为 .../edit/%201,从而无法被路由正确识别。
根本原因分析
问题源于原始代码中的空格:
<td>
<a href="<?php%20echo%20site_url('CrudController/edit');%20?>/%20<?php%20echo%20%24row->id%20?>">Edit</a> | Delete </td>
注意 /
正确写法(推荐)
直接在 PHP 字符串内拼接,避免标签内外切换引入意外空白:
<td>
<a href="<?php%20echo%20site_url('CrudController/edit')%20.%20'/'%20.%20%24row->id;%20?>">Edit</a> | Delete</td>
✅ 优势:
- 无额外空格,URL 干净(如 /index.php/CrudController/edit/1);
- 更易读、更安全,避免因格式缩进引发的隐式空格;
- 符合 CodeIgniter 路由规范,确保 edit($id) 方法能正确接收参数。
控制器需同步支持 ID 参数
当前控制器方法未接收 ID,需补充逻辑以加载对应数据:
public function edit($id = null) {
if (!$id || !is_numeric($id)) {
show_404();
}
$this->load->model('CrudModel');
$data['record'] = $this->CrudModel->get_by_id($id);
$this->load->view('crudEdit', $data);
}
⚠️ 注意事项:
- 确保路由配置允许 edit/(:num) 形式(CodeIgniter 3 默认支持);
- 建议对 $row->id 进行非空和类型校验(如 isset($row->id) && is_numeric($row->id)),防止 XSS 或路由异常;
- 若使用 CodeIgniter 4,请改用 url_to('CrudController::edit', $row->id) 替代 site_url()。
通过消除冗余空格、统一字符串拼接方式,并完善控制器参数处理,即可稳定生成并响应带 ID 的编辑链接。











