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

Пятница,  19 Apr 2024 г., 12:32
Мертвые мухи портят и делают зловонною благовонную масть мироварника; то же делает небольшая глупость уважаемого человека с его мудростию и честию. /Екклесиаст/

 Логин:  

 Пароль: 




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

PHP. Урок 11 Обработка HTML-форм

Урок 11. Обработка HTML-форм

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

Отправка данных из формы в PHP

Обычно формы используют для того, чтобы пользователь мог отправить данные на Web-сервер. Рассмотрим подробнее, как это происходит.

Дескриптор <FORM>

Дескриптор <FORM> задает область, в которой размещаются элементы для ввода текста и другие управляющие элементы, которые отправляют введенные значения на определенный URL.

Атрибут ACTION дескриптора <FORM> позволяет задать адрес сценария, куда передаются значения формы. URL можно задать относительно текущей страницы или в полной форме, начав с http://.

Атрибут METHOD определяет метод пересылки данных из формы. Есть всего два метода — GET и POST. На первый взгляд они практически ничем не отличаются. Данные, отправленные методом GET, добавляются в конец URL, а данные, отправленные методом POST, не показываются пользователю.

Метод GET. URL, в котором передаются данные методом GET, встречается очень часто. Обычно пользователь даже и не догадывается о том, что происходит. Часто этот механизм используется в поисковых системах на Web-страницах. Если после ввода запроса происходит переход по ссылке и в конце адреса добавляется префикс: ?search=yourword, это указывает на то, что используется метод GET.

В большинстве случаев лучше использовать метод POST. Кроме того что в адресе не появляется длинного префикса, метод POST не ограничивает объем передаваемых данных. А для метода GET это значение определяется максимальной длинной URL, с которым может работать пользовательский браузер (в Internet Explorer это 2048 символов) и версией HTTP-протокола Web-сервера (HTTP/1.0 позволяет не меньше 256 символов, а HTTP/1.1 – не меньше 2048).

Дескриптор <INPUT>

Дескриптор <INPUT> позволяет задать несколько типов ввода для HTML-формы. Атрибут TYPE задает тип ввода, а значение TEXT соответствует простому элементу текстового ввода.

Тестовое поле для ввода почтовых адресов задается следующим образом:

<INPUT TYPE="TEXT" NAME="name" SIZE="30" VALUE=" ">

В этом HTML-коде, атрибут VALUE – пустой, потому что не нужно задавать стандартное значение для этого поля. В данном случае его можно совсем не писать.

Длина поля. Размер поля не влияет на то, как PHP обрабатывает принятые значения. Для текстового поля ввода установлен в 30 символов, но не указывается атрибут MAXLENGTH, так что пользователи с очень длинными именами смогут их ввести.

Тип ввода CHECKBOX задает флажок, который может находится только в двух состояниях — установлен/сброшен. Флажок используется для значений истина/ложь. Создадим элемент, который спрашивает пользователя о разрешении связаться с ним:

<INPUT TYPE="CHECKBOX" NAME="may_contact" VALUE="Y" CHECKED>

В этом случае после загрузки страницы атрибут CHECKED автоматически установит флажок.

Тип RADIO (переключатель) напоминает обычный флажок, но вместо значений истина/ложь, переключатель имеет несколько значений, и выбрать можно только одно.

В примере ниже задается элемент "переключатель", который проверяет пол:

<INPUT TYPE="radio" NAME="gender" VALUE="m"> Мужчина
<INPUT TYPE="radio" NAME="gender" VALUE="f"> Женщина

Название переключателя. Атрибут NAME объединяет переключатели. Можно выбрать только один вариант для группы переключателей. Кроме того, можно разместить несколько групп переключателей на странице. В этом примере оба варианта имеют одинаковое имя gender.

Чтобы выбрать один из вариантов по умолчанию, достаточно указать в нем атрибут CHECKED. Например, если сайт ориентирован на женскую аудиторию, можно отметить по умолчанию соответствующую опцию:

<INPUT TYPE="radio" NAME="gender" VALUE="m"> Мужчина
<INPUT TYPE="radio" NAME="gender" VALUE="f" CHECKED> Женщина

Рассмотрим последний на сегодня тип элемента ввода — SUBMIT (кнопка подачи формы). Кнопка подачи формы отправляет содержимое формы по адресу, указанному в атрибуте ACTION. Надпись на кнопке задается в атрибуте VALUE. В примере ниже создается кнопка подачи формы с надписью «Отправить комментарий»:

<INPUT TYPE=SUBMIT VALUE="Отправить комментарий">

Для кнопки подачи формы можно указать атрибут NAME, но это редко используется. Ниже в этом уроке рассказывается, как это повлияет на значения, которые получает PHP.

