PHP 完整表单实例:从 HTML 到数据验证的完整实现

表单处理的核心流程

PHP 处理表单的完整链路可拆为五个环节:HTML 结构定义 → POST 数据接收 → 输入过滤与验证 → 错误收集与回显 → 安全转义输出。下面以一个“用户注册”实例贯穿全流程。

HTML 表单结构

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
  <label>姓名:<input type="text" name="name" value="<?php echo $name; ?>"></label>
  <span class="error"><?php echo $nameErr; ?></span>
  <label>邮箱:<input type="text" name="email" value="<?php echo $email; ?>"></label>
  <span class="error"><?php echo $emailErr; ?></span>
  <label>网址:<input type="text" name="website" value="<?php echo $website; ?>"></label>
  <span class="error"><?php echo $websiteErr; ?></span>
  <label>留言:<textarea name="comment"><?php echo $comment; ?></textarea></label>
  <label>性别:
    <input type="radio" name="gender" value="female">女
    <input type="radio" name="gender" value="male">男
  </label>
  <input type="submit" value="提交">
</form>

关键点:

  • action 指向 $_SERVER['PHP_SELF'],表单提交回本页,便于统一处理验证与回显
  • 每个 input 的 value 属性都输出对应变量,实现提交失败后的数据回显
  • 错误提示紧跟在字段之后,位置明确,无需额外定位逻辑

数据接收与初始化

$name = $email = $website = $comment = $gender = "";
$nameErr = $emailErr = $websiteErr = $genderErr = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 验证逻辑在此展开
}

先声明空变量,避免首次加载页面时输出未定义变量的警告。用 REQUEST_METHOD 判断是否为 POST 提交,是区分“首次访问”与“提交后处理”的标准做法。

输入过滤与验证

必填校验与基础清理

if (empty($_POST["name"])) {
    $nameErr = "姓名是必填项";
} else {
    $name = test_input($_POST["name"]);
    if (!preg_match("/^[a-zA-Z ]*$/", $name)) {
        $nameErr = "只允许字母和空格";
    }
}

empty() 同时覆盖空字符串与未设置两种情况,适合做必填判断。

邮箱格式检查

if (empty($_POST["email"])) {
    $emailErr = "邮箱是必填项";
} else {
    $email = test_input($_POST["email"]);
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $emailErr = "邮箱格式不正确";
    }
}

优先使用 filter_var 配合 FILTER_VALIDATE_EMAIL,比手写正则更可靠,也更容易维护。

网址格式检查

if (empty($_POST["website"])) {
    $website = "";
} else {
    $website = test_input($_POST["website"]);
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website)) {
        $websiteErr = "网址格式不正确";
    }
}

网址为选填项,空值时直接置空,不触发格式校验。

安全转义函数

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

该函数依次完成三件事:

步骤 作用
trim() 去除首尾空白字符
stripslashes() 移除反斜杠转义,防止注入
htmlspecialchars() 将 <、>、& 等转为 HTML 实体,防止 XSS

验证结果汇总

if ($nameErr == "" && $emailErr == "" && $websiteErr == "" && $genderErr == "") {
    echo "<h2>提交成功</h2>";
    echo "姓名:" . $name . "<br>";
    echo "邮箱:" . $email . "<br>";
    echo "网址:" . $website . "<br>";
    echo "留言:" . $comment . "<br>";
    echo "性别:" . $gender . "<br>";
} else {
    echo "<h2>请修正以下错误</h2>";
}

所有错误变量为空才视为通过。任何一项有错误,页面继续渲染表单,已填数据通过 value 回显,用户无需重填。

常见避坑要点

  • 不要信任 $_POST 原始值:任何输出到页面的用户输入都必须经过 htmlspecialchars 转义
  • 区分必填与选填:选填字段为空时应跳过格式校验,而非报错
  • 错误提示与字段绑定:每个字段独立错误变量,避免单一错误信息无法定位问题
  • empty() 与 isset() 的选择:empty() 对 "0" 也返回 true,若字段允许输入 0,需改用 isset() 配合 trim()
  • 表单提交回本页:统一处理验证、回显与错误展示,减少状态分散

结论

PHP 表单处理的稳定写法可归纳为一条固定链路:REQUEST_METHOD 判断提交 → test_input 统一清理 → 按字段独立验证并收集错误 → 错误为空则处理数据,否则回显表单。把握住“转义输出”和“独立错误变量”两个原则,即可覆盖绝大多数表单场景。

© 版权声明

相关文章