tp5.1 的 input() 不再自动合并多源参数且废弃第三参数过滤器,需改用 input('param.id') 或 request()->param() 并显式指定来源与过滤。

TP5.1 的 input() 不再自动合并 GET/POST/PUT/DELETE 等多源参数,直接沿用 TP5.0 写法会导致漏取数据、类型错误或静默返回 null。
input() 默认只读 raw body,不解析 $_GET 和 $_POST
TP5.0 中 input('id') 会按顺序查找:POST → GET → REQUEST → COOKIE → SESSION;TP5.1 彻底移除该“多源 fallback”逻辑,默认仅从当前请求的原始 body(php://input)解析 JSON 或表单数据,完全忽略 $_GET 和 $_POST 超全局数组。
- 常见错误现象:
input('id')在 GET 请求(如/user?id=123)中返回null,而开发者误以为是参数名写错 - 正确做法:显式指定来源,如
input('get.id')、input('post.name')、input('param.id') -
input('param.id')是最接近 TP5.0 行为的替代——它等价于request()->param('id'),会自动合并路由变量、查询参数、POST 数据和 PUT/DELETE 的 body 解析结果
过滤器参数行为变更:第三参数废弃,需改用 request()->filter()
TP5.0 支持 input('name', '', 'htmlspecialchars') 这种三层调用;TP5.1 中 input() 的第三个参数(过滤回调)已被移除,传入会被忽略,且无任何警告。
- 错误写法:
input('title', '', 'htmlspecialchars')→ 返回原值,未过滤,极易引发 XSS - 正确写法:改用
request()->param('title', '', 'htmlspecialchars'),或先取值再手动过滤:htmlspecialchars(input('post.title')) - 注意:
request()->param()的第三个参数是过滤器名(字符串),第四个才是默认值(TP5.1 参数顺序与 TP5.0 不同)
数组参数嵌套语法不再自动展开
TP5.0 允许 input('user.') 获取整个 user 关联数组(如 POST 中 user[name]、user[email]);TP5.1 中该语法失效,input('user.') 返回空,必须显式使用 request()->param('user') 或 input('post.user/a')(/a 表示强制转为数组)。
- 常见错误场景:表单提交嵌套字段(如
address[city]、address[zip]),用input('address.')取不到数据 - 安全建议:避免依赖点号自动展开,改用明确的
request()->param('address', [], 'array'),并校验结构 - 兼容性影响:若项目重度依赖
input('xxx.'),升级时需全局搜索替换,否则大量表单逻辑中断
最易被忽略的是:TP5.1 的 input() 对空字符串、null、缺失键的处理更严格,不会像 TP5.0 那样兜底返回空数组或空字符串——没传就是没传,得自己判空补默认值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











