PHP表单验证是处理用户提交数据的第一道防线,主要作用是确保提交的数据符合业务要求,同时防止恶意数据注入到系统中。合理的验证逻辑可以过滤无效数据,减少后续业务处理的异常概率。

PHP表单验证的核心流程
通常PHP表单验证会遵循以下基本流程:
- 接收用户通过POST或GET方式提交的表单数据
- 对数据进行基础非空校验,确认必填项已填写
- 按照业务规则校验数据格式,比如邮箱、手机号、数字范围等
- 对数据进行安全过滤,去除危险字符,防止XSS或SQL注入
- 根据校验结果返回对应的提示信息或执行后续业务逻辑
常用验证方法
1. 基础非空校验
非空校验是最基础的验证步骤,用于确认用户没有遗漏必填项。可以通过empty()函数或者isset()函数实现,需要注意empty()会把0、空字符串都判定为空,需要根据实际场景选择。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST["username"];
// 校验用户名是否为空
if (empty($username)) {
echo "用户名不能为空";
} else {
echo "用户名填写正确";
}
}
?>
2. 格式校验
格式校验用于确认数据符合特定的规则,比如邮箱格式、手机号格式、身份证格式等。PHP内置了filter_var()函数,可以很方便地完成常见的格式校验,也支持自定义正则校验。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$email = $_POST["email"];
// 使用内置过滤器校验邮箱格式
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "邮箱格式正确";
} else {
echo "邮箱格式错误";
}
$phone = $_POST["phone"];
// 自定义正则校验手机号(11位,以1开头)
$phone_pattern = "/^1[3-9]d{9}$/";
if (preg_match($phone_pattern, $phone)) {
echo "手机号格式正确";
} else {
echo "手机号格式错误";
}
}
?>
3. 安全过滤
安全过滤是为了去除数据中的危险内容,避免XSS攻击或者SQL注入。可以使用htmlspecialchars()函数转义HTML特殊字符,也可以使用filter_var()的过滤功能处理数据。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$content = $_POST["content"];
// 转义HTML特殊字符,防止XSS攻击
$safe_content = htmlspecialchars($content, ENT_QUOTES, "UTF-8");
// 过滤掉非法的字符串内容
$filtered_content = filter_var($safe_content, FILTER_SANITIZE_STRING);
echo "过滤后的内容:" . $filtered_content;
}
?>
4. 范围与长度校验
很多场景下需要校验数据的范围或者长度,比如年龄需要在1到120之间,密码长度需要在6到20位之间。可以通过比较运算符或者strlen()函数实现。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$age = $_POST["age"];
$password = $_POST["password"];
// 校验年龄范围
if ($age < 1 || $age > 120) {
echo "年龄需要在1到120之间";
}
// 校验密码长度
if (strlen($password) < 6 || strlen($password) > 20) {
echo "密码长度需要在6到20位之间";
}
}
?>
完整表单验证实例
下面是一个包含用户名、邮箱、年龄、密码的完整表单验证实例,涵盖了上述提到的所有常用验证方法。
<?php
// 初始化错误提示数组
$errors = [];
$username = $email = $age = $password = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 校验用户名
if (empty($_POST["username"])) {
$errors["username"] = "用户名不能为空";
} else {
$username = htmlspecialchars($_POST["username"], ENT_QUOTES, "UTF-8");
}
// 校验邮箱
if (empty($_POST["email"])) {
$errors["email"] = "邮箱不能为空";
} else {
$email = $_POST["email"];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors["email"] = "邮箱格式错误";
} else {
$email = htmlspecialchars($email, ENT_QUOTES, "UTF-8");
}
}
// 校验年龄
if (empty($_POST["age"])) {
$errors["age"] = "年龄不能为空";
} else {
$age = intval($_POST["age"]);
if ($age < 1 || $age > 120) {
$errors["age"] = "年龄需要在1到120之间";
}
}
// 校验密码
if (empty($_POST["password"])) {
$errors["password"] = "密码不能为空";
} else {
$password = $_POST["password"];
if (strlen($password) < 6 || strlen($password) > 20) {
$errors["password"] = "密码长度需要在6到20位之间";
}
}
// 如果没有错误,输出验证通过的信息
if (empty($errors)) {
echo "所有表单数据验证通过,提交的内容为:<br/>";
echo "用户名:" . $username . "<br/>";
echo "邮箱:" . $email . "<br/>";
echo "年龄:" . $age . "<br/>";
echo "密码:已通过长度校验";
}
}
?>
<!-- 表单页面 -->
<form method="post" action="">
<p>用户名:<input type="text" name="username">
<?php if (isset($errors["username"])) echo "<span style='color:red'>" . $errors["username"] . "</span>"; ?></p>
<p>邮箱:<input type="text" name="email">
<?php if (isset($errors["email"])) echo "<span style='color:red'>" . $errors["email"] . "</span>"; ?></p>
<p>年龄:<input type="text" name="age">
<?php if (isset($errors["age"])) echo "<span style='color:red'>" . $errors["age"] . "</span>"; ?></p>
<p>密码:<input type="password" name="password">
<?php if (isset($errors["password"])) echo "<span style='color:red'>" . $errors["password"] . "</span>"; ?></p>
<p><input type="submit" value="提交"></p>
</form>
注意事项
- 不要仅依赖前端验证,前端验证可以被绕过,所有数据必须在后端再次校验
- 校验顺序建议先校验非空,再校验格式,最后做安全过滤,避免无效校验消耗资源
- 错误提示信息要清晰明确,让用户知道具体是哪一项不符合要求
- 敏感数据比如密码,不要直接明文存储,校验通过后需要做哈希处理再存入数据库
PHP表单验证数据校验input_filter修改时间:2026-06-29 22:21:36