После заполнения формы на странице tourprice.php серверу пересылаются 3 значения: число взрослых и детей, а также виртуальная стоимость турпоездки. После этого сценарий PHP перемножает ее на количество взрослых и детей, а затем складывает полученные значения и помещает итоговую сумму в HTML-код.
Для замены умозрительных значений реальными потребуется кое-что сделать. Для начала следует заполнить раскрывающийся список формы реальными данными. Как известно, раскрывающийся список может пересылать только одно значение, в то время как требуется два: стоимость турпоездки для взрослых и для детей. Таким образом, вместо стоимости будет отправляться уникальный идентификатор путешествия. На странице tourprice_processor.php по этому идентификатору формируется запрос на получение стоимости тура для взрослых и для детей, после чего он направляется в базу данных. На основе полученных данных рассчитывается итоговая стоимость, которая и выводится на странице.
Теперь следует более детально рассмотреть раскрывающийся список формы. Очевидно, что каждая опция в списке должна иметь два атрибута: надпись (label) (предназначена для просмотра посетителями и не пересылаемая после заполнения формы) и данные (data) (информация, которая пересылается в виде значения переменной формы). Несложно догадаться, что надпись должна включать название тура. Поскольку в базе данных названиям туров выделено отдельное поле, с их извлечением проблем не возникнет. В качестве пересылаемого значения, как говорилось ранее, должен выступать уникальный идентификатор путешествия. В данном случае это будет первичный ключ таблицы tbl_tours. Почти каждая таблица в БД содержит поле для первичного ключа, в каждой строке которого содержится уникальное значение (как правило, оно автоматически увеличивается на единицу при добавлении новой строки). Итак, в качестве названия для опции списка должно быть название тура, а в качестве данных – первич ный ключ tourID. Оба значения содержатся в таблице tbl_tours.
303. Откройте страницу tourprice.php. На панели Bindings щелкните на + и выберите Recordset (Query). В первую очередь, при работе с данными из БД всегда создается набор записей.
304. В поле Name введите имя rs_tourprices. В списке Connection выберите conn_enisey, а в списке Table — tbl_tours. В разделе Columns активируйте Selected, а затем выделите tourID и tourName.
Будет сгенерирован сценарий, по которому через соединение conn_enisey производится поиск нужной БД, в которой отыскивается таблица tbl_tours. Из нее извлекаются все значения, содержащиеся в полях tourID и tourName, и записываются в набор записей rs_enisey. Значения tourName будут использоваться в качестве надписей к элементам соответствующего списка, а значения tourID — в качестве данных.
305. Нажмите OK, чтобы вернуться в диалоговое окно, и снова нажмите OK. В коде появится новый фрагмент, содержащий сценарий для создания запроса.
306. В режиме Design щелкните в форме на списке, чтобы выделить его. На панели Property Inspector щелкните на кнопке List Values. Поочередно выделите каждый элемент и нажмите кнопку Remove Value. На этом шаге выдуманные значения будут удалены. На их место будут помещены реальные данные, содержащиеся в наборе записей rs_tourprices.
307. Не снимая выделения со списка, на панели Property Inspector нажмите кнопку Dynamic. В результате, будет открыто окно Dynamic List/Menu, в котором к списку формы будут прикреплены динамические данные.
308. В списке Options from recordset выберите rs_tourprices. В списке Values укажите tourID, а в списке Labels — tourName. Нажмите OK.
На страницу будет добавлен код, формирующий элементы меню. Полученный сценарий PHP поочередно перебирает все значения, извлеченные из БД. Сценарий за один прием загружает в список одну из 19 пар "надпись-значение". С помощью циклической структуры сценарий PHP проходит через каждую пару tourName-tourID в наборе записей и добавляет ее к элементу списка. Описанная выше процедура не требует вводить вручную 19 пар надписей и значений, что существенно ускоряет процесс разработки. Кроме того, при внесении изменений в базу данных они сразу же отобразятся и в списке.
309. Сохраните страницу, загрузите ее на сервер и протестируйте. Если раскрыть список, то отобразятся 19 поездок, отсортированных по алфавиту в порядке возрастания.
Если при тестировании страницы появляется сообщение об ошибке "undefined index", следует исправить код, как показано ниже.
Эта ошибка появляется только в некоторых реализациях PHP. Ее причина заключается в том, что проверка переменной ($_GET['error']) на соответствие определенному значению notnumeric выполняется без первоначального контроля существования переменной. Решение заключается в применении структуры вложенных условных операторов if. Внешнее условие проверяет, существует ли в запросе переменная error. Если существует, то производится проверка равенства переменной значению notnumeric. Но если переменной error в запросе нет, выполнение операции прекращается, что позволяет не учитывать источник возникновения проблемы.
310. Найдите на странице tourprice.php следующий участок кода:
<?php
if ($_GET['error'] == "notnumeric")
{ echo "<p class=\"error\">*** Error! </p>"; }
?>
Замените его на указанный код:
<?php
if (isset($_GET['error']))
{ if ($_GET['error'] == "notnumeric")
{ echo "<p class=\"error\">*** Error! </p>";
} }
?>
311. Заполните форму и подтвердите корректность выполнения этой процедуры. Загрузится страница tourprice_processor.php с учетом введенных сведений и рассчитанных на их основе данных. Причем стоимость поездки будет неожиданно низкой. Причина заключается в том, что при расчете стоимости тура используются значения в поле tourID, каждое из которых меньше