Дескриптор <TEXTAREA>

Дескриптор <TEXTAREA> создает элемент ввода текста с несколькими строками. Во многих отношениях он напоминает тип TEXT дескриптора <INPUT>, но отличается способом задания в HTML-коде.

Стандартное значение дескриптора <TEXTAREA> может занимать несколько строк, поэтому вместо атрибута VALUE оно размещается между парой дескрипторов:

<TEXTAREA ROWS=4 COLS=50 NAME="comets"> Введите ваш комментарий здесь</TEXTAREA>

PHP не интересует, из какого элемента получено значение, различие будет только в HTML-коде.

Дескриптор <SELECT>

Напоследок рассмотрим элемент формы <SELECT>, который называется раскрывающимся списком.

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

<SELECT NAME="referrer">
<OPTION VALUE="search">Поисковый сервер</OPTION>
<OPTION VALUE="tv">Телевизионная реклама</OPTION>
<OPTION VALUE="billboard">Доска объявлений</OPTION>
<OPTION SELECTED VALUE="other">Другое</OPTION>
</SELECT>

В данном случае атрибут SELECTED устанавливает стандартный элемент "Другое", даже если он установлен в верху списка. Если нет элемента с атрибутом SELECTED, первый элемент выбирается по умолчанию.

Соберем все вместе

Если собрать все элементы формы вместе, добавить несколько текстовых надписей и немного форматирования, можно создать простую форму для отправки комментариев, как показано в листинге 11.1.

Листинг 11.1. Web-форма для отправки пользовательских комментариев

<FORM ACTION="send_comments.php" METHOD="POST">
<TABLE>
<TR>
    <TD>Ваше имя:</TD>
    <TD><INPUT TYPE="TEXT" NAME="name" SIZE=30></TD>
</TR>
<TR>
    <TD>Ваш почтовый адрес:</TD>
    <TD><INPUT TYPE="TEXT" NAME="email" SIZE=30></TD>
</TR>
<TR>
    <TD>Ваш пол:</TD>
    <TD><INPUT TYPE="RADIO" NAME="gender" VALUE="m">Мужчина
        <INPUT TYPE="RADIO" NAME="gender" VALUE="f">Женщина
    </TD>
</TR>
<TR>
    <TD>Как вы нас нашли?</TD>
    <TD>
        <SELECT NAME="referrer">
        <OPTION VALUE="search">Поисковый сервер</OPTION>
        <OPTION VALUE="tv">Телевизионная реклама</OPTION>
        <OPTION VALUE="billboard">Доска объявлений</OPTION>
        <OPTION SELECTED VALUE="other">Другое</OPTION>
        </SELECT>
    </TD>
</TR>
<TR>
    <TD>Можно вам написать?</TD>
    <TD><INPUT TYPE="CHECKBOX" NAME="may_contact" VALUE="Y" CHECKED></TD>
</TR>
<TR>
    <TD>Комментарии</TD>
    <TD><TEXTAREA ROWS=4 COLS=50 NAME="comments">
        Введите ваш комментарий здесь
        </TEXTAREA></TD>
</TR>
</TABLE>

<INPUT TYPE="SUBNIT" VALUE="Отправить комментарий">
</FORM>

Обработка форм с помощью PHP

Теперь рассмотрим, как обработать элементы формы с помощью PHP после отправки пользователем данных.

Доступ к значениям формы

Доступ к значениям формы в PHP можно получить с помощью специальных массивов. Массивы $_GET и $_POST содержат значения, отправленные, соответственно, методами GET и POST. Гибридный массив $_REQUEST содержит значения из обоих массивов, а также значения массива $_COOKIE.

Суперглобальность. Системные массивы, имя которых начинается с подчеркивания, называются суперглобальными. К ним можно обратиться из любой точки сценария PHP, независимо от области видимости. Например, не нужно объявлять массив $_POST как глобальный для того, чтобы использовать его в функции.

Доступ к значениям элементов формы интуитивно понятен. Элементу формы с определенным именем соответствует элемент массива $_GET или $_POST с соответствующим ключом. А значение этого элемента соответствует введенному пользователем значению для этого элемента.

Например, почтовый адрес из странички comments.html содержится в элементе $_POST["email"], а текст комментария — в $_POST["comments"].

Для типов CHECKBOX и RADIO атрибут VALUE определяет значение, которое получит PHP. Если установить флажок may_contact, элемент $_POST["may_contact"] будет содержать значение Y. Если же этот элемент оставить не установленным, он вообще не появится в соответствующем массиве. Поэтому нужно использовать функцию isset, чтобы узнать установлен ли флажок.

Стандартное значение флажка. Если флажок установлен, но в HTML-коде для него не задан атрибут VALUE, в PHP передается on.

