Русскоязычные документы веб-мастеру готовы к употреблению
Braer кирпич пермь узнать больше.
Где вы зарабатываете больше всего?
Яндекс.Директ
Google Adsens
Sape
Begun
Setlinks
Mainlinks
Blogun

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

Комментарии

Имя 

 

Рейтинг@Mail.ru
Александр Акимов
ICQ:
Mail: odvd@ya.ru