PHP framework CodeIgniter. Проверка данных из форм

В этой статье я хочу рассказать о возможностях, которые предоставляет CodeIgniter для работы с данными форм. Несмотря на то, что обработка этих данных довольно простая, она включает множество проверок и для больших форм выливается в приличный кусок кода.
Каждый раз заново изобретать велосипед естественно никто не хочет, поэтому библиотек для решения этих задач существует просто немеряно.
Практически каждый фрэймворк предлагает свое решение этой задачи. И CodeIgniter тут не исключение. Возможно, его решение не идеальное, но, тем не менее, достаточно эффективное и удобное в использовании.
Рассмотрим небольшой пример. Допустим, у нас есть страница (userdata) с формой, содержащей поля для ввода личных данных. Если посетитель правильно заполнил форму, мы должны отправить его на главную страницу сайта (index). Если были допущены ошибки – показать их описание и предложить заполнить форму еще раз.
Естественно, доступ к обеим страницам осуществляется через контроллер, а их адреса выглядят так: www.site.com/index.php/main/index и www.site.com/index.php/main/userform.
Примечание. Подробнее почитать о навигации в CodeIgniter можно в статье «CodeIgniter: контроллер и представления».
Т.е. на данном этапе контроллер выглядит так:
-
class Main extends Controller {
-
-
function Main()
-
-
{
-
-
parent::Controller();
-
-
}
-
-
function index()
-
-
{
-
-
$this->load->view('index');
-
-
}
-
-
function userdata() {
-
-
$this->load->view('userdata');
-
-
}
-
-
}
Добавляем в контроллер метод, который будет выполнять проверку данных:
-
function checkdata() {
-
-
$this->load->library('validation');
-
-
}
На данном этапе этот метод только загружает встроенную библиотеку 'validation', которая и будет выполнять проверку.
Теперь рассмотрим саму форму:
-
-
<p>Ник: <input type="text" name="usernic" id="usernic" /></p>
-
-
<p>Полное имя: <input type="text" name="fullname" id="fullname" /></p>
-
-
<p>eMail: <input type="text" name="usermail" id="usermail" /></p>
-
-
<p><input type="submit" id="sendbtn" value="Отправить" /></p>
-
-
</form>
Сразу обратите внимание первую строку. Здесь для создания открывающего формы использована функция form_open. Главное преимущество от использования этой функции в том, что она формирует ссылку в параметре action. Ссылка составляется из трех частей: значений переменных $config['base_url'] и $config['index_page'], которые задаются в файле /application/config/config.php, и параметра функции (в котором мы передали имена контроллера и метода, выполняющего обработку).
Примечание. Для использования form_open необходимо загрузить Form Helper
-
$this->load->helper('form');
Сама форма содержит три поля, в которые посетитель должен ввести свои данные (ник, полное имя и адрес почты). После нажатия на кнопку «Отправить» данные отсылаются на URL www.site.com/index.php/main/checkdata. По-умолчанию, отправка осуществляется методом POST.
Теперь переходим непосредственно к проверке.
Принцип работы библиотеки validation следующий. Вы создаете правила для каждого поля формы, а затем выполняете проверку соответствия полученных значений этим правилам.
Посмотрим, как это будет выглядеть для нашего примера.
-
function checkdata() {
-
-
$this->load->library('validation'); $rules['usernic'] = "trim|required|min_length[3]";
-
-
$rules['fullname'] = "trim|required";
-
-
$rules['usermail'] = "trim|required|valid_email";
-
-
$this->validation->set_rules($rules);
-
-
if ($this->validation->run() === TRUE) {
-
-
//сохраняем введенные данные (например, в БД)
-
-
//……….
-
-
//отправляем пользователя на главную страницу
-
-
$this->load->view('index');
-
-
}
-
-
else {
-
-
$this->load->helper('form');
-
-
$this->load->view('userdata');
-
-
}
-
-
}
В строках 4-6 мы объявили массив с правилами. Ключи массива должны иметь такие же названия, как и поля формы (совпадать с аттрибутом name), а значения – это просто строки с перечнем правил, которые будут применяться к полю (в качестве разделителя используется «|»).
Теперь рассмотрим правила, которые мы использовали:
trim – удаляет пробелы в начале и конце полученной строки;
required – указывает, что поле должно быть заполнено;
min_length[3] – указывает, что длина полученного значения должна быть не меньше 3;
valid_email – указывает, что полученное значение должно быть адресом eMail.
Естественно, это далеко не все правила. Подробный перечень можно посмотреть здесь. Кроме того, в качестве правил можно использовать php функции, которые принимают один параметр.
В строке 8 с помощью метода set_rules мы устанавливаем правила, а в строке 10 – выполняем проверку (метод run).
После этого, в зависимости от результатов проверки, мы отправляем посетителя либо на главную страницу, либо показываем форму еще раз.
В принципе, на данном этапе мы уже выполнили проверку. Но если посетитель допустит ошибку, то он не будет знать, в чем она заключается.
Кроме того, ошибка может быть только в одном из полей. Поэтому, нам нужно заполнить все остальные поля, чтобы посетитель не вводил их заново.
Для решения этих задач нужно выполнить две операции.
1) В контроллере с помощью метода set_fields указать поля, информация о которых нам нужна:
-
$fields['usernic'] = "ник";
-
-
$fields['fullname'] = "полное имя";
-
-
$fields['usermail'] = "адрес email";$this->validation->set_fields($fields);
В первом параметре методу передается массив с параметрами. Ключи элементов массива должны совпадать с именами полей формы, а значения – просто текстовые описания полей (используются при выводе сообщений об ошибках).
2) В представлении (userdata.php) вывести сообщения об ошибках и задать значения для правильно заполненных полей.
-
-
<p>
-
-
-
Ник: <input type="text" name="usernic" id="usernic"
-
-
value="<?php echo $this->validation->usernic; ?>" /></p>
-
-
<p>
-
-
-
Полное имя: <input type="text" name="fullname" id="fullname"
-
-
value="<?php echo $this->validation->fullname; ?>" /></p>
-
-
<p>
-
-
-
eMail: <input type="text" name="usermail" id="usermail"
-
-
value="<?php echo $this->validation->usermail; ?>" /></p>
-
-
<p><input type="submit" id="sendbtn" value="Отправить" /></p>
-
-
</form>
Как видите, перед каждым полем мы добавили:
Эти переменные создает CodeIdniter. Если поле заполнено правильно, то переменная будет содержать пустую строку и посетитель ничего не увидит.
Переменные $this->validation->имя_поля содержат введенные значения. Таким образом, присваивая их атрибуту value, мы заполняем поля предыдущими значениями.
Примечание. Для того, чтобы при первоначальном появлении формы не появлялись сообщения об ошибках, поля должны быть установлены во всех методах контроллера, которые будут отображать форму. В нашем случае это userdata и checkdata.
Примечание. Описание ошибок по-умолчанию отображаются на английском языке. Но, естественно, это несложно исправить, т.к. для стандартных библиотек фрэймворка существуют уже готовые файлы переводов. Подробнее об этом можно почитать в статье «Создание многоязычных сайтов с помощью CodeIgniter».
Создание собственных правил.
Предусмотреть все возможные ситуации невозможно. Поэтому CodeIdniter предоставляет вам возможность создать собственные правила обработки данных из форм.
Допустим, мы не хотим, чтобы два посетителя сайта имели одинаковые ники. Предполагается, что у нашего сайта есть база данных, в которой мы храним информацию о пользователях.
Естественно, стандартные правила проверки тут нам не помогут, поэтому мы должны написать собственный метод для проверки.
Посмотрим, как этот метод может выглядеть:
-
function checknic($nic) {
-
-
//тут должен быть запрос к БД, который ищет
-
-
//пользователя с именем $nic.
-
-
//……..
-
-
//если пользователь найден
-
-
if ($nic_exists === TRUE) {
-
-
$this->validation->set_message('checknic',
-
-
'Пользователь с таким ником уже существует');
-
-
return false;
-
-
}
-
-
else {
-
-
return true;
-
-
}
-
-
}
Как видите, этот метод должен возвращать true в случае успешной проверки и false – если найдена ошибка (в данном случае ошибкой считается совпадение ника с уже существующим).
После этого, мы можем использовать имя этого метода (с приставкой callback_) в качестве правила.
-
$rules['usernic'] = "required|min_length[3]|callback_checknic";
Теперь соберем все вместе.
Контроллер (main.php):
-
class Main extends Controller { function Main()
-
-
{
-
-
parent::Controller();
-
-
}
-
-
function index()
-
-
{
-
-
$this->load->view('index');
-
-
}
-
-
function userdata() {
-
-
$this->load->library('validation');
-
-
$fields['usernic'] = "ник";
-
-
$fields['fullname'] = "полное имя";
-
-
$fields['usermail'] = "адрес email";
-
-
$this->validation->set_fields($fields);
-
-
$this->load->helper('form');
-
-
$this->load->view('userdata');
-
-
}
-
-
function checkdata() {
-
-
$this->load->library('validation');
-
-
$rules['usernic'] = "required|min_length[3]|callback_checknic";
-
-
$rules['fullname'] = "required";
-
-
$rules['usermail'] = "required|valid_email";
-
-
$this->validation->set_rules($rules);
-
-
$fields['usernic'] = "ник";
-
-
$fields['fullname'] = "полное имя";
-
-
$fields['usermail'] = "адрес email";
-
-
$this->validation->set_fields($fields);
-
-
if ($this->validation->run() == TRUE) {
-
-
//сохраняем введенные данные (например, в БД)
-
-
//……….
-
-
//отправляем пользователя на главную страницу
-
-
$this->load->view('index');
-
-
}
-
-
else {
-
-
$this->load->helper('form');
-
-
$this->load->view('userdata');
-
-
}
-
-
}
-
-
function checknic($nic) {
-
-
//тут должен быть запрос к БД, который ищет
-
-
//пользователя с именем $nic.
-
-
//……..
-
-
//если пользователь найден
-
-
if ($nic_exists === TRUE) {
-
-
$this->validation->set_message('checknic',
-
-
'Пользователь с таким ником уже существует');
-
-
return false;
-
-
}
-
-
else {
-
-
return true;
-
-
}
-
-
}
-
-
}
Страница с формой (userdata.php):
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
-
-
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
-
-
<head>
-
-
<title>Проверка введенных данных</title>
-
-
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
-
-
</head><body>
-
-
-
<p>
-
-
-
Ник: <input type="text" name="usernic" id="usernic"
-
-
value="<?php echo $this->validation->usernic; ?>" /></p>
-
-
<p>
-
-
-
Полное имя: <input type="text" name="fullname" id="fullname"
-
-
value="<?php echo $this->validation->fullname; ?>" /></p>
-
-
<p>
-
-
-
eMail: <input type="text" name="usermail" id="usermail"
-
-
value="<?php echo $this->validation->usermail; ?>" /></p>
-
-
<p><input type="submit" id="sendbtn" value="Отправить" /></p>
-
-
</form>
-
-
</body>
-
-
</html>
Главная страница сайта (index.php):
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
-
-
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
-
-
<head>
-
-
<title>Проверка введенных данных</title>
-
-
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
-
-
</head>
-
-
<body>
-
-
-
</body>
-
-
</html>
Как видите, пользоваться библиотекой довольно просто.
В следующий раз как выполнить эти же проверки с помощью ajax.
Понравилась статья? Подпишитесь на продолжение
!
Опубликовано в CodeIgniter, PHP
Комментарии (14)
Вы можете отслеживать обсуждение записи с помощью RSS 2.0 ![]()
Вы также можете оставить комментарий, или трекбек с Вашего сайта.
Оставить комментарий







