В избранное    Домой   

Вторник,  10 Dec 2024 г., 09:13
Лучше кусок сухого хлеба, и с ним мир, нежели дом, полный заколотого скота, с раздором. /Притчи/

 Логин:  

 Пароль: 




Анонсы:
=== Дата: 22/08/2011     Автор: Крис Ньюман ===

PHP. Урок 13 Проверка форм

Урок 13. Проверка форм

В этом уроке вы узнаете как реализовать проверку форм в удобном для пользователя виде.

Принцип проверки отправленных пользователем данных очень простой: нужно проверить по очереди все элементы массива $_POST на соответствие набору критериев. Тут возникает другая нетривиальная задача. Нужно дать пользователю возможность с минимальными усилиями исправить все ошибки и снова отправить нужные данные.

Требования нужных полей

Основной принцип проверки форм — требование соответствующего значения для отдельного поля. Если элемент для ввода текста отправляется с пустым значением, элемент в массиве $_POST создается, но содержит пустое значение. Поэтому нельзя использовать функцию isset, чтобы проверить, введено ли значение. Нужно проверить значение элемента, сравнив его с пустой строкой или, как показано ниже, с помощью булева оператора отрицания:

if (!$_POST["fieldname"]) {…}

Все поля формы создают соответствующий элемент в $_POST. Поэтому можно воспользоваться простым циклом, чтобы проверить, нет ли пустых значений в массиве:

foreach ($_POST as $field => $value) {
    if (!$value) {
        $err .= "Необходимо ввести $field<br>";
    }
}
if ($err) {
    echo $err;
    echo "Пожалуйста вернитесь назад и внесите изменения";
}
else {
    // Продолжение сценария
}

Перед тем как написать сообщение о присутствии пустых полей, сценарий создает строку ошибки $err для всех пустых полей. После завершения цикла содержимое $err выводится на экран, если есть ошибки. Если их нет и $err пуста, сценарий продолжает выполняться в выражении else.

Предупреждение об ошибках. Всегда выводите все предупреждения об ошибках, связанные с отправленными данными. Нужно дать возможность пользователю исправить все ошибки за один раз.

Такой подход работает, только когда все значения обязательные. Можно улучшить этот механизм, задав список требуемых полей в сценарии. Кроме того, в ассоциативном массиве можно указать надписи для каждого поля для вывода в сообщениях об ошибке:

$required = array("first_name" => "Имя",
              "email" => "Почтовый ящик",
              "telephone" => "Номер телефона");
foreach ($required as $field => $label) {
    if (!$_POST[$field]) {
        $err .= "Необходимо ввести $label<br>";
    }
}

Вывод ошибок проверки

Следующая проблема состоит в том, куда направить пользователя в случае ошибки. Раньше рассматривался вариант, когда при обнаружении ошибки пользователю нужно щелкнуть на кнопке НАЗАД в браузере. А после этого исправить соответствующие ошибки.

Кроме дополнительного действия, пользователю придется снова вводить данные и исправлять ошибки. Примерно такая ситуация возникает в примере с электронным магазином.

Потеря данных при щелчке на кнопке НАЗАД также зависит от настроек кэширования на Web-браузере, а также у Internet-провайдера. В большинстве случаев все работает нормально. Но при использовании сеансов PHP автоматически отправляется заголовок nocache на пользовательский браузер. Это приводит к тому, сто при использовании кнопки НАЗАД все данные из полей формы обязательно сбрасываются в начальное положение.

Поэтому лучше всего хранить форму и сценарий обработки в одном файле и отсылать данные самому себе. В этом случае обнаруженная ошибка выводится на странице формы. А все ранее введенные значения можно автоматически установить по умолчанию.

В листинге 13.1 находится практически готовый пример формы регистрации register.php. Имя и адрес электронной почты — обязательные, а номер телефона — необязательный.

Листинг 13.1. Пример формы регистрации с обязательными полями


