ThinkPHP 6 中应直接用 $request->get() 获取纯 GET 参数,它只读 $_GET、不混入 POST 或路由变量,确保来源清晰、调试可控;支持取单值、默认值、过滤及完整数组。

ThinkPHP 6 的 Request 对象怎么取 GET 参数
直接用 $request->get(),不是 input() 或 param() —— 后两者会合并 POST/GET/Route 等来源,容易掩盖参数来源意图,调试时难定位问题。
常见错误是写成 $request->param('id') 却在接口文档里明确要求“仅接受 URL 查询参数”,结果前端传了 JSON body,param() 把 POST 数据也混进来了,看似有值,实则逻辑错位。
-
$request->get()只读$_GET,干净、可控 - 传键名可取单个值:
$request->get('page'),未传时返回null - 支持默认值和过滤:
$request->get('limit', 20, 'intval') - 不传参则返回完整
$_GET数组(不含键值过滤)
ThinkPHP 5.1 中 input() 的 GET 获取写法
TP5.1 没有独立的 get() 方法,得靠 input() 显式指定来源。很多人漏写 get. 前缀,导致取到的是混合参数。
正确写法必须带 get. 前缀:input('get.id'),否则 input('id') 默认走 param 行为。
立即学习“PHP免费学习笔记(深入)”;
-
input('get.name')→ 取$_GET['name'],未设置返回null -
input('get.status/d', 0)→ 强制转整型,默认值 0 - 不能写
input('get.')(空键名),会报错;想取全部需用input('get.')+ 额外判断或改用$_GET - 注意:TP5.1 的
input()对get.不做自动 URL 解码,若参数含中文或特殊符号,需自行urldecode()
GET 参数为空或取不到?先检查这几个点
不是代码写错,往往是请求本身或框架配置拦住了。
- 确认 URL 确实带查询字符串,比如
/user/list?page=2,而不是/user/list?page(无等号值,PHP 默认不收进$_GET) - Apache 下开启
mod_rewrite且使用了伪静态规则时,部分规则会丢弃原始 QUERY_STRING,需在RewriteRule末尾加[QSA]标志 - TP6 开启了
app_debug = false且配置了url_common_param = true,可能导致 GET 被转为 PATHINFO,此时$_GET为空 —— 这种模式下必须用$request->param(),但要清楚它已不是纯 GET - Nginx 配置中,
fastcgi_split_path_info正则若写错,也可能吞掉QUERY_STRING,可临时加var_dump($_SERVER['QUERY_STRING']);验证
要不要对 GET 参数做验证?什么时候做
GET 参数天然是用户可控的,不做校验就直接进数据库或执行命令,风险极高。但验证时机很关键:别在控制器里手写 if 判断,也不要在模型里硬塞校验逻辑。
- TP6 推荐用验证器类 +
validate场景,配合$request->get()传参,例如:$this->validate($request->get(), 'app\common\validate\User.get') - TP5.1 可用
validate($data, $rule, $msg, $scene)手动触发,但注意$data必须是数组,不能直接传input('get.id')单值 - 避免在中间件里统一校验所有 GET 参数 —— 大多数接口只需要校验几个字段,全局拦截反而增加开销且难以维护
- 特别注意分页参数如
page、limit:必须限制范围(如page > 0 && limit ),防止恶意构造超大偏移量拖垮数据库



















