Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PHP5_nachinayushim

.pdf
Скачиваний:
29
Добавлен:
20.03.2015
Размер:
26.79 Mб
Скачать

124 Глава 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'][].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]