7.5. Ввод в формах
Процесс отправки текста в браузер прост, а получение ввода из форм - процесс куда более сложный. HTML-формат предлагает несколько способов получения информации от пользователей через формы - с помощью текстовых полей, текстовых областей, списков выборки и радиокнопок. Все они становятся текстовой строкой, отправленной на Web-сервер, в тот момент, когда пользователь щелкает на имеющейся в форме кнопке submit.
Когда кто-либо щелкает на кнопке submit, расположенный в форме, PHP преобразует поля формы в элемент массива _REQUEST. PHP создает их так, как если бы вы написали такой PHP-код сами. Это значит, что если на странице разместить две переменные формы с одним и тем же именем, значение второй переменной изменит значение первой, и вы сможете отправлять массивы в поля форм. Но к данному вопросу мы вернемся позднее.
Все поля форм при обработке методом GET также попадают в переменную _GET, а все поля форм при обработке методом POST попадают в переменную _POST. Если переменные GET и POST имеют одно и то же имя, для определения, какую из них применять первой, PHP использует директиву variables_order. По умолчанию PHP сначала заполняет массив _REQUEST значениями переменных GET, затем переменных POST и файла cookie. Например, если файл cookie и POST имеют одно и то же имя, в массив _REQUEST будет записано значение cookie.
Листинг 7.2 представляет собой пример использования переменных, созданных из полей форм. Сценарий ожидает переменную color. При первом просмотре страницы переменная color является пустой, поэтому сценарий задает ее равной шести F, или, другими словами, чисто-белым цветом. При последующем вызове страницы значение текстового поля принимает цвет фона страницы. Обратите также внимание, что сценарий проставляет в поля ввода значения color. Таким образом, при каждом выводе формы он помнит то, что было введено прежде. Кроме того, возможно, вы обратили внимание на "фокус", который здесь имел место: страница рекурсивно вызывает сама себя.

| Листинг 7.2. Получение ввода с помощью формы
<?php
print("<html>n"); print("<head>n");
print("<title>Листинг 7-2</title>n");
print("</head>n");
// в первый раз

// для фона используется белый цвет
if(!isset($_REQUEST['color']))
{
$_REQUEST['color'] = "FFFFFF";
}
// открыть форму с фоновым цветом
print("<body bgcolor="#{$_REQUEST['color']}">n");
// запуск формы, в которой действием является сама страница
print("<form " .
"action="{$_SERVER['PHP_SELF']}" " .
"method="post">n");
// запрос цвета print("<b>цвет HTML:</b> " .
"<input type="text" name="color" " .
"value="{$_REQUEST['color']}">n"); // отобразить кнопку submit
print("<input type="submit" value="Попробуйте ">n");
print("</form>n"); print("</body>n");
print("</html>n");
?>

7.6. Передача массивов в формах
Несмотря на абсолютную неочевидность такого метода, массивы можно передавать непосредственно из форм. Для того чтобы понять, как это делается, необходимо вспомнить, каким образом поля преобразуются в переменные PHP. Каждое поле счи-тывается по очереди и преобразуется в оператор присвоения. URL вида http://www.example.com/script.php?name=leon выполняет присвоение вида $name = "leon". По умолчанию PHP размещает присвоенные значения в набор ассоциативных массивов.
PHP рассматривает имя поля формы в качестве левой части оператора присвоения. Это значит, что если другие специальные символы являются частью имени поля, PHP интерпретирует их соответствующим образом. Можно также воспользоваться квадратными скобками, чтобы сделать переменную массивом. Пустая пара квадратных скобок добавит в массив новое значение с использованием последовательных целых индексов. Таким образом, присвоение нескольким полям формы одного и того же имени, которое завершается парой пустых квадратных скобок, приведет к созданию массива в процессе заполнения формы (листинг 7.3).

Листинг 7.3. Ввод массива значений с помощью формы

<?php
print("<html>n"); print("<head>n");
print("<title^^TOmp 7.3</title>n"),-print("</head>n"); print("<body>n"); if(isset($_REQUEST['part']))

print("<h3>Последний бюргер^!^^^'),-print("<ul>n");
foreach($_REQUEST['part'] as $part)
{
print("<li>$part</li>n");
}
print("</ul>n");
}
$option = array("горчица", "кетчуп", "соленье", "лук", "салат", "помидоры"); print("<h3>Создание бюргера^!^^^'),-
print("<form action="{$_SERVER['PHP_SELF']}">n"),-
foreach($option as $o)
{
print("<input type="checkbox" " .
"name="part[]" value="$o">" . "$o<br>n");
}
print("<input type="submit">n");
print("</form>n");
print("</body>n");
print("</html>n");
?>