param() 并非万能取参函数,JSON请求、空字符串、路由干扰均使其返回null;安全用法须按数据来源选方法:GET/POST用get()/post(),JSON用input()或json(),TP6中仅支持参数注入、request()助手函数、Request门面三种调用方式。

param() 不是万能取参函数,JSON 请求、空字符串、路由干扰都会让它返回 null;真正安全的用法必须按数据来源选方法。
param() 什么时候会失效
明明 URL 带了 ?id=123,param('id') 却返回 null,常见原因有三个:
- 当前是
application/json请求,但param()根本不解析请求体,只读 GET/POST/路由变量 - 开启了强制路由(
url_route_must),index.php?s=/user/info这类 URL 的查询参数被路由规则吞掉,get()和param()都拿不到 - PHP 配置
max_input_vars太小,超长表单字段被截断,post()看似为空,param()自然也空
GET/POST 表单该用 get() 还是 param()
表单提交或 URL 查询这类场景,优先用 get() 或 post(),而不是 param():
-
get('name')只读$_GET,不合并、不 trim、不转类型,拿到的就是原始值 -
post('name')同理,只读$_POST,空字符串''不会被转成null -
param('name')会自动 trim、把'123'转成123、把空数组/空字符串统一转为null,适合业务层“清洗后使用”,不适合做原始校验
JSON 接口必须用 input() 或 json()
前端发 fetch({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: 1 }) }),以下写法全错:
-
param('id')→ 返回null(不解析 JSON) -
post('id')→ 返回null($_POST为空)
正确做法只有两个:
立即学习“PHP免费学习笔记(深入)”;
-
input('id'):内部尝试解析 JSON,但只支持顶层字段,嵌套结构如{ "user": { "id": 1 } }拿不到user.id -
json(true):完整解析整个 JSON body 成数组,再手动取值,比如$data = \think\facade\Request::json(true); $id = $data['id'] ?? null;
TP6 中 request 对象怎么获取才不报错
Request::instance() 在 TP6 已彻底移除,调用直接 Fatal error。可用入口只有三个:
- 控制器方法参数注入:
public function index(\think\Request $request) - 助手函数:
request()->param('id') - 门面类:
\think\facade\Request::param('id')
注意:TP6 的 input('name') 默认不读路由变量,要读得显式加过滤器,比如 input('name', '', 's');而 param() 才合并路由变量。



















