登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  php教程

filter_input 请求参数怎么配置或排查

来源:17golang原创

时间:2026-09-13 04:33:42 363浏览 收藏

接收分页、筛选或表单字段时,filter_input 最容易错的不是函数名,而是把“参数没传”和“参数传了但校验失败”当成同一种情况。实战中可以先用 INPUT_GETINPUT_POST 指定来源,再用明确的校验过滤器和 options 限定范围;默认的 FILTER_DEFAULT 实际上等同于不做过滤。

官方地址:https://www.php.net/manual/en/function.filter-input.php

要点速览
  • filter_input(type, var_name, filter, options) 的四个位置分别对应输入源、字段名、过滤器和过滤选项。
  • 读取整数不要只写默认过滤器,优先使用 FILTER_VALIDATE_INT 并设置 min_rangemax_range
  • 未提交通常得到 null,校验失败通常得到 false;需要区分语义时不要直接强转成字符串。

先把 filter_input 的四个参数对齐

我排查这类问题时会先把调用拆成四个问题:数据来自哪个输入源?字段实际叫什么?要验证什么规则?规则需要哪些选项?函数签名可以记成:

 ['min_range' => 1, 'max_range' => 100],
]);
?>

INPUT_GET 只表示查询字符串来源,var_name 是字段名,不是字段值。第四个参数既可以是过滤器支持的选项数组,也可以直接传标志位。把 $_GET['page'] 改成另一个值后再调用 filter_input,不能用来测试修改后的值,因为它读取的是 SAPI 提供的原始输入;已经在 PHP 代码中加工过的变量应改用 filter_var

PHP filter_input 中原始 SAPI 输入、INPUT_GET、字段名、整数校验和 options 的静态关系示意图
图1:filter_input 参数关系示意图,输入源和校验配置共同决定读取结果。

用校验过滤器给请求参数设边界

“能读到值”不等于“值可用于业务”。分页参数适合用 FILTER_VALIDATE_INT,而不是依赖字符串转换。下面的写法把缺省页设为 1,同时拒绝 0、负数、小数和超出范围的输入:

 ['default' => 1, 'min_range' => 1, 'max_range' => 100]]
);

// 只有验证成功后才把结果交给分页查询。
if ($page === false) {
    http_response_code(400);
    exit('page 参数必须是 1 到 100 的整数');
}
echo $page;
?>

这里的 default 只负责过滤器未通过时的替代值,团队如果需要区分“没传”和“传错”,就不要把默认值放进这一层,而应先保留返回状态再决定响应。校验过滤器也不是输出编码工具:渲染到 HTML 时仍要按输出上下文使用 htmlspecialchars 等编码方式。

为什么会同时出现 null、false 和合法值

这个返回值三分法是排查的关键。没有名为 page 的参数时,函数返回 null;参数存在但整数校验失败时,通常返回 false;通过校验时才是整数结果。不要写成 (int) filter_input(...) 后再判断,因为强转会把多个异常情况压成 0。

状态默认结果处理建议
参数未提交null可采用业务默认值,或要求客户端补齐
参数存在但校验失败false返回 400 或提示参数格式错误
参数通过校验合法整数进入分页、查询等业务逻辑

如果项目约定“缺失”和“失败”必须反过来表达,也可以加上 FILTER_NULL_ON_FAILURE:此时变量缺失返回 false,过滤失败返回 null。它改变的是失败值的编码,不会把非法字符串变成合法整数。

PHP filter_input 对 page 请求参数映射到缺失值 null、校验失败 false 和合法整数的关系示意图
图2:filter_input 返回值语义示意图,先判断参数是否存在,再判断校验是否通过。

四个现场检查点能定位大多数问题

  • 来源错:表单用 POST 却写了 INPUT_GET,结果会一直是缺失状态。
  • 字段错:HTML 的 name="current_page" 与代码里的 page 不一致,函数不会按你想的字段读取。
  • 数组错:参数形如 page[]=1 时,标量整数过滤会失败;确实允许数组时要明确使用数组相关 flag,并逐项校验。
  • 数据已改:如果先给 $_GET['page'] 补默认值,再调用 filter_input,看到的仍可能是原始请求状态;改用 filter_var 处理已经拿到的变量。
 ['min_range' => 1, 'max_range' => 100],
]);
?>

相关问题

filter_input 默认会自动清洗字符串吗?

不会。FILTER_DEFAULTFILTER_UNSAFE_RAW 的别名,不能把它当作安全校验或 HTML 输出编码。

为什么返回 0 会让排查变难?

因为把 nullfalse 强转为整数后,缺失、失败与真实的 0 可能失去区别。应先使用严格比较判断返回状态。

什么时候应该用 filter_input_array?

需要一次读取多个字段且每个字段都有明确规则时可以使用它;单个字段排障时,filter_input 更容易看清每个参数的作用。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>