|  |  |  | 
|  |  | 
 
Правильная" проверка заполнения формы пользователем.
Наверняка при заполнении форм Вам приходилось сталкиваться с такой ситуацией: минут десять заполняешь огромное количество полей, переключаясь на русский/английский, переписываешь откуда-то данные, нажимаешь "Отправить" и ….. "Вы неправильно заполнили одно или несколько полей". Хорошо если не отключено кеширование - кнопкой браузера "Назад" можно вернуться на предыдущую страницу и исправить ошибки. Но довольно часто кеширование все же отключено и при возврате пользователь видит опять форму, на которую он потратил минут десять, но с пустыми полями. Большая часть пользователей просто уйдет с такого сайта и вряд ли когда вернется. 
Для "правильной" проверки заполнения формы воспользуемся механизмом сессий в PHP. Что это такое и как его правильно использовать можно прочитать на www.php.spb.ru . Можно обойтись и без сессий, но имхо, это самый красивый и элегантный способ. 
Допустим нам необходимо зарегистрировать пользователя на сайте. 
Создаем простую форму для ввода данных.
Файл adduser.php 
  
    | <?php session_name("ses1");
 session_start();
 session_register("err", "adat");
 //Эта часть кода и открывает сессию ses1 в PHP. Оператор session_name можно вообще опустить и имя сессии
 //будет присвоено автоматически, но именовать сессию считается хорошим стилем.
 //В сессии мы регистрируем две переменных-массива "err" и "adat".
 //В массиве "err" мы будем хранить список найденых при обработке формы ошибок, а в массиве "adat"
 //сами данные, введенные пользователем.
 ?>
 <html>
 <head>
 <title>Регистрация нового пользователя</title>
 </head>
 <body>
 <?php
 //ВЫВОД ОШИБОК
 if (count($err)>0){
 foreach ($err as $key => $msg) echo "$msg <BR>";
 //Простейший цикл вывода всех значений массива
 $err=array();
 unset($err);
 //После вывода очистим массив ошибок
 }
 //Конец "ВЫВОД ОШИБОК"
 //В этой части сценария мы будем выводить ошибки, найденные при обработке формы.
 //При первой загрузке формы массив $err пустой (count($err)=0) и никакие данные не выводятся.
 
 //Здесь идет сама форма ввода данных.
 echo("<TABLE width=\"100%\" cellpadding=0 cellspacing=0 align=center border=0>");
 echo(" <TR><TD align=center>");
 echo(" <FORM METHOD=post ACTION=\"adduseract.php\">");
 echo(" <table cellpadding=5 cellspacing=0 width=\"90%\" align=center>");
 echo("  <tr valign=top>");
 echo("    <td align=left>Имя:</td>");
 echo("    <td> <input name=au_name size=35 maxlength=100 class=button value='$adat[au_name]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>Отчество:</td>");
 echo("    <td> <input name=au_sname size=35 maxlength=100 class=button value='$adat[au_sname]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>Фамилия*:</td>");
 echo("    <td> <input name=au_famil size=35 maxlength=100 class=button value='$adat[au_famil]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>E-mail*:</td>");
 echo("    <td> <input name=au_email size=35 maxlength=100 class=button value='$adat[au_email]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>Индекс:</td>");
 echo("    <td> <input name=au_index size=6 maxlength=6 class=button value='$adat[au_index]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>Адрес:</td>");
 echo("    <td> <input name=au_adress size=35 maxlength=255 class=button value='$adat[au_adress]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>ФИО получателя:</td>");
 echo("    <td> <input name=au_fio size=35 maxlength=255 class=button value='$adat[au_fio]'></td></tr>");
 echo("  <tr valign=top>");
 echo("    <td align=left>Контактный телефон:</td>");
 echo("    <td> <input name=au_tel size=35 maxlength=100 class=button value='$adat[au_tel]'></td></tr>");
 echo("</table>");
 echo("<input type=\"submit\" name=\"ok\" value=\"Добавить\" class=button>");
 echo("</form>");
 echo("</TD></TR>");
 echo("</TABLE>");
 //В параметре value всех элементов формы стоит значение элемента массива $adat.
 //При первой загрузке формы массив пустой и соответственно все значения тоже пустые.
 ?>
 
 </body>
 </html>
 
 |  