Одна небольшая поправка -
функцию проверки следует назвать "checknic", а ее вызов в
$rules[‘usernic’] = "…|callback_checknic"
Т.е. наоборот.
Спасибо большое! Уже исправил.
Кстати, работают оба варианта… Но, буду придерживаться официальной документации.
"Для использования form_open необходимо загрузить Form Helper" - возможно невнимательно читала, но не нашла, куда вписать строку $this->load->helper(‘form’);
Так же как и любой хелпер.
Можно загрузить глобально для всего приложения. Для этого в файле application/config/autoload.php добавляем имя хелпера в массив $autoload['helper']. Имеет смысл, если хелпер используется очень часто во всех контроллерах.
Можно загрузить только для выбранного контроллера. В этом случае, $this->load->helper(‘form’); добавляем в его конструктор. Удобно если хелпер используется во всех методах этого контроллера.
Можно загрузить только для выбранного метода. $this->load->helper(‘form’); добавляем в начало нужного метода (до загрузки представления $this->load->view(…..)). Хелпер будет доступен только в данном методе.
Т.к. формы используются обычно не на всех страницах, то, наверное, лучше всего третий вариант.
Лучше не загружать хелперы и библиотеки, которые не используете, т.к. они потребляют память.
Отличная статейка!
Но я бы хотел узнать как можно осуществить провекру значения допустим <input name="id" value=?> непосредственно в момент ввода без использования методов гет и пост.
К примеру я ввёл 1 (в валюе) и сразуже у меня в строке отобразилось 1000 или допустим в другой строке (инпуте) отобразилось Первый.
Без GET и POST, проверку можно сделать на стороне браузера с помощью JavaScript.
Для этого к input'у добавляем обработчик события
<input id="field1" … onKeyPress="showVal()" />
И в заголовок страницы добавить функцию showVal() (название, конечно, может быть любое)
<script type="text/javascript">
function showVal() {
var field = document.getElementById('field1');
alert(field.value);
}
</script>
Код функции может быть любым. К содержимому поля вы получаете доступ через свойство value.
а без явы если, только если с помощью php?
и кстати сказать скрип на яве немного не правильно работает, я ввожу 1 он отображет пустое окно, когда еще раз нажимаю 1 то он отображает окно с значением 1, но в поле то ввода уже 11, а не 1
Без JavaScript не получится. Скрипт на сервере, а форма - на локальном компьютере. Чтобы скрипт что-то проверил, ему нужно отправить данные. А запрос php скрипту можно отправить либо обычным способом (кнопка submit), либо с помощью AJAX, но AJAX - это асинхронных JavaScript
.
Все там правильно
Вместо onKeyPress поставьте любое подходящее событие 
например
точнее где взять весь список действий чтобы определить из этого списка которое нужно имеено мне
Можно здесь
Ява:
function showVal() {
var field = document.getElementById('field1');
//здесь я так понял переменой присваивается значение из формы
//это не пашет, как же тогда присвоить переменой php $iddin значение field1.value
}
Мой скрипт:
$id = mysql_query("SELECT MAX(id) AS id FROM $userstable");
list($idd) = mysql_fetch_row($id);
if ($iddin>$idd){$knopka="disabled";}
else {$knopka="enabled";}
В форме:
//здесь обращение к функции
иными словами необходимо присвоить переменой php значение из формы, чтобы сразуже сверить введеное значение в форму со значением из базы
3-ий день мучаюсь не могу понять, буду очень благодарен если поставите на путь истенный
Вы путаете JavaScript (исполняется в браузере) и PHP скрипт (выполняется на сервере).
Чтобы PHP скрипт получил значение переменной, ее нужно отправить в запросе (post или get).
После того, как скрипт получит запрос, значение из поля будет находится в $_POST['имя поля'].
Если вы хотите, чтобы проверки выполнялись во время набора текста нужно использовать AJAX. Т.е. отправлять запросы из JavaScript. Например, каждый раз, когда пользователь вводит символ, JavaScript функция будет отправлять запрос серверу (php скрипту) и проверять результат.
Посмотрите этот пример (там три части).