PHP 入门教程
24.4 使用
PHP 表单验证
本教程共 65 篇 · 第 24 篇 · 更新于 2026-07-24 · 约 5 分钟阅读
PHPPHP8表单验证filter_var数据验证安全
24. PHP 表单验证
本节目标:掌握服务端验证的基本原则,学会验证必填项、邮箱、URL 等常见字段,使用
filter_var简化验证逻辑。
客户端验证(HTML5 或 JS)可以提升体验,但服务端验证才是安全的最后防线。本章教你用 PHP 把住这道关。
24.1 服务端验证原则
表单提交后,PHP 应该做以下检查:
- 必填字段是否为空
- 数据类型是否正确
- 格式是否符合规则(如邮箱、URL)
- 长度是否在合理范围
Note永远不要信任用户输入。绕过前端验证非常简单,服务端必须重新校验一遍。
24.2 必填字段验证
用 empty() 判断字段是否为空字符串、0、null 或不存在。
<?php
$nameError = "";
$name = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (empty($_POST["name"])) {
$nameError = "姓名不能为空";
} else {
$name = cleanInput($_POST["name"]);
}
}
function cleanInput(string $data): string {
return htmlspecialchars(trim($data), ENT_QUOTES, "UTF-8");
}
?>
<form method="post">
姓名:<input type="text" name="name" value="<?= $name ?>">
<span style="color:red"><?= $nameError ?></span>
<br><input type="submit" value="提交">
</form>
24.3 数据类型与范围验证
年龄应该是整数且在合理区间:
<?php
$ageError = "";
$age = null;
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$raw = $_POST["age"] ?? "";
if (!is_numeric($raw)) {
$ageError = "年龄必须是数字";
} else {
$age = (int) $raw;
if ($age < 1 || $age > 150) {
$ageError = "年龄必须在 1-150 之间";
}
}
}
?>
24.4 使用 filter_var 验证格式
PHP 内置的 filter_var() 是验证利器,比手写正则更可靠。
验证邮箱
<?php
$email = "test@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "邮箱格式正确";
} else {
echo "邮箱格式错误";
}
验证 URL
<?php
$url = "https://www.example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL 格式正确";
} else {
echo "URL 格式错误";
}
Tip
FILTER_VALIDATE_URL默认要求带协议头(如https://)。若只验证域名,需先拼接协议。
验证整数与浮点数
<?php
$num = "42";
if (filter_var($num, FILTER_VALIDATE_INT) !== false) {
echo "是有效整数";
}
$price = "19.99";
if (filter_var($price, FILTER_VALIDATE_FLOAT) !== false) {
echo "是有效浮点数";
}
Note
FILTER_VALIDATE_INT对0也会返回0,要用!== false判断,不能用== true。
验证布尔值与 IP
<?php
$flag = "1";
$bool = filter_var($flag, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
// true, false, 1, 0, "yes", "no", "on", "off" 都被支持
$ip = "192.168.1.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
echo "IP 格式正确";
}
24.5 完整的验证函数封装
把常用验证逻辑封装成函数,提高复用性:
<?php
function validateRequired(string $field, string $label): array {
if (empty(trim($field))) {
return ["error" => "{$label}不能为空", "value" => ""];
}
return ["error" => "", "value" => htmlspecialchars(trim($field))];
}
function validateEmail(string $email): array {
$email = trim($email);
if (empty($email)) {
return ["error" => "邮箱不能为空", "value" => ""];
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return ["error" => "邮箱格式不正确", "value" => $email];
}
return ["error" => "", "value" => $email];
}
function validateLength(string $str, int $min, int $max, string $label): array {
$len = mb_strlen($str, "UTF-8");
if ($len < $min || $len > $max) {
return ["error" => "{$label}长度需在 {$min}-{$max} 个字符之间", "value" => $str];
}
return ["error" => "", "value" => $str];
}
// 使用示例
$result = validateEmail($_POST["email"] ?? "");
if ($result["error"]) {
echo $result["error"];
} else {
echo "邮箱:" . $result["value"];
}
Tip封装时返回数组(含
error和value),既能显示错误,又能保留用户已填内容,体验更好。
24.6 常见错误提醒
- 忘记判断请求方法:首次打开页面时
$_POST为空,直接访问会报错 - 直接用
$_POST输出:未转义会导致 XSS 漏洞 - 忽略
0的验证:empty(0)返回true,数字字段要用=== ""判断
来源:参考了 runoob「PHP 表单验证」、w3cschool「PHP 表单验证」等,改写后所得。