Группа переключателей gender создает элемент $_POST["gender"], который содержит значение m или f, в зависимости от выбранного значения. Если не один из переключателей не отмечен, как и в случае с флажком, соответствующий элемент не создается вообще.

С помощью функции print_r легко увидеть все значения, полученные из формы. Для этого на ее вход подается массив $_POST:

echo "<PRE>";
print_r ($_POST);
echo "</PRE>";

Это очень полезный прием отладки, который позволяет увидеть все данные, которые сценарий получает из формы. Если создать файл send_comments.php и поместить в него код, приведенный выше, на экране появятся значения каждого элемента формы. Вот пример вывода:

Array
(
    [name] => Крис Ньюман
    [email] => chris@ligthwood.net
    [gender] => m
    [referrer] => search
    [may_contact] => Y
    [coments] => Это просто мой любимый сайт
)

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

<FORM ACTION="button.php' METHOD=POST>
<INPUT TYPE="SUBMIT" NAME="button1" VALUE="Кнопка 1">
<INPUT TYPE="SUBMIT" NAME="button2" VALUE="Кнопка 2">
</FORM>

В button.php можно использовать следующую проверку для того, чтобы определить, на какой кнопке сделан щелчок:

if (isset($_POST["button1"])) {
echo "Вы щелкнули на кнопке 1";
}
elseif (isset($_POST["button2"])) {
echo "Вы щелкнули на кнопке 2";
}
else {
echo "Я не знаю на какой кнопке вы щелкнули";
}

Атрибут VALUE кнопки подачи формы задает текст на кнопке, а также передается в PHP, когда щелкают на этой кнопке.

Кнопка submit. Новые браузеры отправляют данные формы, если нажать на клавишу <Enter>, когда фокус находится на элементе ввода. Даже если в форме всего один элемент подачи формы, его значение передается в PHP, только если щелкнуть на этой кнопке.

Элемент скрытого ввода

Есть еще один тип дескриптора <INPUT>, который используется для передачи данных между сценариями и при этом не отображается на Web-странице.

Тип HIDDEN имеет атрибуты NAME и VALUE, которые заменяют это значение. Он используется, чтобы подменить эти значения.

Следующий элемент скрытого ввода передается в PHP-сценарий при отправке формы, и элемент $_POST["secret"] содержит это значение:

<INPUT TYPE="HIDDEN" NAME="secret" VALUE="Это секрет">

Но будьте осторожны. Тип HIDDEN не подходит для передачи секретных паролей или другой важной информации. Несмотря на то что он не отображается на Web-странице, просмотр HTML-кода позволяет узнать эти значения.

Сценарий для отправки электронной почты

Чтобы реализовать максимум удобств, реализуем отправку пользовательских комментариев на почтовый ящик владельца Web-сайта. Посмотрим, как объединить все части, чтобы сделать сценарий-обработчик, который будет выполнять эту функцию.

Функция mail

Функция mail отправляет сообщения с помощью системного почтового сервиса. На системах Linux/Unix для отправки почты используется утилита sendmail. На серверах под управлением Windows для этого используется протокол SMTP. Для корректной работы нужно задать имя почтового сервера в файле php.ini.

Для функции mail нужно задать три аргумента: почтовый адрес получателя, тему и текст сообщения. Четвертый необязательный аргумент задает дополнительные заголовки письма. Это позволяет указать специальные параметры From: или Cc:.

Сценарий send_comments.php в листинге Листинг 11.2 принимает данные из формы комментариев и отправляет их владельцу Web-сайта на почтовый ящик.

Сценарий проходит по всем значениям массива $_POST и создает строку $body для текста письма. Отметим, что символы \n используются для разделения строчек, потому что письмо передается обычным текстом, без HTML-форматирования.

Листинг 11.2. send_comments.php

<?php
$body = “Этот сценарий отправлен с помощью Web-сайта \n\n”;
foreach($_POST as $field => $value) {
    $body .= sprintf("%s = %s\n", $field, $value);
}
mail("owner@website.com", "Комментарий отправленный с помощью Web-сайта", $body,
      'From: "Web-комментарий" <comments@website.com>');
?>

<H1>Спасибо</H1>
Ваш комментарий отправлен!

Письмо, которое получит владелец сайта, будет выглядеть примерно так:

Этот комментарий отправлен с помощью Web-сайта
name = Крис Ньюман
email = chris@lightwood.cnet
gender = m
referrer = search
may_contact = Y
comments = Это просто мой любимый сайт

Это письмо отформатировано довольно небрежно, потому что генерируется автоматически. Конечно, при желании его можно оформить намного лучше. Например, можно заменить кодовые значения gender и referrer на полное описание.

Резюме

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


<<назад

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

Подробнее >>


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