11.7. Приложение для расчета стоимости

11.7.1. Создание динамически наполняемого списка

После заполнения формы на странице 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, а в списке LabelstourName. Нажмите 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, каждое из которых меньше