Обрабатывается форма скриптом adduseract.php. Этот скрипт ничего не выводит в браузер и не содержит никакого HTML кода.
Файл adduseract.php 
  На самом деле, Вы можете перенаправить пользователя на любую страницу Вашего сайта.
    | <? php session_name("ses1");
 session_start();
 session_register("err", "adat");
 //Эта часть кода и открывает сессию ses1 в PHP.
 //Нигде явно это не описано, но если Вы используете сессии, то эти строчки должны присутствовать в каждом файле.
 
 $HTTP_HOST="www.ваш_домен.ru";
 //Присвоим переменной $HTTP_HOST имя вашего домена (URL до корневого каталога вашего сервера)
 
 //Проверка корректности введенных данных
 if (empty($au_famil)){$err[]="Поле <b>\"Фамилия\"</b> обязательно для заполнения";}
 if(!preg_match("/^([A-Z_,a-z_,0-9_,-])+\@([A-Z_,a-z_,0-9_,-])+(\.([A-Z,a-z,0-9])+)+$/", $au_email))
 {$err[]= "Неверно заполнено или пустое поле: <b>\"E-mail\"</b>";}
 if (!empty($au_index)) {
 if (!(ereg("^[0-9]{6}$",$au_index))) {$err[]= "Неверно заполнено поле: <b>\"Индекс\"</b>";}
 }
 //Здесь мы проверяем правильность заполнения полей формы.
 //Если поле заполнено не правильно, мы добавляем в массив $err новый элемент,
 //который будет показан вверху формы adduser.php.
 //Например, если пользователь ошибся в указании своего эл.адреса (или вообще оставил поле пустым),
 //мы добавим в массив новый элемент
 //$err[]= "Неверно заполнено или пустое поле: <b>\"E-mail\"</b>"
 
 if (count($err)>0) {//ОШИБКИ
 $adat[au_name]=$au_name;
 $adat[au_sname]=$au_sname;
 $adat[au_famil]=$au_famil;
 $adat[au_email]=$au_email;
 $adat[au_index]=$au_index;
 $adat[au_adress]=$au_adress;
 $adat[au_fio]=$au_fio;
 $adat[au_tel]=$au_tel;
 header("Location: http://$HTTP_HOST/adduser.php");
 exit();
 }
 //Если были обнаружены ошибки при заполнении формы, то количество элементов массива
 //будет больше 0 (count($err)>0).
 //В ассоциативном массиве $adat мы сохраним данные, которые ввел пользователь,
 //чтобы потом подставить их в параметр value соответсвующих полей формы adduser.php
 //Оператор header("Location: http://$HTTP_HOST/adduser.php") возвращает пользователя
 // опять к странице заполнения формы.
 
 //ОШИБОК НЕ НАЙДЕНО
 //Если пользователь ввел верные данные, мы обрабатываем их в соответсвии
 //с логикой программы.
 //Следующие несколько закомментированных строк приведены просто в качестве примера
 //т.е. в данном случае данные пользователя заносятся в БД.
 
 /*$d=date(d); $m=date(m); $y=date(Y);
 $au_date= $y.$m.$d;
 $addstmt = "Insert into $T_AUSER SET au_name='$au_name', au_sname='$au_sname', au_famil='$au_famil',
 au_email='$au_email', au_index='$au_index', au_adress='$au_adress', au_fio='$au_fio',
 au_tel='$au_tel', au_date='$au_date', au_status='0'";
 connectdb();
 if (!mysql_query($addstmt, $link)) {
 DisplayErrMsg(sprintf("Ошибка записи в БД %s %s %d:%s\n",$DB, $T_AUSER, mysql_errno($link), mysql_error($link)));
 exit();}*/
 
 $adat=array();
 unset($adat);
 //Убираем все элементы элементы из массива $adat
 //и уничтожаем его
 
 $err[]="Ваши данные успешно добавлены. Спасибо за регистрацию.";
 //В массив  $err добавляем единственный "хороший" элемент,
 //который будет показан вверху формы adduser.php.
 header("Location: http://$HTTP_HOST/adduser.php");
 //Отправляем пользователя на страницу заполнения формы.
 //Поля окажутся пустыми (мы уничтожили массив $adat),
 //А вверху формы будет выведено -
 //"Ваши данные успешно добавлены. Спасибо за регистрацию."
 ?>
 
 |  Например, header("Location: http://$HTTP_HOST/index.php")
 отправит пользователя на главную страницу.
 Если на этой странице будет конструкция
 <?php
 //ВЫВОД ОШИБОК
 if (count($err)>0){
 foreach ($err as $key => $msg) echo "$msg <BR>";
 $err=array();
 unset($err);}
 //Конец "ВЫВОД ОШИБОК"
 ?>
 и открыта сессия sess1,
 то пользователь и там увидит сообщение
 "Ваши данные успешно добавлены. Спасибо за регистрацию."
 
 
Очень важно: открытие сессии должно предшествовать любому выводу в браузер и посылку заголовков. Т.е. для правильной работы не переносите операторы работы с сессией никуда из начала скрипта. 
Скрипты можно доработать и информация о ошибке будет выводится непосредственно рядом с полем, в которое пользователь ввел неверные данные. Для этого достаточно сделать массив $err ассоциативным и в качестве ключей использовать названия полей (как в массиве $adat). Около названия поля (в месте где должна выводится ошибка) необходимо вставить код, выводящий нужный элемент массива.
 
Как видно, все довольно просто. Несколько "лишних" строчек кода уберегут нервы посетителей вашего сайта и может даже вызовут чувство благодарности создателям.
По все вопросам можете обращаться admin@lizart.ru 
При перепечатке ссылка на автора обязательна. 
© 2003 Vlad Likholetov 
 
Комментарии
 
 |  |  |  |  |