9.6. Формы HTML (Get/Post)
Как и для скриптов на языке Perl, в Интернете есть множество сайтов, содержащих десятки готовых PHP-программ. Такие ресурсы делятся на два вида:
• наборы функций,
• классы.
Программа на языке РНР, как правило, не «живет сама по себе», а применяется для обработки запросов через интерфейс CGI. Даже если интерпретатор РНР встроен в сервер как модуль, с точки зрения самой пользовательской программы, она работает через CGI. Адля чего творцам чудесных Web-сайтов нужен CGI? Конечно же, для обработки форм. Именно на скрипт указывает параметр action-тега <form action = "doit.phtml">.
В РНР программисту не требуется каким-то особым образом извлекать данные формы. В момент начала выполнения скрипта уже существуют и определены переменные, соответствующие одноименным полям. Например, если форма имеет вид:
<form action = "doit.phtml">
<input name=f1>
<input name=f2>
<input type=submit name=do value="Пoexaли">
</form>
то при старте скрипта doit.phtml в нем уже определены переменные $f1, $f2, $do. Можно указать имя поля в форме как
<select name="sel [ ] " multiple>
...
</select>
В таком случае на момент скрипта, обрабатывающего эту форму, будет определен массив $sel, содержащий выбранные пункты списка select.
По умолчанию и чаще всего форма передается HTTP-методом Post, а статические страницы пользователь обычно получает методом Get. В последнем случае вы тоже можете передавать параметры выполняющемуся скрипту через так называемую строку запроса, т. е. через URL. Выглядит такой URL, например, следующим образом:
www.domain.name.ru/script.phtml?a=5&b=no&c=%2f
ВНИМАНИЕ
Собственно параметры начинаются после знака «?» и состоят из параметров «имя—значение», разделенных знаком «&».
Как и в случае с полями формы, программа script.phtml получит переменные $а, $b, $с в соответствии с собственным содержанием «5», «по» и «/».
СОВЕТ
Обратите внимание на значение переменной $с. Вообще-то лучше не полениться и зайти на сайт www.w3c.org, вдумчиво прочитать документацию о протоколе HTTP 1.1. Это очень поможет вам в профессиональном росте.
Можно комбинировать оба эти метода, т. е. создавать формы и указывать обработчику параметры через URL:
<form method = POST action = "doit.phtml?color=black&hold=l">
...
</form>
Когда форма представлена сценарию РНР, любые переменные от этой формы станут автоматически доступными сценарию РНР. Если конфигурационная опция track_vars включена, то эти переменные будут зафиксированы в ассоциативных массивах $HTTP_POST_VARS (ДЛЯ Post), $HTTP_GET_VARS (для Get) или $HTTP_POST_FILES согласно источнику рассматриваемой переменной. Например:
<form action="test.php" method="post">
Name: <input type="text" name="name1"><br>
<input type="submit">
</form>
ВНИМАНИЕ
Когда вышеупомянутая форма используется, значение от текстового ввода будет доступно в $HTTP_POST_VARS ['namel']. Если конфигурационная директива register_globals включена, то переменная будет также доступна как $name1 глобальная.
После того как пользователь нажмет в форме кнопку «Submit», в РНР-скрипт test.php методом Post передадутся данные из формы, а обратиться, например, к текстовому полю из этого скрипта можно будет через переменную $name1.
PHP также работает с массивами в контексте переменных формы. Вы можете, например, группировать связанные переменные или использовать эту особенность, чтобы получить значения, выбранные в поле List Box.
Рассмотрим пример. Предлагается создать два файла: первый — index.html. В нем будет размещаться сама форма, переменные через которую будут передаваться скрипту в test.php — во второй созданный файл.
Пример 9.4. Файл index.html
<html>
<head>
<title>Программa</title>
</head>
<body>
<form action="test.php" method="post">
Name: <input type="text" name="personal[name]">
Email: <input type="text" name="personal[email]">
Beer:
<select multiple name="beer[]">
<option value="warthog">Warthog
<option value="guinness">Guinness
</select>
<input type="submit">
</form>
</body>
</html>
Результат выполнения программы представлен на рис. 9.3.
Рис. 9.3. Полученная форма
Пример 9.5. Файл test.php
<?php
echo "Имя: ".$personal["name"];
echo "Email: ".$personal [ "email" ];
for ($i=0; $i<sizeof($beer);$i++)
echo $beer[$i]."<br>";
?>
Опишем принцип работы программы. В строке Name: <input type="text" name="personal[name]"> задаетсяпеременная как элементмассива. Далее идет подобная строка Email :<input type="text" name="personal [email] ">, выполняющая ту же функцию. Элемент select используется для создания выбора списка. При отправке формы серверу пересылается выбранная строка <select multiple name="beer[]">. Внешне элемент select может быть представлен либо как обычный, либо как раскрывающийся список, в зависимости от того, указан или нет атрибут size, В самом теге используются собственные атрибуты name и multiple. Атрибут name определяет имя элемента. Если указан атрибут multiple, то браузер позволяет выбрать более одного элемента списка.
Рассмотрим файл test. php. После того как пользователь ввел данные в форму, указанным переменным присваиваются эти значения. Как только пользователь нажмет на кнопку «Submit», начнется передача этих значений переменных в наш РНР-скрипт для последующей реализации. Например, в строках Name и Email пользователь ввел следующие данные: Name - Sasha, Email - sashatest@mydomain.ru. Из первых двух строчек программы, написанной на РНР:
echo "Имя: " . $personal [ "name" ];
echo "Email: ". $personal [ "email"];
видно, что при выполнении данного скрипта одним из результатов проделанной работы будет вывод таких фраз Sasha, Email:
Это очень простая программа, но она показывает, что кактолько вы передали переменные, полученные в форме, в сам скрипт, то сразу можете без каких-либо проблем
выполнять любые операции с этими переменными, конечно, при разумных условиях. Также обратите внимание на то, что в данном примере работа ведется не с отдельной переменной, а с одним массивом, что облегчает задачу, хотя на первый взгляд все выглядит рчень сложно. Поверьте, это временное чувство. Уверены, после того как вы напишете самостоятельно пару раз этот скрипт, не заглядывая в книгу, все ваши волнения перестанут быть вам помехой в дальнейшем. Что касается строк;
for ($i=0;$i<sizeof($beer);$i++)
echo $beer[$ij."<br>";
можно сказать одно: данная функция является функцией цикла, в котором происходит прибавление по единице к переменной $i, при этом функция echo() выводит полученные результаты. Как таковая программа несложная, и сама работа с переменными также не представляет никаких трудностей. Самое главное запомнить основные нормы и правила при написании таких программ.