Валидация данных — это процесс, при котором идет проверка данных по определенному сценарию (или паттерну) с определенным результатом: правильно или нет.
Обычно проверка данных нужна для данных, которые исходят со сторонних источников, например, от пользователей или API.
Несколько примеров, где может пригодиться проверка данных:
- Проверить если поле не было оставлено пустым
- Проверить формат телефонного номера
- Проверить если индекс адреса существует
- Проверить если поле «количество» больше нуля
Вам нужно проверять поля до того момента как они будут где-либо использоваться, так как могут нанести вред вашему сайту.
Вы можете проверить с клиентской части — JavaScript или со стороны используя PHP.
Проверка данных
Есть как минимум 3 способа проверка данных: PHP функции, основные функции в WordPress и собственное написанные правила. ниже мы рассмотри каждую из них.
PHP функции
Простые варианты проверка, которые исходят из PHP:
- isset() или empty() для проверки если значение существует и не пустое
- mb_strlen() или strlen() для проверки длинны строки
- preg_match(), strpos() для проверки определенным символов или знаков в строке
- count() для проверки количества элементов в массиве
- in_array() для проверки типа — значение массив или нет
Основные функции WordPress
WordPress предоставляет множество нужный функций, которые могу помочь в фильтрации любых данных.
- is_email() поможет проверить правильность формата почты
- term_exists() проверяет если тэг или категория существует
- username_exists() проверить если логин пользователя существует
- validate_file() проверить если путь который вы указали — это настоящий путь (но эта функция не проверяет файл на существование)
Так же загляните в официальную документацию WordPress, а точнее на функции *_exists(), *_validate() и is_*(). Не все из них используются для валидации, но многие из них вам могут помочь.
Собственные PHP и JavaScript функции
Вы можете написать собственные PHP и JavaScript функции и добавить их в свой плагин. Когда вы пишите функцию валидации, придерживайтесь формата is_*, например: is_phone, is_available, is_us_zipcode.
Лучше всего предварительно погуглить и проверить на существование нужной вам функции перед её написание, чтобы не тратить время на разработку «велосипеда».
Функция валидации должна возвращать булевое значение, правда или ложь, в зависимости проверки. Это поможет использовать функцию в условиях.
Пример первый
Давайте представим, что у вас есть индекс адреса США отправляемый пользователем.
<input id="bologer_zip_code" type="text" maxlength="10" name="bologer_zip_code">
В примере выше, поле разрешает ввод до 10 символов. Пользователь может ввести что угодно, например 123456789
или что-то плохое в виде PHP функции, которая будет запущена во время отображения в админке.
Атрибут maxlength
проверяется только в браузере, если пользователь откроет панель разработчика и уберет его, то он сможет ввести больше символов. Тем самым, нам нужно проверять длину строки повторно на стороне сервера.
Используя валидацию, мы может обезопасить себя тем, что принимает индексы только в нужном формате.
Давайте теперь создадим функцию, которая будет делать эту работу:
<?php function is_us_zip_code($zip_code) { // сценарий 1: если аргумент дали пустым if (empty($zip_code)) { return false; } // сценарий 2: проверем если длинна более 10 символов if (strlen(trim($zip_code)) > 10) { return false; } // сценарий 3: неправильный формат, проверка с помощью регульного выражения if (!preg_match('/^\d{5}(\-?\d{4})?$/', $zip_code)) { return false; } // верный формат return true; }
Когда вы проверяете форму, ваш код должен проверить поле bologer_zip_code
и делать дальнейшее действие в зависимости от результата:
if (isset($_POST['bologer_zip_code']) && is_us_zip_code($_POST['bologer_zip_code'])) { // ваше дальнейшее действие }
Пример второй
Давайте рассмотрим вариант, где вы хотите сделать запрос в базу для поиска постов и хотите дать возможность пользователю фильтровать результат.
Этот пример проверяет полученные ключи, которые хранятся в orderby
поле, на правильность относительно заранее подготовленного массива (с разрешенными значениями — author, post_author и др.) используя встроенную PHP функцию in_array
. Это препятствует пользователю отправить вредоносное значение, чтобы навредить работе сайта.
До проверки поля массивом, нужно пустить значение через WordPress функцию sanitize_key
. Эта функция проверяет, если ключ в нижнем регистре, так как функция in_array
делает проверку только в нижнем регистре.
Когда мы дописываем третий параметр для функции in_array
, мы делаем проверку более «жесткой» и проверяем тип переменной. В данном случае, мы проверяем на то, чтобы получение значение было только строкой.
<?php $allowed_keys = ['author', 'post_author', 'date', 'post_date']; $orderby = sanitize_key($_POST['orderby']); if (in_array($orderby, $allowed_keys, true)) { // изменяем поисковые параметры и делаем фильтарцию по ключу "orderby" }