CodeIgniter, руководство пользователя к версии 1.6.1


Проверка данных web-форм

Вот примерный сценарий взаимодействия с пользователем с помощью форм :

  1. Показ форм .
  2. Заполнение ее и отправка пользователем
  3. Если заполнены не все необходимые поля или данные имеют не тот формат - показываем сообщение об ошибке и возвращаем данные пользователю для последующей правки.
  4. Этот процесс продолжается, пока сервер не получит верные данные

После приема формы следует :

  1. Проверить, заполнены ли все поля .
  2. Убедится, что данные нужного формата и не содержат посторонних символов . (Например, имя пользователя может содержать только буквы. Если уже с таким именем есть пользователь, следует вывести об этом сообщение. И т.д. )
  3. Фильтрация данных для безопасности (защита от XSS/SQL-inj и пр.)
  4. Переформатирование данных (Напр., данные имеют разметку).
  5. Подготовить данные к добавлению в БД.

Хотя приведенный алгоритм прост, это требует значительного количества кода и логики, что бы предусмотреть все случаи. Если создавать систему валидации "с нуля", то это очень утомительная и грязная работа.

CodeIgniter представляет фреймворк, который способен сократить объемы готового кода. Он также имеет готовое решение для валидации форм.

Обзор системы

Для проверки данных с помощью CodeIgniter'а нужны три вещи:

  1. Файл отображения с формой .
  2. Файл должен содержать сообщение об успешной проверке .
  3. А так же контроллер для получения и обработки данных.

Рассмотрим пример на основе создания формы входа .

Форма

Создадим файл myform.php и разместим его в папке applications/views/:

Сообщение об успешной проверке

Теперь создадим файл formsuccess.php и так же сохраним в папке applications/views/:

Контроллер

В папке applications/controllers/ создадим контроллер form.php.

Пробуем!

Теперь для проверки примера следует ввести примерно такой адрес :

www.your-site.com/index.php/form/

Если Вы отправили форму, то увидите только ее обновление. Это произойдет из-за того, что мы не указали ни одного правила проверки данных.

Объяснение

Вы могли заметить некоторые необычные детали в приведенном коде :

Форма (myform.php) стандартная веб-форма, содержащая некоторые изменения:

  1. Для "открытия" формы используется хелпер form . В принципе, это не обязательно - можно сделать это же и средствами HTML. Но тогда следует знать точный адрес к контроллеру, что может сказаться в следующих версиях скрипта лишними проблемами.
  2. Вверху формы было добавлено следующее выражение: <?=$this->validation->error_string; ?>

    Этот код показывает текст ошибки при возврате формы пользователю. Если ошибок не было, поле останется пустым.

Контроллер (form.php) имеет одну функцию: index(). Она инициализирует контроллер, загружает хелпер form and URL хелпер, а так же запускает процесс валидации. На основе результатов проверки будет отображена страница успешного выполнения или сообщение об ошибке.

Пока мы не указываем никаких условий, функция возвращает "false" (boolean false). Функция run() возвращает "true" если правила проверки успешно применены.

Установка правил проверки данных

CodeIgniter позволяет устанавливать неограниченное число правил проверки. Рассмотрим пример.

В контроллере (form.php) добавьте следующий код после функции инициализации:

$rules['username'] = "required";
$rules['password'] = "required";
$rules['passconf'] = "required";
$rules['email'] = "required";

$this->validation->set_rules($rules);

Теперь контроллер будет иметь вид:

Теперь отправьте форму с пустыми полями - появится сообщение об ошибке.

Примечание: на данный момент мы не возвращали поля формы при ошибке. Это будет рассмотрено далее.

Изменение оформления ошибки

По умолчанию ошибки заключаются в тег <p>. Можно изменить способ оформления, воспользовавшись этим кодом :

$this->validation->set_error_delimiters('<div class="error">', '</div>');

В нашем примере, текст ошибки будет заключен в тег <div>

Расширение правил

CodeIgniter позволяет объединять условия проверки. Например:

$rules['username'] = "required|min_length[5]|max_length[12]";
$rules['password'] = "required|matches[passconf]";
$rules['passconf'] = "required";
$rules['email'] = "required|valid_email";

Эти правила указывают :

  1. Длина поля username должна быть от 5 до 12 символов.
  2. Пароль должен совпадать в обоих полях .
  3. Поле email должно содержать корректный адрес.

Примечание: Нумерованные правила так же доступны для использования.

Подготовка данных

В дополнение к проверки данные можно подготовить определенным образом и отфильтровать :

$rules['username'] = "trim|required|min_length[5]|max_length[12]|xss_clean";
$rules['password'] = "trim|required|matches[passconf]|md5";
$rules['passconf'] = "trim|required";
$rules['email'] = "trim|required|valid_email";

В этом коде мы обрезаем пробелы на концах строк, переводим пароль в MD5-хеш, и запускаем функцию фильтрации "xss_clean", удаляющую вредоносный код .

Любая функция PHP должна иметь только один параметр, для использования при проверке. Напр., htmlspecialchars, trim, MD5.