<?php
$required = array("name" => "Ваше имя",
            "email" => "Адрес электронной почты",
foreach($required as $field => $label) {
    if (!$_POST[$field]) {
        $err .= "Необходимо ввести $label<br>";
    }
}
if ($err) {
    echo $err;
?>
<FORM ACTNON="register.php" METHOD=POST>
<TABLE BORDER=0>
<TR>
    <TD>Your Name</TD>
    <TD><INPUT TYPE=TEXT SIZE=30 NAME="name"
        VALUE="<?php echo $_POST["name"];?>"></TD>
</TR>
    <TD>Адрес электронной почты</TD>
    <TD><INPUT TYPE=TEXT SIZE=30 NAME="email"
        VALUE="<?php echo $_POST["email"];?>"></TD>
</TR>
<TR>
    <TD>Номер телефона</TD>
    <TD><INPUT TYPE=TEXT SIZE=12 NAME="telefone"
        VALUE="<?php echo $_POST["telefone"];?>"></TD>
</TR>
</TABLE>
<INPUT TYPE=SUBMIT VALUE="Зарегистрироваться">
</FORM>
<?php
}
else {
    echo "Спасибо за регистрацию";
}
?>

Недостаток такого решения в том, что сообщение об ошибке возникает еще до отправки формы. Это исправляется проверкой на существование в сценарии массива $_POST с помощью функции is_array. Кроме того, для проверки $err используется $_POST и, если его нет, форма вообще не выводится на экран.

Условие, которое проверяет $err, охватывает HTML-форму, и, несмотря на то, что дескрипторы PHP закрыты вокруг участков HTML-кода, форма выводится на экран, только если выполняется условие.

После удачного завершения работы с формой, выводится простое сообщение. В этом месте можно выполнить обработку полученных данных. Например, записать их в базу данных. Или принудительно перенаправить браузер на другую страницу с помощью HTTP-заголовка Location, как показывается ниже:

header("Location: newpage.php");

Обязательные правила для данных

Иногда кроме проверки того, введены ли данные, нужно проверить корректны ли они, перед тем как их обработать. Например, можно проверить адрес электронной почты или номер телефона на соответствие формату, с помощью правил из урока 8, "Регулярные выражения". Кроме того, можно задать минимальный размер поля. Это позволяет убедиться, что пользователь не ввел x во всех полях для быстрого перехода к следующей странице.

Все поля могут иметь различные правила проверки, поэтому нельзя воспользоваться циклом. Придется написать отдельное правило для каждого поля. Кроме того, если использовать этот механизм в связке с проверкой на пустое значение поля, нужно сначала убедиться, что значение введено, а затем выполнять дальнейшую проверку. Иначе, кроме ошибки о том, сто поле пустое, пользователь получит сообщение о некорректном формате этого поля.

Следующие правила нужно добавить к листингу 13.1 после проверки обязательных полей. Они проверяют корректность форматов почтового адреса и телефонного номера:

if ($_POST["email"] &&
    !ereg("^[^@]+@([a-z0-9\-]+\.)+[a-z]{2,4}$",
        $_POST["email"])) {
    $err .= "Неправильный формат электронной почты<br>";
}

if ($_POST["telefone"] &&
    !ereg("^\([[:digit:]]{3}\)[[:digit:]]{3}-
        [[:digit:]]{4}$,$_POST["telephone"])) {
    $err .= "Номер телефона нужно указать в формате: (555)555-5555 <br>" ; }

Дополнительные правила в случае ошибки добавляют новые сообщения к $err. Остальная часть сценария остается той же

.

Подсветка полей с ошибками

Вместо того чтобы заваливать пользователя сообщениями об ошибке, лучше выделить цветом соответствующие поля.

Реализация очень напоминает пример выше. Но вместо добавления каждого сообщения об ошибке к $err нужно задать сообщение об ошибке для всех полей. Для хранения сообщений можно использовать массив. Тогда для проверки формы достаточно посчитать количество элементов в $warnings.

Для каждого поля записывается правило. Если оно нарушается, в массив $warnings добавляется соответствующее сообщение об ошибке:

if (!ereg("^[^@]+@([a-z\-]+\.)+[a-z]{2,4}$",
        $_POST["email"])) {
    $warnings["email"] = "Неправильный формат";
}

После этого в самой форме можно вывести сообщение вслед за соответствующим полем:

<TR>
    <TD>Адрес электронной почты</TD>
    <TD><INPUT TYPE=TEXT SIZE=30 NAME="email"
        VALUE="<?php echo $_POST["email"];?>"></TD>
    <TD><b><?php echo $warnings["email"];?></b></TD>
</TR>

В листинге 13.2 приводится обновленная версия файла register.php, в которой используется прием с подсветкой пропущенных или некорректных значений.

Листинг 13.2. Проверка форм с использованием внутренних сообщений


<?php
$required = array("name" => "Ваше имя",
          "email" => "Адрес электронной почты");
foreach($required as $field => $label) {
    if (!$_POST[$field]) {
        $warnings[$field] = "Требуется";
    }
}
    
if ($_POST["email"] &&
    !ereg("^[^@]+@([a-z\-]+\.)+[a-z]{2,4}$", $_POST["email"])) {
    $warnings["email"] = "Неправильный формат адреса электронной почты";
}

if ($_POST["telephone"] &&
    !ereg("^\([[:digit:]]{3}\)[[:digit:]]{3}-[[:digit:]]{4}$", $_POST["telephone"])) {
    $warnings["telephone"] = "Номер телефона нужно указать в формате: (555)555-5555";
}

if (count($warnings) > 0) {
?>
<FORM ACTION="register.php" METHOD=POST>
<TABLE BORDER=0>
<TR>
    <TD>Ваше имя</TD>
    <TD><INPUT TYPE=TEXT SIZE=30 NAME="name"
        VALUE="<?php echo $_POST["name"];?>"></TD>
    <TD><?php echo $warnings["name"];?></TD>
</TR>
<TR>
    <TD>Адрес электронной почты</TD>
    <TD><INPUT TYPE=TEXT SIZE=30 NAME="email"
        VALUE="<?php echo $_POST["email"];?>"></TD>
    <TD><?php echo $warnings["email"];?></TD>
</TR>
<TR>
    <TD>Номер телефона</TD>
    <TD><INPUT TYPE=TEXT SIZE=12 NAME="telephone"
        VALUE="<?php echo $_POST["telephone"];?>"></TD>
    <TD><?php echo $warnings["telephone"];?></TD>
</TR>
</TABLE>
<INPUT TYPE=SUBMIT VALUE="Зарегистрироваться">
</FORM>
<?php
}
else {
    echo "Спасибо за регистрацию";
}
?>

В первом цикле присваивается текст предупреждения "Требуется" всем незаполненным полям. Каждое специфическое правило проверки содержит собственное сообщение об ошибке.

Способ выделения поля можно выбирать самому в зависимости от личной фантазии и умения воплотить ее в виде HTML. Например, проверяя наличие элемента в $warnings для каждого поля, можно изменить стиль поля ввода на затененный цвет фона, как показывается ниже:

<INPUT TYPE=TEXT SIZE=30 NAME="email"
<?php if ($warnings["email"]) echo "STYLE=\"shaded\"";?>
VALUE="<?php echo $_POST["email"];?>">

Резюме

В этом уроке вы узнали о том, как проверить значения, введенные пользователем в HTML-форму, и как предоставить возможность исправить ошибки. В следующем уроке вы узнаете о данных cookies и сеансах в PHP.


<<назад

Погода в Рудне
(Волгоградcкая обл.)

Подробнее >>


Курс валют
на 10 Дек 2024 г.
704 - Вьетнамских донгов
- 1