[Image] Четверг, 13.06.2024, 11:05 [Image]
SEO, технологии, игры, IT новости
[Image] Главная Регистрация Вход [Image]
[Image] Приветствую Вас, Гость · RSS [Image]
Меню сайта

Форма входа
 Блог
Главная » 2011 » Январь » 24 » Общая проверка форм
20:36
Общая проверка форм
Прежде чем рассматривать строки кода, обсудим концепцию создания многоцелевого сценария для проверки форм. Перед тем как создавать сценарий, определим цели:
• Универсальность при проверке и обработке любых данных формы.
• Разделение кода для проверки и кода для представления формы.
• Простота использования при обработке любых типов HTML-форм.
Для достижения всех трех целей потребуется некоторое планирование (обязательный этап при создании надежных сценариев); будем надеяться, что в конце все три цели будут достигнуты.
Процессор форм работает с комбинацией скрытых элементов форм и динамических вызовов функций (см. главу 1). Эти скрытые элементы форм будут использоваться PHP-сценарием для двух целей — для обеспечения дружественного описания каждого поля элемента (в случае ошибки) и определения "обязательных" полей. Для каждого конкретного элемента формы с именем <name> описание такого поля хранится в скрытом элементе под именем <name>_desc. В следующем примере определяется текстовое поле с именем phone, имеющее поле дополнительного описания для использования в сценарии:
<INPUT TYPE="text" NAME="myphone">
<INPUT TYPE="hidden" NAME="myphone_desc" VALUE="HoMep телефона">
Второй скрытый элемент формы, обрабатываемый сценарием, имеет имя required
(обязательные) и должен содержать список разделенных запятыми обязательных элементов. Например, если существуют три обязательных элемента, имеющие значения атрибута NAME — phone, email и fax, то элемент required будет выглядеть следующим образом:
<INPUT TYPE="hidden" NAME="required" VALUE="phone,email,fax">
Атрибут VALUE каждого видимого элемента должен быть связан с соответствующим значением в суперглобальной переменной (то есть $_GET [ 'myvar' ]), хотя это не является обязательным. Это делается для того, чтобы если форма отправлена, но не обработана по какой-либо причине (например, в случае ошибки), пользователь не мог бы ничего изменить.
Следующий вопрос, которого нужно коснуться — как обрабатывать ошибки, возникающие после отправки формы. В сценарии проверки это делается с помощью двух глобальных PHP-переменных — $form_errors и $form_errorlist. Когда проверяющий сценарий пытается проверить переданные ему данные на наличие ошибок, он создает эти две переменные. Первая переменная $form errors — это логическая ве-
личина, означающая появление ошибки при проверке, а вторая $form_errorlist —массив сообщений об ошибках, возникающих во время проверки. Как использовать эти переменные для отображения ошибок при проверке, зависит от пользователя, однако можно рекомендовать следующий метод:

<UL>

<LI>

</UL>

Если поместить этот код непосредственно перед вызовом формы, результатом будет аккуратно сформатированный список всех ошибок, возникших при выполнении проверки формы.
Полный пример HTML-формы, использующей созданный нами сценарий проверки, приведен в листинге 5.7.
Листинг 5.7. Пример формы с использованием сценария проверки

<UL>

<LI>

</UL>

