Валидация данных в PHP: полное руководство с примерами кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Валидация данных в PHP: от простых проверок до профессиональных решений

Валидация данных — один из краеугольных камней безопасного и стабильного веб-приложения. В 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 "Email корректен";
} else {
    echo "Неверный формат email";
}

// Другие полезные фильтры:
$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="Неверный формат email")
     */
    public $email;
}

// Использование
$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->getValidator();

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

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

2. Respect\Validation

Лёгкая и выразительная библиотека, не требующая фреймворка. Отлично подходит для небольших проектов:

use Respect\Validation\Validator as v;

$email = "test@example.com";
$name = "John";

if (v::email()->validate($email)) {
    echo "Email корректен";
}

// Цепочки правил
$userValidator                    

Рекомендаций