最稳妥的方式是使用 $this->input->get()(CI3)或 $this->request->getGet()(CI4)获取 GET 参数,二者均自动过滤、防 XSS;URI segment(如 /a/b/5 中的 5)须用 $this->uri->segment() 或 $this->uri->getSegment() 读取,不可混用。

直接用 $this->input->get() 最稳妥
CI3 和 CI4 都支持这个方法,它会自动过滤、转义、防止 XSS,比直接读 $_GET 安全得多。不推荐裸用 $_GET['key'],尤其当参数要进数据库或输出到页面时。
常见错误现象:用 $_GET['id'] 拿不到值,但 URL 明明带了 ?id=123 —— 很可能是 Apache 未开启 mod_rewrite 或 .htaccess 规则没生效,导致 CI 的路由没接管请求,$_GET 看起来“失效”,其实是请求根本没走 CI 入口。
-
$this->input->get('id')返回null时默认不报错,可加第二个参数设为true启用 XSS 过滤:$this->input->get('name', true) - 想判断参数是否存在,别用
isset($_GET['x']),改用$this->input->get('x') !== null - 批量取所有 GET 参数:
$this->input->get()(无参调用),返回关联数组
URI 分段参数(segment)不是 GET 参数,别混用
像 /index.php/welcome/index/5/phpjyz 这种路径里的 5 和 phpjyz 是 URI segment,属于路由路径的一部分,不是传统意义上的 GET 查询参数(即不在 ?key=value 里)。它们不能用 $this->input->get() 读取。
正确读法是:$this->uri->segment(3)(CI3)或 $this->uri->getSegment(3)(CI4)。如果硬要用 $_GET 去读 segment,一定为空 —— 因为浏览器根本没把它作为 query string 发送。
- CI3 中
$this->uri->segment(1)是控制器名,segment(2)是方法名,以此类推 - CI4 的
$this->uri->getSegment()默认从 1 开始计数,但需确保路由已启用AutoRoute或显式配置了对应路径 - segment 无法通过浏览器地址栏的
?a=1&b=2影响,二者完全独立
控制器方法形参自动绑定只适用于 segment,不适用于 GET
写成 public function show($id = 0, $name = '') 这种形式,只能接收 URI 路径中的 segment 值(如 /show/123/abc),对 ?id=123&name=abc 完全无效。这是新手最常踩的坑:以为加了形参就能自动接收到 query string 参数。
- 这种绑定由 CI 的 Router 类在分发前完成,和 HTTP 请求方式无关
- 若同时存在 segment 和 query string(如
/show/123?name=xyz),$id能拿到123,但$name不会自动变成xyz—— 还得手动用$this->input->get('name') - CI4 中该机制依然存在,但更建议统一用
$this->request->getGet('key')替代旧式$this->input->get()
CI4 里推荐用 $this->request->getGet() 替代 input 类
CI4 已将输入处理逻辑移到 Request 对象,$this->input 在 CI4 中仍能用(向后兼容),但官方文档明确建议迁移到 $this->request。它更清晰地区分了不同来源的数据:getGet() 专用于 query string,getPost() 专用于 POST body。
-
$this->request->getGet('page')等价于 CI3 的$this->input->get('page') -
$this->request->getGet()(无参)返回完整 GET 数组,且自动做过滤(取决于全局配置app.filter_globals) - 注意:CI4 默认关闭
filter_globals,如需 XSS 过滤,需显式传true:$this->request->getGet('html', true)


















