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
发表评论
教程介绍
PHP 通用开源服务器端脚本语言,特别适用于 Web 开发,能够嵌入 HTML 中使用。
42
章节
64
阅读
0
评论
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