proview.ruКонструирование сайтовPHP → Заполнения формы пользователем

Заполнения формы пользователем

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



Источник: www.rupixel.com

Популярное