PHP5_nachinayushim
.pdf124 Глава 3
Рис. 3.9.
Как это работает
В данном случае в конце URL строка запроса отсутствует, так как для передачи Web+серверу данных формы используется метод POST. Метод передачи определяется в первом из двух созданных файлов, checkbox.html:
<html>
<head><title></title></head>
<body>
<form method="POST" action="checkbox.php">
Флажок создается с помощью дескриптора <input>:
Вы когда-нибудь ели телячий рубец? <input name="Choice" type="checkbox">
В сценарии checkbox.php вызывается PHP+переменная, которая имеет в точно+ сти то же имя, что и элемент управления в файле checkbox.html:
<?php
echo $_POST['Choice']; ?>
Единственное отличие заключается в том, что переменная теперь создается и по+ лучает значение автоматически. Если флажок был установлен пользователем, то зна+ чением данной переменной будет ‘‘on’’. В противном случае переменная вообще не содержит данных.
Использование нескольких флажков
Что произойдет, если использовать на форме несколько флажков? Читатели, ко+ торые знакомы с работой переключателей (radio buttons), знают, что можно выбрать только один переключатель в группе. Флажки работают иначе и их преимущество за+ ключается в том, что каждый из них является отдельным элементом ++++++ можно вы+ брать один или несколько флажков или вообще не выбрать ни одного.
PHP, HTML и состояние сеанса 125
Модифицируем предыдущий пример, добавив в него несколько флажков.
Практика Использование нескольких флажков
1.Откройте редактор Web+страниц и сохраните следующий код как checkboxes.html:
<html>
<head><title></title></head>
<body>
<form method="POST" action="checkboxes.php">
Вы когда-нибудь ели телячий рубец?
<input name="Choice1" type="checkbox" value="телячий рубец">
<br>
Вы когда-нибудь ели улиток?
<input name="Choice2" type="checkbox" value="улиток">
<br>
Вы когда-нибудь ели саранчу?
<input name="Choice3" type="checkbox" value="саранчу"> <br>
<br>
<input type="submit" value="Отправить"> </form>
</body>
</html>
2. Закройте данный файл и создайте новый файл. Введите в файл следующий код:
<html>
<head><title></title></head>
<body>
<?php
echo "$_POST[Choice1]<br>"; echo "$_POST[Choice2]<br>"; echo "$_POST[Choice3]<br>"; ?>
</body>
</html>
3.Сохраните данный файл как checkboxes.php.
4.В браузере откройте страницу checkboxes.html (рис. 3.10).
Рис. 3.10.
126Глава 3
5.Установите один или несколько флажков и нажмите кнопку Отправить. Про+ грамма должна отобразить пользовательский выбор (рис. 3.11).
Рис. 3.11.
Как это работает
Атрибут value для каждого флажка устанавливается в первой программе:
Вы когда-нибудь ели телячий рубец?
<input name="Choice1" type="checkbox" value="телячий рубец">
<br>
Вы когда-нибудь ели улиток?
<input name="Choice2" type="checkbox" value="улиток">
<br>
Вы когда-нибудь ели саранчу?
<input name="Choice3" type="checkbox" value="саранчу">
В результате этого для каждого отмеченного флажка устанавливается значение. Например, если выбран флажок Choice1, то его значением будет телячий рубец (а не стандартное on), и это значение передается в переменную $Choice1 сценария checkboxes.php. Если пользователь не устанавливает этот флажок, то в соответ+ ствующую PHP+переменную данные не передаются. Сценарий checkboxes.php отображает значения трех переменных, установленных независимо на странице checkboxes.html:
echo "$_POST[Choice1]<br>"; echo "$_POST[Choice2]<br>"; echo "$_POST[Choice3]<br>";
Каждому флажку назначено уникальное имя и присвоено значение, независимое от других флажков. Существует возможность задать всем трем элементам управления одно и то же имя, но это может привести к неожиданным результатам. Например, из+ меним следующий код в файле checkboxes.html:
Вы когда-нибудь ели телячий рубец?
PHP, HTML и состояние сеанса 127
<input name="Choice" type="checkbox" value="телячий рубец">
<br>
Вы когда-нибудь ели улиток?
<input name="Choice" type="checkbox" value="улиток">
<br>
Вы когда-нибудь ели саранчу?
<input name="Choice" type="checkbox" value="саранчу">
Теперь, если запустить данную программу снова и выбрать несколько вариантов, то результат будет совсем не таким, как ожидалось. Программа выдаст только один ответ, значение последнего флажка в списке. PHP перезаписывает значение пере+ менной каждый раз, когда встречает имя этой переменной. Поэтому переменной присваивается значение последнего флажка в списке. Однако к имени каждого эле+ мента управления в HTML можно добавить пару квадратных скобок:
Вы когда-нибудь ели телячий рубец?
<input name="Choice[]" type="checkbox" value="телячий рубец">
<br>
Вы когда-нибудь ели улиток?
<input name="Choice[]" type="checkbox" value="улиток">
<br>
Вы когда-нибудь ели саранчу?
<input name="Choice[]" type="checkbox" value="саранчу">
Это приводит к созданию массива переменных внутри массива $_POST. Для того чтобы различать переменные, PHP добавляет к их именам номер, действующий как уникальный идентификатор. В конце имени первой версии такой переменной содер+ жится нуль в квадратных скобках ([0]), в конце имени второй версии ++++++ единица в квадратных скобках ([1]), а в конце имени третьей версии ++++++ двойка ([2]).
Чтобы заставить PHP отображать содержимое данных переменных, необходимо обра+ щаться к переменным, явно указывая их полные имена, например, $_POST[Choice][0]. Переменная $_POST[Choice][0] имеет значение телячий рубец, если был уста+ новлен одноименный флажок. В переменной $_POST[Choice][1] содержится зна+ чение улиток, если был выбран флажок улиток, и т.д. для всех остальных элементов управления, использующих одно и то же имя. Создать массив из HTML+формы, не ис+ пользуя квадратные скобки, невозможно, хотя, как было сказано в главе 2, в PHP+ программе можно создавать массивы любого размера.
Переключатели
Переключатели (radio buttons) ++++++ ‘‘эгоистичные’’ родственники флажков. Переклю+ чатели используются, когда имеется набор возможных ответов или вариантов, но вы+ брать можно только один из них. Переключатели также создаются с помощью деск+ риптора <input>, а атрибут type имеет значение radio.
<input name="Question1" type="radio" value="Порту">
Переключатели, как и флажки, имеют в HTML+коде атрибут checked, который не принимает никакого значения. Если в коде элемента управления используется этот атрибут, то на Web+странице переключатель будет выбран по умолчанию:
<input name="Question1" type="radio" checked>
128 Глава 3
Если значение атрибута value не задано, то по умолчанию оно устанавливается равным "on".
В отличие от флажков, чтобы связать набор переключателей друг с другом, необ+ ходимо задать всем переключателям группы одинаковое имя. Например:
<input name="Question1" type="radio" value="Порту"> <input name="Question1" type="radio" value="Лиссабон">
<input name="Question1" type="radio" value="Мадрид">
Данный метод сообщает Web+серверу, что все эти переключатели соединены. Если задать каждому переключателю уникальное имя, то пользователь сможет выбирать каждый вариант независимо, как в случае флажков.
Практика Использование переключателей
1. Откройте редактор Web+страниц и введите следующий код:
<html>
<head><title></title></head>
<body>
<form method="GET" action="radio.php">
Выберите название столицы Португалии
<br>
<br>
<input name="Question1" type="radio" value="Порту">
Порту
<br>
<input name="Question1" type="radio" value="Лиссабон">
Лиссабон
<br>
<input name="Question1" type="radio" value="Мадрид">
Мадрид
<br>
<br>
<input type="submit" value="Отправить"> </form>
</body>
</html>
2.Сохраните данный файл как radio.html и закройте его.
3.Создайте новый файл и введите в него следующий код:
<html>
<head><title></title></head>
<body>
<?php
echo "Вы выбрали ответ: $_GET[Question1]"; ?>
</body>
</html>
4.Сохраните файл как radio.php.
5.Откройте в браузере страницу radio.html и выберите ответ (рис. 3.12).
6.Нажмите кнопку Отправить и посмотрите результат своего выбора (рис. 3.13).
PHP, HTML и состояние сеанса 129
Рис. 3.12.
Рис. 3.13.
Как это работает
Для транспортировки данных выбран метод GET, поэтому снова видна строка за+ проса. Страница с перечнем вопросов ++++++ фактически единственное место, где такой подход может оказаться полезным. Страница подтверждает выбранный ответ, хотя, вероятно, было бы полезнее, если бы ответ не отображался в теле страницы. Рас+ смотрим работу программ. Код первого файла, radio.html, создает три переключа+
130 Глава 3
теля. Все они имеют одинаковое имя, Question1, и уникальные значения, отражаю+ щие различные ответы:
<input name="Question1" type="radio" value="Порту">
Порту
<br>
<input name="Question1" type="radio" value="Лиссабон">
Лиссабон
<br>
<input name="Question1" type="radio" value="Мадрид">
Мадрид
Затем в сценарии radio.php необходимо только отобразить содержимое одной переменной, так как может быть только один правильный ответ:
<?php
echo "Вы выбрали ответ: $_GET[Question1]"; ?>
Списки
Списки (list boxes) или выпадающие списки (drop*down list boxes) представляют собой элементы управления, которые обычно отображают несколько объектов в списке. Иногда они имеют стрелку, которая позволяет пользователю перемещаться вниз к дополнительным объектам. В HTML они работают несколько иначе, чем предыду+ щие элементы управления, так как они создаются с помощью двух дескрипторов: <select> и <option>. По сути, они обеспечивают ту же функциональность, что и переключатели, при условии, что обычно можно выбрать только один объект из предопределенного списка вариантов.
Дескриптор <select>, создающий список, охватывает несколько дескрипторов <option>, каждый из которых содержит текст, соответствующий объекту в списке:
<select name="Price"> <option>До $5000</option>
<option>$5000-$10000</option> <option>$10,000-$25,000</option> <option>Свыше $25,000</option>
</select>
Однако возможны ситуации, когда необходимо выбрать несколько объектов. Чтобы предоставить пользователю такую возможность, следует добавить в дескриптор <select> атрибут multiple. Оба варианта рассматриваются в следующем примере, где програм+ ма получает от пользователя информацию о желаемой цене автомобиля и желаемом объеме двигателя. Первый вопрос допускает только один ответ, а второй допускает вы+ бор нескольких объектов, которые можно выбрать, удерживая нажатой клавишу <Shift>.
Практика Использование списков
1. Откройте HTML+редактор и введите следующий код:
<html>
<head><title></title></head>
<body>
<form method="POST" action="listbox.php">
Выберите желаемую цену автомобиля
<br>
<br>
<select name="Price">
PHP, HTML и состояние сеанса 131
<option>До $5000</option> <option>$5000-$10000</option> <option>$10,000-$25,000</option> <option>Свыше $25,000</option>
</select>
<br>
<br>
Выберите желаемый объем двигателя? <br>
<br>
<select name="EngineSize[]" multiple> <option>1.0L</option> <option>1.4L</option> <option>1.6L</option> <option>2.0L</option>
</select>
<br>
<br>
<input type="submit" value="Отправить"> </form>
</body>
</html>
2.Сохраните данный файл как listbox.html и закройте его.
3.Создайте новый файл и введите в него следующий код:
<html>
<head><title></title></head>
<body>
<?php
echo "Диапазон цен: $_POST[Price]"; $Choice0 = $_POST['EngineSize'][0]; $Choice1 = $_POST['EngineSize'][1]; $Choice2 = $_POST['EngineSize'][2];
$Choice3 = $_POST['EngineSize'][3]; echo "<br>Объем двигателя: $Choice0";
echo "$Choice1"; echo "$Choice2"; echo "$Choice3"; ?>
</body>
</html>
4.Сохраните данный файл как listbox.php.
5.Откройте в браузере страницу listbox.html и выберите один вариант из верхнего списка и один или несколько вариантов из нижнего (рис. 3.14).
6.Нажмите кнопку Отправить. Пример результата показан на рис. 3.15.
Как это работает
Код страницы listbox.html создает список с четырьмя пунктами, допускающий множественный выбор. Атрибуту name дескриптора <select> присваивается значе+ ние Price:
<select name="Price"> <option>До $5000</option>
<option>$5000-$10000</option> <option>$10,000-$25,000</option> <option>Свыше $25,000</option>
</select>
132 Глава 3
Рис. 3.14.
Рис. 3.15.
PHP, HTML и состояние сеанса 133
В сценарии listbox.php атрибут name связан с PHP+переменной $_POST[Price]:
<?php
echo "Диапазон цен: $_POST[Price]";
...
Здесь пока нет абсолютно ничего нового, однако второй список в listbox.html отличается:
<select name="EngineSize[]" multiple> <option>1.0L</option> <option>1.4L</option> <option>1.6L</option> <option>2.0L</option>
</select>
По сути, в данном случае все выглядит так же, как и в предыдущем, кроме первой строки, в которой атрибуту name присваивается значение EngineSize[]. Добавле+ ние квадратных скобок ([]) в конце имени элемента управления ++++++ инструкция для PHP интерпретировать соответствующую переменную как массив.
$Choice0 = $_POST['EngineSize'][0]; $Choice1 = $_POST['EngineSize'][1]; $Choice2 = $_POST['EngineSize'][2];
$Choice3 = $_POST['EngineSize'][3]; echo "<br>Объем двигателя: $Choice0,";
echo "$Choice1,"; echo "$Choice2,"; echo "$Choice3,";
Как уже отмечалось, во время создания массива PHP создает новую переменную с тем же именем и присоединенным к имени индексным номером. В списке содержится четыре пункта, поэтому в массиве будет четыре элемента. Содержимое каждого из них необ+ ходимо отобразить. Поскольку индекс ссылается на элемент массива, а нумерация элементов в массивах, как правило, начинается с нуля, $EngineSize[0] ссылается на первый пункт в списке, 1.0L, если этот пункт был выбран пользователем. Этот эле+ мент всегда содержит первый пункт списка, выбранный пользователем на странице.
В рассматриваемом примере выбран первый пункт, поэтому $EngineSize[0] дей+ ствительно содержит значение 1.0L. То же касается и элемента $EngineSize[1], свя+ занного со вторым пунктом. Элементы $EngineSize[2] и $EngineSize[3] не содер+ жат ничего, так как пользователь выбрал только два первых пункта списка. Если бы пользователь выбрал только один пункт, то значение хранилось бы только в элементе $EngineSize[0]. Элементы $EngineSize[2] и $EngineSize[3] будут содержать значения только в том случае, когда пользователь выберет все четыре пункта списка. Ес+ ли бы были выбраны только два последних пункта, то переменные $EngineSize[0] и $EngineSize[1] содержали бы значения 1.6L и 2.0L соответственно, а перемен+ ные $EngineSize[2] и $EngineSize[3] вновь не имели бы значений. Для просто+ ты отображения значений с помощью оператора echo для каждого пункта были соз+ даны переменные и им были присвоены строковые значения переменных массива.
Необходимо помнить о том, что если отображение ошибок включено и ошибки видны в окне браузера (в файле php.ini должна быть строка "display_errors = On"),
то будут также отображаться некоторые предупреждения о невыбранных значениях EngineSize, так как значения присваиваются не всем переменным
$_POST['EngineSize'][].