Пожалуйста, заполните следующую форму (* = Required)<BR>
<FORM ACTION="" METHOD=GET>
<INPUT TYPE="hidden" NAME="submit" VALUE="1">
<INPUT TYPE="hidden" NAME="required" VALUE="phone,email,fax">
<INPUT TYPE="hidden" NAME="phone_desc" УАШЕ="Номер телефона">
<INPUT TYPE="hidden" NAME="email_desc" УАШЕ="Адрес электронной почты">
<INPUT TYPE="hidden" NAME="fax_desc" VALUE="HoMep факса">
Ваше ФИО: <INPUT TYPE="text" NAME="name"><BR>
* Номер телефона:
<INPUT TYPE="text" NAME="phone" VALUE=""><BR>
* Адрес электронной почты:
<INPUT TYPE="text" NAME="email" VALUE=""><BR>
* Номер факса:
<INPUT TYPE="text" NAME="fax" VALUE=""XBR>
<INPUT TYPE="submit" УАЬиЕ="Отправить">
</FORM>
Теперь, когда имеется идея, как использовать сценарий проверки, самое время перейти к реальному сценарию, который будет обрабатывать форму. Проверяющий сценарий разбит на три функции add_error (), _process_form() и validate_form().
Функция validate_form() выполняет основную проверку, а функции add_error() и
_process_f orm () являются служебными.использования^юрм [ . , .
Как уже говорилось, ошибки, возникающие при проверке формы, хранятся в переменных $form_errors и $form_errorlist. Функция add_error() используется для управления этими двумя переменными. Поскольку эта функция проста, для ее понимания достаточно рассмотреть ее определение, представленное в листинге 5.8.
Листинг 5.8. Функция add_error ()
$form_errors = array();
$form_errorlist = false;
function add_error($error) {
global $form_errorlist, $form_errors;
$form_errorlist = true;
$form_errors[] = $error;
Сердцем сценария проверки является функция validate_form(). Она принимает
единственный параметр (ссылку на суперглобальный массив для проверки). Во время
выполнения эта функция решает ряд задач по проверке данных. При возникновении
ошибки validate_form() вызывает функцию add_error() с соответствующим сооб-
щением об ошибке. Выполнение функции validate_form() начинается с проверки
всех обязательных полей на предмет, заполнены ли они. После этой проверки
validate_form() пытается проверить каждый элемент формы в соответствии со сле-
дующими правилами:
• Если элемент имеет имя submit, required или его имя заканчивается на _desc,
он игнорируется.
• Для всех других элементов validate_form() пытается вызвать функцию
_validate () (где — имя текущего элемента).
Если функция _validate () не определена пользователем, она не существует. Эти функции заблаговременно создаются для проверки каждого элемента формы (по крайней мере, для элементов, которые нужно проверять). Эти функции принимают два параметра (передаваемое значение и описание поля, взятое из элемента _desc) и возвращают true, если переданное значение правильно, или сообщение об ошибке в случае ее возникновения. Например, при проверке элемента формы, у которого атрибут NAME равен phone (номер телефона), нужно использовать проверяющую функцию, код которой приведен в листинге 5.9.
Листинг 5.9. Пример функции, проверяющей элемент формы
function phone_validate($data, $desc) {
$regex = "/л\([2-9] [0-9] {2}\) [2-9] [0-9]{2}-[0-9]{4}/i";
if(preg_match($regex, $data) != 1) {
return "The '$desc' field isn't valid!";
}
return true;
Предположим, что функция validate_form() при выполнении не встречает ошибок. Тогда она вызывает функцию _process_form(). Эта функция предназначена для очистки любых необязательных элементов формы (скрытые элементы _desc, submit и required) и вызывает функцию process_form(). Как и проверочные функции, обсуждаемые ранее, process_form() должна быть определена пользователем для выполнения всей работы после успешной проверки формы. Она принимает единственный параметр (массив переданных данных) и не имеет возвращаемого значения. Если эта функция не существует, то с переданными данными после успешной проверки ничего не происходит. Пример функции process_form(), передающей по электронной почте содержимое формы, представлен в листинге 5.10.
Листинг 5.10. Пример функции process_£orm()
function process_form($data) {
$msg = "Форма {$_SERVER['PHP_SELF']}
была отправлена со следующими значениями: \n\n";
foreach($data as $key=>$val) {
$msg .= "$key => $val\n";
}
mail("joeuser@somewhere.com", "отправка формы", $msg);
Поскольку функцию validate_form() лучше рассматривать в связи с другими
функциями, не будем анализировать ее отдельно. Вместо этого рассмотрим листинг
5.11, который содержит полностью документированную функцию validate_form(),
как часть законченного сценария проверки.
Листинг 5.11. Полный сценарий для проверки формы
/********** начало сценария проверки формы ***********/
$form_errors = arrayO;
$form_errorlist = false;
function add_error($error) {
global $form_errorlist, $form_errors;
$form_errorlist = true;
$form_errors[] = $error;
»
function _process_form($method) (
/** Эта функция вызывается только из validate_form()! */
/* Проверяем, существует ли функция process_form(). Если не
существует, нет нужды очищать данные формы */
if(function_exists("process_form")) {
/* Создаем копию переданных данных и проходим по ним и удаляем
каждый элемент, не являющийся частью переданных данных */
$data = $method;
foreach ($data as $key=>$val) {
Усовершенствованные технологии HCn°^3J2255iHLi2B^LJ ~~~
глава 5
if(preg_match('7 (submit|required)| (_desc$)/i", $key) == 1)
unset($data[$key]);
/* Вызываем функцию process_form() и передаем ей очищенную
версию данных формы*/
process form($data);
function validate_form($method) {
/* Эта переменная используется для определения, возникли ли
ошибки во время выполнения. По умолчанию прелполагем,
что все правильно. */
$process = true;
/* Проверяем наличие обязательных элементов. Если таких
элементов нет, форма автоматически не верна */
if(lisset($method['required'])) {
add_error("Отсутствует необходимый скрытый элемент 'required'!");
$process = false;
J else {
/* Разберем обязательные поля обязательных элементов формы
и сохраним их в массиве */
$required = explode(',',$method['required']);
/* Убедимся, что обязательные элементы существуют */
foreach($required as $val) {
if(empty($method[$val])) {
/* Этот элемент должен иметь данные, но он пуст. Попытаемся  взять дружественное описание элемента и отобразим пользователю ошибку.
Если описания нет, используем вместо него имя элемента */
if(isset($method[$val."_desc"])) {
Serrormsg = "Необходимое поле '" . $method[$val."_desc"]
"' пустое!";
} else {
$errormsg = "Необходимое поле '$val' пустое!";
}
add_error($errormsg);
$process = false;
/* Начало прохода по всем элементам формы */
foreach($method as $key=>$val) {
/* Поскольку нас интересуют только отредактированные
пользователем элементы, проверяем элементы, не имеющие
имен 'submit', 'required' и не оканчивающиеся на '_desc' *
if (preg_match('7 (submit | required) I (__desc$) /i", $key) != 1) {
/* Создаем имя функции для проверки данных */
$func • $key."_validate";
/* Убедимся, что проверочная функция для этого
элемента существует */
if (function_exists($func)) (
/* Так как проверочная функция существует, вызываем ее,
передав ей значение элемента и дружественное описание
(если оно существует)*/
if(!isset($method[$key."_desc"])) (
$result = $func($val, $key);
} else {
$result = $func($val, $method[$key."_desc"]);
}
/* Если проверочная функция не возвратила true,
то элемент формы некорректен и $return содержит
сообщение об ошибке.
Добавим сообщение об ошибке в список возникших ошибок */
if($result !=- true) {
add_error ($result,) ;
$process = false;
/* Если ошибок нет, $process равен true. В этом случае вызываем
функцию _process_form(), передаем ей проверенные данные
и возвращаем true */
if($process) {
_process_form($method);
return true;
}
/* Ошибка при проверке, возвращаем false */
return false;
}
/********** конец сценария проверки формы ***********/
/********** начало пользовательского сценария ***********/
/* Это для красоты. Только используя $method каждый раз, когда
необходимо получить суперглобальные данные, можно быстро
изменить метод отправки формы с GET на POST без модификации
множества значений */
$method = &$_GET;
/* Проверяем, отправлена ли форма; если да — начинаем проверку */
if(isset($method[*submit'])) {
validate_form($method);
}
/* Эта функция вызывается из validate_form() для проверки
элемента с именем "email1. */
function email_validate($data, $desc) (
$regex = '7~[a-zO-9\._-]+@+[a-zO-9\._-]+\.+[a-z](2,
if(preg_match($regex, $data) ! = 1)
return "Поле '$desc' не верно.";
Усове£шенствованные технологии использования форм j . __
глава 5 I
return true;
}
/* Эта функция вызывается из validate_form() при успешной
проверке формы */
function process_form($data) {
$msg = "Форма {$_SERVER['PHP_SELF']}" .
" отправлена со следующими значениями: \п\п";
foreach($data as $key=>$val) {
$msg .= "$key »> $val\n";
}
mail("joeuserSsomewhere.com", "отправка формы", $msg);
}
/********** конец пользовательского сценария ***********

<НЕАр><Т1ТЬЕ>Пример проверки формы

/* Отображает все ошибки, возникшие при выполнении проверки */
if($form_errorlist): ?>
Пожалуйста, исправьте следующие ошибки:<BR>
<UL>

<LI>

</0L>

<FORM ACTION="" METHOD=GET>
<INPUT TYPE="hidden" NAME="required" VALUE="first,last,email">
<INPUT TYPE="hidden" NAME="submit" VALUE="1">
<TABLE CELLPADDING=O CELLSPACING=O BORDER=0>
<TR>
<TD СОЬЗРАЫ=2>Заполните следующие поля. (* = Required)</TD>
</TR>
<TR>
<ТО>*Имя:</ТО>
<TDXINPUT TYPE="text" NAME="first"
VALUE="">
<INPUT TYPE="hidden" NAME="first_desc" VALUE="HMH"X-/TD>
</TR>
<TR>
<ТО>*Фамилия:</TD>
<TDXINPUT TYPE="text" NAME="last" VALUE="">
<INPUT TYPE="hidden" NAME="last_desc" УАЬиЕ="Фамилия"Х/ТО>
</TR>
<TR>
<TD>HoMep телефона:</TD>
<TDXINPUT TYPE="text" NAME="phone"
VALUE="">
<INPUT TYPE="hidden" NAME="phone desc" VALUE="HoMep телефона"х/ТО>
</TR>
<TR>
<ТО>*Адрес электронной почты:</Т0>
<TDXINPUT TYPE="text" NAME="email"
VALUE="">
<INPUT TYPE="hidden" NAME="email_desc" УАШЕ="Адрес электронной почты"х/ТО>
</TR>
<TR>
<TD COLSPAN=2XINPUT TYPE="submit" УАШЕ="Отправить"х/ТО>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>

Категория: Все о PHP | Просмотров: 1690 | Добавил: witkom8382 | Рейтинг: 1.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024
Категории
Оптимизация сайта [589]
Создание сайтов [355]
Заработать в интернете [505]
Технологии [44]
Полезное [369]
Услуги и сервисы [309]
Автоблог [101]
Скрипты для Ucoz [39]
Движок на сайт [10]
Все о Joomla и Drupal [20]
Все о PHP [91]
Поиск
Пользовательский поиск
Статистика


Онлайн всего: 2
Гостей: 2
Пользователей: 0
Seo сайт, технологии продвижения, мета теги, оптимизация сайтов, новости сео, Скрипты, Ucoz

Рейтинг@Mail.ru