Заполнения формы пользователем
Правильная" проверка заполнения формы пользователем.
Наверняка при заполнении форм Вам приходилось сталкиваться с такой ситуацией: минут десять заполняешь огромное количество полей, переключаясь на русский/английский, переписываешь откуда-то данные, нажимаешь "Отправить" и ….. "Вы неправильно заполнили одно или несколько полей". Хорошо если не отключено кеширование - кнопкой браузера "Назад" можно вернуться на предыдущую страницу и исправить ошибки. Но довольно часто кеширование все же отключено и при возврате пользователь видит опять форму, на которую он потратил минут десять, но с пустыми полями. Большая часть пользователей просто уйдет с такого сайта и вряд ли когда вернется.
Для "правильной" проверки заполнения формы воспользуемся механизмом сессий в 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:%sn",$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). Около названия поля (в месте где должна выводится ошибка) необходимо вставить код, выводящий нужный элемент массива.
Как видно, все довольно просто. Несколько "лишних" строчек кода уберегут нервы посетителей вашего сайта и может даже вызовут чувство благодарности создателям.
Рекомендуем почитать