首页 / PHP 入门教程 / PHP 表单验证

PHP 入门教程

PHP 表单验证

本教程共 65 篇 · 第 24 篇 · 更新于 2026-07-24 · 约 5 分钟阅读

PHPPHP8表单验证filter_var数据验证安全

24. PHP 表单验证

本节目标:掌握服务端验证的基本原则,学会验证必填项、邮箱、URL 等常见字段,使用 filter_var 简化验证逻辑。

客户端验证(HTML5 或 JS)可以提升体验,但服务端验证才是安全的最后防线。本章教你用 PHP 把住这道关。

24.1 服务端验证原则

表单提交后,PHP 应该做以下检查:

  1. 必填字段是否为空
  2. 数据类型是否正确
  3. 格式是否符合规则(如邮箱、URL)
  4. 长度是否在合理范围
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_INT0 也会返回 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

封装时返回数组(含 errorvalue),既能显示错误,又能保留用户已填内容,体验更好。

24.6 常见错误提醒

  • 忘记判断请求方法:首次打开页面时 $_POST 为空,直接访问会报错
  • 直接用 $_POST 输出:未转义会导致 XSS 漏洞
  • 忽略 0 的验证empty(0) 返回 true,数字字段要用 === "" 判断

来源:参考了 runoob「PHP 表单验证」、w3cschool「PHP 表单验证」等,改写后所得。