Примечание: Остальные способы обработки следует использовать после проверки соответствия правилам, так как в случае ошибки мы решили возвращать данные пользователю.

Callbacks: создание собственных правил

Система валидации поддерживает использование Ваших функций проверки данных. Это позволяет расширить способы обработки. Например, можно создать функцию проверки логина на уникальность - нет ли пользователя с таким же логином в БД? Рассмотрим создание своих правил на примере.

В контроллере измените правило для поля "username" на следующее:

$rules['username'] = "callback_username_check";

Добавим новую функцию username_check в ваш контроллер. Теперь он будет иметь следующий вид:

Обновите форму и введите в поле "Логин" слово "test". Вы увидите сообщение об ошибке, сгенерированное нашей функцией.

Для использования своих функций следует применять префикс "callback_" в правилах .

Описание ошибки задается функцией $this->validation->set_message. Для этого следует указать название функции первым параметром, а текст - вторым.

Важно: Вы так же можете изменять сообщения других функций. Напр, для правила "required" сделаем следующее:

$this->validation->set_message('required', 'Ваше сообщение об ошибке');

Перезаполнение формы

Если произошла ошибка при проверке, то следует перезаполнить поля формы. Для этого вставьте данный код после правил:

$fields['username'] = 'Username';
$fields['password'] = 'Password';
$fields['passconf'] = 'Password Confirmation';
$fields['email'] = 'Email Address';

$this->validation->set_fields($fields);

Где ключи массива - реальные названия полей..

Функция index() теперь должна выглядеть так:

Откройте myform.php вьювер и вставьте этот код:

Теперь обновите форму и введите заранее неверные данные. В описании ошибки увидите названия форм.

Раздельный показ ошибок

Если Вы желаете выводить ошибки около поля, где она произошла, то измените форму таким образом:

Если не произойдет ошибки, то ничего не появится. Иначе у поля с ошибкой будет ее описание ( по умолчанию в тегах <p>).

Примечание: Текст ошибки будет доступен по вызову с постфиксом "_error". Например, ошибка в поле "username" отображается так:
$this->validation->username_error.

Описание правил

Следующая таблица содержит описания стандартных правил для проверки :

Правило Параметр Описание Пример
required No Возвращает FALSE если поле не заполнено  
matches Yes Возвращает FALSE если элемент не соответствует значению другого элемента matches[form_item]
min_length Yes Возвращает FALSE если значение короче указанного min_length[6]
max_length Yes Возвращает FALSE если длина больше указанной max_length[12]
exact_length Yes Возвращает FALSE если длина не равна заданной exact_length[8]
alpha No Возвращает FALSE если элемент содержит не только буквы  
alpha_numeric No Возвращает FALSE если элемент содержит не только буквы и цифры  
alpha_dash No Возвращает FALSE если элемент содержит не только буквы и знаки препинания.  
numeric No Возвращает FALSE если значение не числового вида  
integer No Возвращает FALSE если значение не является целым числом  
valid_email No Возвращает FALSE если значения не является корректным e-mail адресом  
valid_ip No Возвращает FALSE если IP-адрес не является действительным.  
valid_base64 No Возвращает FALSE если строка не является base-64 шифром  

Примечание: Эти правила могут вызываться как функции. Например:

$this->validation->required($string);

Примечание: Можно использовать стандартные PHP функции, требующие один параметр.

Описание фильтров

Доступны по умолчанию следующие фильтры:

Имя Параметр Описание
xss_clean No Проводит фильтр на XSS-уязвимость, используемый в классе Input
prep_for_form No Конвертирует HTML-элементы в их альтернативное значение для отображения
prep_url No Добавляет "http://" к URL при надобности
strip_image_tags No Извлекает URL из ссылки на картинку
encode_php_tags No Конвертирует теги php в текст

Примечание: Можно использовать стандартные PHP функции, требующие один параметр, напр. trim, htmlspecialchars, urldecode

Установка своих сообщений об ошибках

Все стандартные сообщения расположены по адресу : language/english/validation_lang.php

Для установки своего описания к правилу используйте следующую функцию

$this->validation->set_message('rule', 'Error Message');

Где rule это имя правила, а Error Message - описание ошибки.

Работа с выпадающими списками, одиночными и мульти маркерами

Класс Validation имеет три функции, позволяющие работать с этими элементами:

set_select()

Позволяет выбирать значение из списка. Параметры: имя меню и значение. Например:

<select name="myselect">
<option value="one" <?= $this->validation->set_select('myselect', 'one'); ?> >One</option>
<option value="two" <?= $this->validation->set_select('myselect', 'two'); ?> >Two</option>
<option value="three" <?= $this->validation->set_select('myselect', 'three'); ?> >Three</option>
</select>

set_checkbox()

Позволяет устанавливать значение чекбокса (маркера) Параметры: имя маркера и значение. Например:

<input type="checkbox" name="mycheck" value="1" <?= $this->validation->set_checkbox('mycheck', '1'); ?> />

set_radio()

Позволяет устанавливать значение радиобокса (мультимаркера) Параметры: имя маркера и значение. Например:

<input type="radio" name="myradio" value="1" <?= $this->validation->set_radio('myradio', '1'); ?> />