主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

PHP 表单验证

表单验证是保障数据安全的重要环节,它能有效过滤非法数据输入。

在实际应用中,我们需要采用前后端相结合的验证策略:前端通过 HTML 验证可以快速拦截大部分无效输入,减轻服务器压力;而后端验证则是防范恶意攻击的最后防线,能够有效应对绕过前端验证的作弊行为。


PHP 表单验证实例

前端部分通过 HTML 验证可以快速拦截大部分无效输入,减轻服务器压力。

✅ 下面是表单验证实例的演示代码:

<form action="process.php" method="post">
    <!-- 姓名(必填) -->
    <div class="form-group">
        <label for="name" class="required">姓名</label>
        <input type="text" id="name" name="name" required>
    </div>

    <!-- 密码(必填) -->
    <div class="form-group">
        <label for="password" class="required">密码</label>
        <input type="password" id="password" name="password" required minlength="6" autocomplete="off">
    </div>

    <!-- 性别(必填) -->
    <div class="form-group">
        <label class="required">性别</label>
        <div class="radio-group">
            <div class="radio-option">
                <input type="radio" id="male" name="gender" value="male" required>
                <label for="male">男</label>
            </div>
            <div class="radio-option">
                <input type="radio" id="female" name="gender" value="female">
                <label for="female">女</label>
            </div>
            <div class="radio-option">
                <input type="radio" id="other" name="gender" value="other">
                <label for="other">其他</label>
            </div>
        </div>
    </div>

    <!-- 邮箱(必填) -->
    <div class="form-group">
        <label for="email" class="required">邮箱</label>
        <input type="email" id="email" name="email" required autocomplete="off">
    </div>

    <!-- 备注(选填) -->
    <div class="form-group">
        <label for="remarks">备注</label>
        <textarea id="remarks" name="remarks" maxlength="500"></textarea>
    </div>

    <button type="submit">提交</button>
</form>

✅ 表单验证规则说明:

字段 验证规则 说明
姓名 required 必填字段,不能为空。
密码 required 必填字段,不能为空,最少 6 个字符。
性别 required 必选字段,不能为空。
邮箱 required, email 必填字段,必须是有效的邮箱格式。
备注 maxlength=500 选填字段,最多输入 500 个字符。

PHP 接收数据验证

后端验证则是防范恶意攻击的最后防线,能够有效应对绕过前端验证的作弊行为。

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 获取表单数据并清理
    $name = htmlspecialchars(trim($_POST['name']));
    $password = $_POST['password']; // 密码不需要htmlspecialchars
    $gender = htmlspecialchars(trim($_POST['gender'] ?? ''));
    $email = htmlspecialchars(trim($_POST['email']));
    $remarks = htmlspecialchars(trim($_POST['remarks'] ?? ''));

    // 验证必填字段
    $errors = [];

    if (empty($name)) {
        $errors[] = "姓名是必填的!";
    }

    if (empty($password)) {
        $errors[] = "密码是必填的!";
    } elseif (strlen($password) < 6) {
        $errors[] = "密码长度不能少于6个字符!";
    }

    if (empty($gender)) {
        $errors[] = "请选择性别!";
    } elseif (!in_array($gender, ['male', 'female', 'other'])) {
        $errors[] = "请选择有效的性别选项!";
    }

    if (empty($email)) {
        $errors[] = "邮箱是必填的!";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "请输入有效的邮箱地址!";
    }

    // 验证备注长度(虽然前端有限制,但后端也需要验证)
    if (strlen($remarks) > 500) {
        $errors[] = "备注内容不能超过500个字符!";
    }

    // 如果有错误,显示错误
    if (!empty($errors)) {
        foreach ($errors as $error) {
            echo "<p>错误:$error</p>";
        }
    } else {
        // 所有验证通过,处理数据
        echo "<h2>感谢您的提交,$name!</h2>";
        echo "<p>我们已收到您的信息:</p>";
        echo "<ul>";
        echo "<li>姓名:$name</li>";
        echo "<li>性别:" . ($gender === 'male' ? '男' : ($gender === 'female' ? '女' : '其他')) . "</li>";
        echo "<li>邮箱:$email</li>";
        if (!empty($remarks)) {
            echo "<li>备注:" . nl2br($remarks) . "</li>";
        }
        echo "</ul>";

        // 这里可以添加数据库操作或邮件发送代码
        // 注意:密码应该经过哈希处理后再存储
        // $hashed_password = password_hash($password, PASSWORD_DEFAULT);
    }
} else {
    // 如果不是POST请求,重定向回表单
    header("Location: form.html");
    exit;
}
?>

