应使用 $this->input->get('status') 获取url查询参数,它自动处理空值、类型安全和xss过滤;模型中禁止调用该方法,须由控制器获取后传入,uri路径段则用 $this->uri->segment()。

直接用 $this->input->get() 拿 URL 参数,别绕路
CodeIgniter 里获取 ?status=active&source=google 这类参数,最稳妥的方式就是控制器里调用 $this->input->get('status')。它自动处理了空值、类型安全和 XSS 过滤(默认开启),比手动解析 $_GET 或 parse_url() 更可靠。
常见错误是把这行代码写进模型——模型不该接触请求输入,这是违反 MVC 分层的硬伤,后期调试和单元测试都会变麻烦。
-
$this->input->get('status')返回NULL(不是空字符串)当参数不存在,注意判空逻辑 - 加第二个参数可设默认值:
$this->input->get('limit', true, 10),true表示启用 XSS 过滤 - 想批量取全部 GET 参数?用
$this->input->get()不带参数,返回关联数组
$this->uri->segment() 和 $this->input->get() 别混用
URL 路径段(如 /leads/list/active 中的 active)属于 URI segment,得用 $this->uri->segment(3);而查询参数(?status=active)才走 input->get()。两者底层来源不同,不能互相替代。
有人在 routes.php 里把 leads/(:any) 映射成 leads/index/$1,然后在控制器里误用 $this->input->get('status') 去取那个 active ——结果永远是 NULL,因为那根本不是 GET 参数。
- 路径段编号从 1 开始:
/admin/users/edit/123→$this->uri->segment(4)是123 - 要用 segment 做条件筛选,建议在控制器里先赋值给变量,再传给模型,别让模型自己去调
$this->uri - segment 值不会被自动过滤,如需安全处理,得手动调
$this->security->xss_clean()
POST 和 GET 混合时,$this->input->post() 不能代替 get()
哪怕你用 AJAX 发 POST 请求,URL 上挂着 ?page=2&sort=name,这些仍是 GET 参数,必须用 $this->input->get() 获取。$this->input->post() 只读 application/x-www-form-urlencoded 或 multipart/form-data 的 body 数据,对 URL 查询串完全无感。
典型翻车现场:前端把分页参数拼在 URL 上,后端却只读 $_POST 或 $this->input->post(),导致 page 始终是 1。
- 不要依赖
$this->input->param()—— CodeIgniter 核心没有这个方法,某些老旧教程或自定义扩展才有,不可靠 - 如果前后端约定用 JSON 提交,且 URL 仍有查询参数,
$this->input->get()依然有效,它不关心请求体格式 - 开启
enable_query_strings配置(config.php)会让 CI 把所有 GET 参数转成 segment,但这会破坏 RESTful 路由习惯,不推荐
模型里禁止直接调 $this->input->get()
模型类里出现 $this->input->get('status') 是危险信号。模型应只负责数据逻辑,不感知请求上下文。一旦你写单元测试或 CLI 调用该模型,$this->input 就会报错或返回空,因为 CLI 环境没有 HTTP 请求对象。
正确做法是在控制器里取好参数,明确作为函数参数传入模型方法,比如:$this->leads_model->get_pagination(..., $leadsource)。这样模型可复用、可测、可文档化。
- 模型方法签名要体现依赖:如果它需要 status 过滤,就把
$status = null写进参数列表,而不是在内部偷偷去拿 - 参数名保持一致:控制器里叫
$leadsource,传进模型也别改成$src,避免追踪困难 - 空值处理放在控制器更合适——比如
if (empty($leadsource)) $leadsource = 'all';,模型只管按给定值执行 where
真正容易被忽略的是:GET 参数默认经过 XSS 过滤,但如果你关掉了全局过滤($config['global_xss_filtering'] = FALSE),又没在 get() 调用时显式传 true,那些参数就裸奔了。尤其当它们最终拼进 SQL 或输出到页面时,风险立刻浮现。











