filter_var() 最省事且可靠:它内置、免扩展,比 empty()/isset() 避免 "0" 等误判,比手写正则更准;邮箱用 FILTER_VALIDATE_EMAIL,URL 加 FILTER_FLAG_SCHEME_REQUIRED,整数用 FILTER_VALIDATE_INT 配范围;批量校验用 filter_input_array(),JSON 接口需先读 php://input 再 json_decode() 并检查错误。

PHP接口里用filter_var()做基础字段校验最省事
大多数简单接口(比如用户注册、表单提交)不需要上框架验证器,filter_var() 就够用,它内置在 PHP 里,不用装扩展,也不依赖外部库。
常见错误是直接用 empty() 或 isset() 判空,但它们对 "0"、"false" 这类字符串会误判;或者用正则硬写邮箱/URL 格式,容易漏边界 case。
实操建议:
- 手机号用
filter_var($phone, FILTER_SANITIZE_NUMBER_INT)清洗后再判断长度,比正则更稳 - 邮箱必须用
FILTER_VALIDATE_EMAIL,别自己写/^.+@.+\..+$/—— 它不校验 @ 后有没有合法域名 - URL 用
FILTER_VALIDATE_URL,注意它默认不校验http://前缀,要加FILTER_FLAG_SCHEME_REQUIRED - 整数用
filter_var($id, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]),比is_numeric()更准(后者接受"1e3")
POST数据进来的数组怎么批量校验
手写一堆 filter_var() 很累,PHP 有 filter_input_array() 直接处理整个 $_POST 或 $_GET。
立即学习“PHP免费学习笔记(深入)”;
容易踩的坑:它默认只读取 INPUT_POST,但不会自动过滤 $_FILES 或 $_COOKIE;另外如果某个字段没传,返回 false 而不是 null,得用 === false 严格判断。
示例场景:接收一个带 title(非空字符串)、price(正浮点)、category_id(大于 0 的整数)的 JSON 接口请求:
$rules = [
'title' => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_NO_ENCODE_QUOTES],
'price' => ['filter' => FILTER_VALIDATE_FLOAT, 'options' => ['min_range' => 0.01]],
'category_id' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1]]
];
$data = filter_input_array(INPUT_POST, $rules);
if ($data === false || $data['title'] === null || $data['price'] === false || $data['category_id'] === false) {
http_response_code(400);
echo json_encode(['error' => '参数校验失败']);
exit;
}
为什么filter_var()不适合复杂业务规则
它只管格式,不管语义。比如“用户名不能为 admin”、“密码需包含大小写字母和数字”、“两个日期字段谁必须早于谁”,这些都得自己写逻辑。
这时候硬塞进 filter_var() 的 callback 模式反而难维护,不如拆成独立函数:
- 先用
filter_var()做基础清洗和格式兜底(防 XSS、类型错乱) - 再用 if/else 或 switch 显式检查业务约束,错误信息也更容易定位
- 别把校验逻辑藏在模型 save() 里——接口层就该明确告诉调用方哪条规则没过
性能上没区别,但可读性和调试成本差很多。
JSON接口要注意php://input和$_POST的区别
前端发 Content-Type: application/json 时,数据不在 $_POST 里,得手动读 php://input 并 json_decode()。
常见错误是直接对 $_POST 调用 filter_input_array(),结果永远拿不到数据;或者没设 json_decode($raw, true) 的第二个参数,导致后面用 $data['key'] 报错。
实操要点:
- 先
$raw = file_get_contents('php://input');,再$data = json_decode($raw, true); - 校验前务必检查
json_last_error() === JSON_ERROR_NONE,否则前端传了个{name:"张三",age:}这种半截 JSON,$data就是null - 之后再用
filter_var()处理每个字段,别跳过这步——json_decode不做任何过滤
真正麻烦的从来不是“怎么校验”,而是“校验失败后怎么让前端快速知道是哪个字段、哪条规则挂了”。字段名拼错、类型传错、必填项漏传……这些细节比技术选型重要得多。



















