PHP 数据验证:完整指南及代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP 数据验证:从简单检查到专业解决方案



数据验证是安全稳定 Web 应用程序的基石之一。PHP 提供了许多内置工具,可以高效地检查用户输入。在本文中,我们将介绍从简单函数到强大库的主要方法,并展示实际示例。



为什么需要验证?

任何接受用户数据(表单、API、URL 参数)的应用程序都必须检查其正确性。这有助于:

  • 防止 SQL 注入和 XSS 攻击
  • 确保数据库中数据的完整性
  • 改善用户体验(清晰的错误提示)
  • 避免应用程序中的逻辑错误


PHP 内置验证函数

PHP 提供了几个简单但有效的函数用于基本数据检查:



1. 空值检查:empty() 和 isset()

// 检查字段是否为空$name = trim($_POST['name'] ?? '');if (empty($name)) {    echo "姓名为必填项";}

// 检查变量是否存在if (!isset($_POST['email'])) { echo "未传递 email 字段";}


2. 过滤器:filter_var()

这可能是验证常见数据类型最方便的内置机制:

$email = "user@example.com";if (filter_var($email, FILTER_VALIDATE_EMAIL)) {    echo "邮箱格式正确";} else {    echo "邮箱格式错误";}

// 其他有用的过滤器:$url = "https://pythonlib.ru";if (filter_var($url, FILTER_VALIDATE_URL)) { echo "URL 格式正确";}

$ip = "192.168.1.1";if (filter_var($ip, FILTER_VALIDATE_IP)) { echo "IP 地址格式正确";}

// 整数过滤器$age = 25;if (filter_var($age, FILTER_VALIDATE_INT, ["options" => ["min_range" => 1, "max_range" => 120]])) { echo "年龄有效";}


用于复杂验证的正则表达式

当标准过滤器不够用时,正则表达式就派上用场了。preg_match() 函数允许您根据任何模式检查数据:

// 检查电话号码(俄罗斯格式)$phone = "+7 (999) 123-45-67";$pattern = '/^\\+7\\s?\\(\\d{3}\\)\\s?\\d{3}-\\d{2}-\\d{2}$/';if (preg_match($pattern, $phone)) {    echo "电话号码格式正确";} else {    echo "电话号码格式错误";}

// 检查密码(至少 8 个字符,至少一个数字和一个字母)$password = "MyPass123";$pattern = '/^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$/';if (preg_match($pattern, $password)) { echo "密码强度足够";} else { echo "密码不符合要求";}


验证库:当项目变得复杂时

对于大型项目(框架、CMS),手动验证变得不方便。这时就需要专门的库。我们来看看两个最流行的:



1. Symfony Validator

它是 Symfony 生态系统的一部分,但也可以单独使用。它允许通过注解或 YAML/XML 描述验证规则:

use Symfony\\Component\\Validator\\Validation;use Symfony\\Component\\Validator\\Constraints as Assert;

class User { /** * @Assert\\NotBlank(message="姓名不能为空") * @Assert\\Length(min=2, max=50) */ public $name; /** * @Assert\\Email(message="邮箱格式错误") */ public $email;}

// 使用$validator = Validation::createValidatorBuilder() ->enableAnnotationMapping() ->getValidator();

$user = new User();$user->name = "A";$user->email = "invalid-email";

$errors = $validator->validate($user);if (count($errors) > 0) { foreach ($errors as $error) { echo $error->getMessage() . "<br>"; }}

推荐