Skip to content

PHP 表单必填项

本章演示如何使用 PHP 在 HTML 表单中强制要求输入特定字段,并显示用户友好的错误消息。

在许多 Web 表单中,某些信息是必不可少的。例如,用户注册通常需要姓名和电子邮件,而结账表单需要地址详情。我们将这些字段标记为“必填”。

我们来定义一个示例表单的验证规则:

字段验证规则
姓名必填。必须只包含字母和空格。
电子邮件必填。必须包含有效的电子邮件地址格式。
网址可选。如果提供,必须是有效的 URL。
评论可选。多行文本输入。
性别必填。必须选择一个选项。

在之前的示例中,所有字段可能都是可选的。现在,我们将确保必填字段(“姓名”、“电子邮件”、“性别”)不会被空提交。

为了管理这一点,我们将引入变量来保存潜在的错误消息(例如 $nameErr、$emailErr、$genderErr)。在表单提交时,我们将检查每个对应的 $_POST 值。PHP 的 empty() 函数在这里很有用。如果必填字段为空,我们存储一个错误消息。否则,我们在使用输入之前使用辅助函数(如 sanitizeInput)对其进行净化处理。

注意使用 === "POST" 进行更严格的比较,以及使用 filter_var() 进行内置的电子邮件和 URL 验证,对于这些常见任务来说,这通常比自定义正则表达式更可靠。

现在,我们来修改 HTML 表单,以便在相应字段旁边显示这些错误消息。我们在 <span> 标签中使用简单的 PHP echo 语句(通常使用 CSS 设置样式以显示为红色)。htmlspecialchars($_SERVER["PHP_SELF"]) 确保表单安全地提交到同一页面,防止跨站脚本 (XSS) 漏洞。

<!DOCTYPE html>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name" value="<?php echo htmlspecialchars($name);?>">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail: <input type="text" name="email" value="<?php echo htmlspecialchars($email);?>">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
Website: <input type="text" name="website" value="<?php echo htmlspecialchars($website);?>">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
Comment: <textarea name="comment" rows="5" cols="40"><?php echo htmlspecialchars($comment);?></textarea>
<br><br>
Gender:
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">Female
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">Male
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="other") echo "checked";?> value="other">Other
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
// Optional: Display submitted data after successful validation
if ($_SERVER["REQUEST_METHOD"] === "POST" && empty($nameErr) && empty($emailErr) && empty($genderErr) && empty($websiteErr)) {
echo "<h2>Your Input:</h2>";
echo "Name: " . $name . "<br>";
echo "Email: " . $email . "<br>";
echo "Website: " . $website . "<br>";
echo "Comment: " . $comment . "<br>";
echo "Gender: " . $gender;
}
?>
</body>
</html>

表单中的关键改进:

  • 在输入字段中添加了 value="<?php echo htmlspecialchars($variable);?>",以便用提交的数据重新填充表单(粘滞表单),从而改善用户体验。
  • 在将用户数据回显到表单时使用 htmlspecialchars(),以防止 XSS。
  • 改进了单选按钮的处理,以在提交后正确显示选定的选项。
  • 添加了一个部分,仅在没有验证错误时显示提交的数据。

下一步涉及完善验证逻辑。例如,使用正则表达式 (preg_match()) 确保“姓名”字段确实只包含字母和空格,或者使用 filter_var() 检查“网址”(如果提供)是否具有有效的 URL 结构。