php 实现表单验证
表单验证基础方法
使用内置函数和条件判断进行基础验证,例如检查空值、长度限制等:
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
$errors = [];
if (empty($name)) {
$errors['name'] = '姓名不能为空';
} elseif (strlen($name) > 50) {
$errors['name'] = '姓名长度不能超过50个字符';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['email'] = '请输入有效的邮箱地址';
}
正则表达式验证
使用preg_match进行复杂格式验证,如密码强度、手机号等:
$password = $_POST['password'] ?? '';
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/', $password)) {
$errors['password'] = '密码必须包含字母和数字,且长度至少8位';
}
文件上传验证
验证上传文件的类型、大小等属性:
$allowedTypes = ['image/jpeg', 'image/png'];
$maxSize = 2 * 1024 * 1024; // 2MB
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
if (!in_array($_FILES['avatar']['type'], $allowedTypes)) {
$errors['avatar'] = '只允许上传JPEG或PNG图片';
}
if ($_FILES['avatar']['size'] > $maxSize) {
$errors['avatar'] = '文件大小不能超过2MB';
}
}
CSRF防护
生成并验证CSRF令牌防止跨站请求伪造:
session_start();
// 生成令牌
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 验证令牌
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
die('CSRF验证失败');
}
}
使用过滤器扩展
利用filter_var函数进行多种标准验证:
$age = $_POST['age'] ?? '';
$url = $_POST['website'] ?? '';
if (!filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 100]])) {
$errors['age'] = '年龄必须在18-100之间';
}
if (!filter_var($url, FILTER_VALIDATE_URL)) {
$errors['website'] = '请输入有效的网址';
}
错误处理与显示
收集所有错误并返回给用户:
if (!empty($errors)) {
foreach ($errors as $field => $message) {
echo "<p>错误:$field - $message</p>";
}
} else {
// 处理表单数据
echo "表单验证通过,正在处理...";
}
使用验证库
推荐使用专业的验证库如Respect/Validation:
require 'vendor/autoload.php';
use Respect\Validation\Validator as v;
$validator = v::key('email', v::email())
->key('password', v::length(8, null));
try {
$validator->assert($_POST);
} catch (Exception $e) {
$errors = $e->getMessages();
}
前端与后端协同验证
虽然前端验证可以提高用户体验,但必须配合后端验证:
// 前端示例验证
document.querySelector('form').addEventListener('submit', function(e) {
let password = document.getElementById('password').value;
if (password.length < 8) {
alert('密码长度至少8位');
e.preventDefault();
}
});