✅ PHP 表单后端验证说明:

1. 基本结构

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 处理POST请求
} else {
    // 非POST请求重定向
    header("Location: form.html");
    exit;
}

这段代码首先检查请求方法是否为 POST,确保只有表单提交才会被处理。如果不是 POST 请求(比如直接访问这个 PHP 文件),则重定向回表单页面。

2. 获取并清理表单数据

$name = htmlspecialchars(trim($_POST['name']));
$password = $_POST['password']; // 密码不需要htmlspecialchars
$gender = htmlspecialchars(trim($_POST['gender'] ?? ''));
$email = htmlspecialchars(trim($_POST['email']));
$remarks = htmlspecialchars(trim($_POST['remarks'] ?? ''));
  • trim():去除字符串两端的空白字符。
  • htmlspecialchars():将特殊字符转换为 HTML 实体,防止 XSS 攻击
  • ?? '':PHP 7.0+ 的空合并运算符,如果$_POST['gender']不存在则使用空字符串。
  • 密码不需要htmlspecialchars(),因为它不会直接输出到 HTML 中。

3. 验证逻辑

$errors = []; // 用于收集所有错误

姓名验证:检查姓名是否为空,因为这是必填字段。

if (empty($name)) {
    $errors[] = "姓名是必填的!";
}

密码验证:检查密码是否为空、检查密码长度是否至少6个字符。

if (empty($name)) {
    $errors[] = "姓名是必填的!";
}

性别验证:检查是否选择了性别、检查性别值是否在允许的范围内(防止前端被篡改)。

if (empty($gender)) {
    $errors[] = "请选择性别!";
} elseif (!in_array($gender, ['male', 'female', 'other'])) {
    $errors[] = "请选择有效的性别选项!";
}

邮箱验证:检查邮箱是否为空、使用 PHP 内置的filter_var函数验证邮箱格式。

if (empty($email)) {
    $errors[] = "邮箱是必填的!";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = "请输入有效的邮箱地址!";
}

备注验证:验证备注字数,避免用户禁用 JavaScript 绕过前端验证,也可能通过 API 直接提交数据。

if (strlen($remarks) > 500) {
    $errors[] = "备注内容不能超过500个字符!";
}

4. 错误处理

if (!empty($errors)) {
    foreach ($errors as $error) {
        echo "<p>错误:$error</p>";
    }
}

如果有错误,循环显示所有错误信息。这样用户可以一次性看到所有需要修正的地方。

5. 成功处理

echo "<h2>感谢您的提交,$name!</h2>";
echo "<p>我们已收到您的信息:</p>";
echo "<ul>";
echo "<li>姓名:$name</li>";
echo "<li>性别:" . ($gender === 'male' ? '男' : ($gender === 'female' ? '女' : '其他')) . "</li>";
echo "<li>邮箱:$email</li>";
if (!empty($remarks)) {
    echo "<li>备注:" . nl2br($remarks) . "</li>";
}
echo "</ul>";
  • 显示友好的成功消息
  • 使用三元运算符将英文性别值转换为中文显示
  • nl2br()函数将备注中的换行符转换为 <br> 标签,保持格式
  • 只有当备注不为空时才显示备注信息


评论区 0
发表评论