среда, 21 ноября 2007 г.

Передача значений переменных через формы

Работа с формами


В этом посте показано, как в PHP легко перерабатывать данные, полученные от HTML-форм. Чтобы понять о чём идёт речь Вам нужно хорошо разбираться в HTML и принципах работы HTML-форм и а также понимания разницы двух методов передачи данных в них (GET И POST).


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


Напомню, какие тэги и атрибуты должна содержать форма:


<FORM NAME="имя_формы"


ACTION="путь_к_обработчику"


METHOD="метод_передачи_переменных">


поля ввода...


</FORM>


Цветом выделены те элементы, которые пригодятся нам в этом опыте. Прежде всего разберемся, что такое "обработчик". Это скрипт на сервере, в который будут переданы значения полей ввода.


Каждое поле ввода имеет атрибут NAME, которое будет передано в обработчик вместе со своим значением.


Существует два метода передачи данных: GET и POST. Их отличие состоит в том, что при использовании метода GET значения полей присоединяются к URL, указанному в атрибуте ACTION. Происходит это таким образом:


http://site.domain/action.php3?имя=значение&...имя=значение


Пары "имя=значение" создаются для каждого элемента ввода, для которого указано имя атрибутом NAME.


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


При исполнении скрипта на языке PHP создаются переменные с именами, соответствующими именам полей и содержащие соответствующие значения.


Предположим, что мы создали форму следующего вида:


<FORM ACTION="mult.php3" METHOD="GET">


<INPUT TYPE="text" NAME="first" SIZE="4" MAXLENGTH="4">


<INPUT TYPE="text" NAME="second" SIZE="4" MAXLENGTH="4">


<INPUT TYPE="Submit" VALUE="Умножить">


</FORM>


Скрипт, содержащийся в файле mult.php3 может выглядеть следующим образом:


<?php


Header("Content-type: text/html");


echo "$first умножить на $second получится ", $first*$second;


?>


Как видим, все довольно просто.


Необходимо напомнить, что существует специальный тип поля HIDDEN. Это поле, которое не выводится на экран, но, если ему присвоено имя атрибутом NAME, значение егопередается в форму. Это бывает полезно, например, когда один обработчик может производить не одно, а несколько действий. С помощью такого поля мы можем задать тип действия, которое мы хотим произвести с данными формы.


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


Тип Описание Вид


TEXT Поле ввода текста


SELECT Выбор из списка.


RADIO Радио-кнопка. Используется для выбора одного из предложенных вариантов.


CHECKBOX Кнопка-флажок. Используется для выбора варианта.


SUBMIT Кнопка, которая инициирует вызов обработчика формы.


IMAGE Изображение. Используется как кнопка типа SUBMIT


<TEXTAREA> Область ввода текста.


Теперь рассмотрим, как значения и состояния этих элементов передаются в обработчик.


TEXT - здесь все просто. Введенное значение передается в виде: имя=значение (для удобства будем


предполагать, что метод передачи значений установлен в GET). В обработчике значение можно получить из


переменной $имя.


SELECT - значение берется из атрибута VALUE выбранного элемента <OPTION>. Например для <SELECT>


такого вида:


<SELECT NAME="mySelect">


<OPTION VALUE="test1">test1</OPTION>


<OPTION VALUE="test2">test2</OPTION>


<OPTION VALUE="test3">test3</OPTION>


</SELECT>


Cтрока будет содержать mySelect=test1, в случае выбора первого элемента списка. Переменная в скрипте будет выглядеть так: $mySelect.


Элемент <SELECT> может иметь атрибут MULTIPLE, что позволяет выбирать несколько значений из списка. В этом случае к имени элемента <SELECT> необходимо добавить пару квадратных скобок: имя[]. Строка будет выглядеть так: имя[]=значение&имя[]=значение..., а в скрипте доступ к выбранным значениям можно осуществить, как к элементам массива $имя.


В случае, если не заданы атрибуты VALUE, то передаваться будет то, что содержится между тэгами <OPTION> и </OPTION>.


RADIO - Здесь значение будет браться из атрибута VALUE, строка выглядит аналогично элементу типа TEXT.


Доступ из скрипта, тоже аналогичен. Если вы забыли установить это значение, то будет передано значение on CHECKBOX - если флажок установлен, то передается значение on, если флажок не установлен, то переменная не передается вообще. Таким образом, установку флажка в скрипте можно проверить, сравнив значение переменной $имя с "on". Переменная и строка выглядят аналогично элементу типа TEXT.


SUBMIT - кнопка SUBMIT, как ни странно, тоже может передавать значениев обработчик. Я не могу себе представить зачем это нужно, но тем не менее. Значение устанавливается из атрибута VALUE. Все остальное аналогично полю типа TEXT.


IMAGE - Самый интересный элемент. В обработчик передаются два значения: имя.x и имя.y, которые представляют собой координату указателя мыши относительно верхнего левого угла изображения. Строка выглядит следующим образом: имя.x=значение&имя.y=значение. В скрипте устанавливаются переменные $имя_x и $имя_y.


<TEXTAREA> - абсолютно аналогично элементу типа TEXT.


При пересылки строковых значений они перекодируются специальным образом. Все символы, кроме алфавитно-цифровых и знака подчеркивания "_" заменяются знаком процента "%" и двумя


шестнадцатеричными цифрами кода. Пробелы заменяются на знак "+". При установке переменных в скрипте производится обратное декодирование.


PHP предоставляет еще одну интересную особенность. Мы можем каждому элементу присвоить имя переменной массива. Например:


<FORM NAME="testForm" ACTION="test.php3">


name: <INPUT TYPE="text" NAME="personal[name]"><BR>


e-mail: <INPUT TYPE="text" NAME="personal[email]"><BR>


<INPUT TYPE="SUBMIT">


</FORM>


В этом случае мы сможем получить доступ к значениям, обращаясь к элементам ассоциативного массива: $personal["name"] и $personal["email"].


Кроме того, если включена директива PHP <?php_track_vars?>, то, при передаче значений, будут заполнены массивы $HTTP_GET_VARS и $HTTP_POST_VARS, для соответствующих методов передачи переменных в обработчик


Вызов формы самой на себя.


Александр Качанов (kachanov@ogs.gomel.by)


Вадим Ткаченко (vvtk@stealthcomp.com) (http://web.stealthcomp.com)