Урок 12: Создание поисковых интерфейсов
Переключение между SQL-запросами в зависимости от переменных среды
После проверки запросов стало очевидно, что каждый из них работает, когда два других закомментированы. Такие условия вполне подходят для тестирования, когда существует возможность в любой момент открыть документ и закомментировать тот или иной участок кода. Но при открытии сайта, предназначенного для общего доступа, в код необходимо внести дополнительные изменения. Несложно понять, что требуется реализовать автоматическое переключение между запросами, осуществляемое в зависимости от выбранного посетителем типа поиска. Во-первых, следует определить, как страница tours_detail.asp определит способ поиска, который был выбран. Затем на основе этого следует перейти к соответствующему SQL-запросу. Для создания такого перехода идеально подходит условная конструкция if… else, – вопрос только в том, как с ее помощью выявить тип поиска, выбранный посетителем?
В одном из предыдущих уроков был создан сценарий, проверяющий корректность заполнения формы. При выполнении сценария производилась проверка того, существуют ли переменные numadults и numchildren, а также являются ли их значения числовыми. Если хотя бы одно условие не выполнялось, посетитель переводился обратно на страницу с формой для устранения проблемы. Подобная стратегия позволяет определить, какой тип поиска выбрал посетитель. Проверка наличия или отсутствия конкретных переменных должна производиться в следующем порядке:
- если не существует переменных формы или URL-адреса, то это означает, что посетитель перешел на страницу по ссылке View All (Просмотр всей информации);
- если в памяти присутствует переменная URL-адреса, значит посетитель перешел на страницу по одной из ссылок с названиями регионов;
- если в памяти существует переменная формы, следовательно, посетитель выбрал страну в списке формы.
Этой информации достаточно для определения логической структуры сценария, который требуется написать. Логика наглядно продемонстрирована в приведенном ниже псевдокоде. Фразы, отделенные косыми чертами (слэшами), поясняют причину возникновения того или иного условия. В итоговый сценарий они добавлены не будут.
Если переменной формы не существует // посетитель щелкнул либо на ссылке View All Tours (Просмотр всех туров), либо на ссылке с названием региона Если не существует переменных URL-адреса // посетитель щелкнет на ссылке View All Tours. Запустить первый запрос Иначе переменная URL-адреса существует // пользователь щелкнул на ссылке с названием региона Запустить второй запрос Иначе переменная формы существует // пользователь выбрал страну из списка формы Запустить третий запрос
При анализе этого псевдокода становится понятно, что для его реализации требуются две условные конструкции if…else, вложенные одна в другую. Это необходимо, так как одно из условий (отсутствие переменной формы) может выполняться по двум разным причинам: поскольку посетитель щелкнул на ссылке View All (Просмотр всей информации), и на странице нет переменных URL-адреса. Помимо этого, возможен вариант, при котором посетитель щелкнул на ссылке с названием региона, вследствие чего на страницу передана переменная URL-адреса.
-
Откройте страницу tours_detail.asp . В режиме Code (Код) найдите три строки SQL-кода и удалите символы комментариев, в которые заключена часть из них. Выше и ниже этих строк добавьте несколько разрывов строки, чтобы отделить запросы от остального кода.
На этом шаге производится подготовка к добавлению запросов в условную конструкцию if…else. При этом невозможно повредить код в соседних строках. После того, как обработчик сценария ASP или ColdFusion определит, какой запрос выполнять, остальные два будут полностью проигнорированы.
-
Над верхней строкой запроса введите строку кода, проверяющую существование переменной формы.
Для ASP:
If IsEmpty(Request.Form("tourCountry")) Then
Для ColdFusion:
<cfif Not IsDefined("form.tourCountry")>
Для PHP:
if (!isset($_POST['tourCountry'])) {
Результатом обработки этого условия (как и любого другого) будет значение true (истина) или false (ложь). Если возвращается значение true (то есть переменной формы не существует), сценарий должен определить, существует ли переменная URL-адреса. Если возвращается значение false, становится ясно, что посетитель выбрал страну из списка формы, а, следовательно, нужно выполнять третий запрос.
-
С помощью клавиши (Tab) установите отступ от края для всех трех SQL-запросов. Над строкой с третьим запросом создайте новую строку и введите в ней код, благодаря которому будет запускаться третий запрос.
Для ASP:
Else
Для ColdFusion:
<cfelse>
Для PHP:
} else {
Если после проверки условия возвращается значение false, обработчик будет проводить в коде поиск операторов else if или else. Когда он их находит, они выполняются. Добавление этого кода обеспечивает запуск запроса, производящего фильтрацию на основе переменной формы, в том случае, если она существует.
-
Добавьте приведенный ниже код после строки третьего запроса, чтобы закрыть блок if…else .
Для ASP:
End If
Для ColdFusion:
</cfif>
Для PHP:
}
Итак, половина задачи решена. Если сейчас загрузить страницу на сервер и запустить ее через форму, выбрав страну из списка и нажав кнопку Submit, она будет работать надлежащим образом. Но если попытаться перейти на страницу другими способами, то появится сообщение об ошибке, поскольку обработчик будет пытаться одновременно выполнить два остальных запроса.
-
Еще раз установите отступ для двух верхних строк с SQL-запросами. Над строкой с первым запросом добавьте условие, которое проверяет наличие переменной URL-адреса.
Для ASP:
If IsEmpty(Request.QueryString("regionID")) Then
Для ColdFusion:
<cfif Not IsDefined("url.regionID")>
Для PHP:
if (!isset($_GET['regionID'])) {
Если при проверке этого условия тоже будет возвращено значение true (истина), значит, не существует ни переменных формы, ни переменных URL-адреса, и должен выполняться первый SQL-запрос – наименее строгий. Этот запрос расположен под строкой с условием, так что если условие выполняется, будет запущен запрос.
Если возвращается значение false (ложь), то это означает, что переменная URL-адреса существует, и должен выполняться второй запрос.
-
В строке между двумя верхними запросами введите код, необходимый для запуска второго запроса.
Для ASP:
Else
Для ColdFusion:
<cfelse>
Для PHP:
} else {
Этот запрос может быть запущен только в том случае, если не существует переменной формы, но имеется переменная URL-адреса.
-
После второго SQL-запроса добавьте новую строку, чтобы закрыть блок с вложенным условием.
Для ASP:
End If
Для ColdFusion:
</cfif>
Для PHP:
}
Этот код завершает блок с вложенным условием, урок и приложение для поиска и отображения путешествий.
-
Сохраните файл и загрузите его на сервер. Откройте страницу tours.asp в браузере и опробуйте все доступные виды поиска.
Завершенное приложение работает в любых критических ситуациях. Отображаются все (и только те) путешествия, которые соответствуют критериям поиска. Навигационная панель для перемещения между записями будет скрыта или видима в зависимости от количества записей, извлеченных из базы во время поиска. При щелчке на названии страны загрузится страница с информацией о ней. Если щелкнуть на ссылке Tour Price Calculator (Калькулятор для расчета стоимости тура), загрузится приложение для расчета стоимости, а в списке будет выбрано название соответствующего тура. Итак, посетители получают возможность работать с удобным и функциональным интерфейсом, позволяющим подробнее узнать о том, что предлагает компания Newland Tours.
Резюме
В этом уроке вы узнали, как:
- готовить страницу tours.asp к добавлению трех видов поиска;
- создавать динамический список/меню, пересылающего данные на страницу tours_detail.asp при помощи динамически сформированных переменных URL-адреса;
- создавать такой же список/меню на другой странице;
- использовать комментарии для временной блокировки участков кода для проведения тестирования и отладки;
- создавать форму, содержащую список, наполняемый динамическими данными;
- отображать или скрывать навигационную панель для перемещения между записями – в зависимости от количества извлеченных из базы записей;
- создавать SQL-запрос, фильтрующий данные из двух объединенных таблиц на основе значения переменной URL-адреса, а также запрос, производящий фильтрацию на основе переменной формы;
- создавать SQL-запрос, использующий предикат EXIST и содержащий подчиненный запрос;
- динамически переключаться между запросами в зависимости от наличия или отсутствия переменных среды при помощи условных конструкций if…else и функций IsEmpty() (ASP), IsDefined() (ColdFusion) и isset() (PHP).