Опубликован: 24.12.2006 | Уровень: для всех | Доступ: платный

Урок 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-адреса.

  1. Откройте страницу tours_detail.asp . В режиме Code (Код) найдите три строки SQL-кода и удалите символы комментариев, в которые заключена часть из них. Выше и ниже этих строк добавьте несколько разрывов строки, чтобы отделить запросы от остального кода.

    На этом шаге производится подготовка к добавлению запросов в условную конструкцию if…else. При этом невозможно повредить код в соседних строках. После того, как обработчик сценария ASP или ColdFusion определит, какой запрос выполнять, остальные два будут полностью проигнорированы.

  2. Над верхней строкой запроса введите строку кода, проверяющую существование переменной формы.

    Для ASP:

    If IsEmpty(Request.Form("tourCountry")) Then

    Для ColdFusion:

    <cfif Not IsDefined("form.tourCountry")>

    Для PHP:

    if (!isset($_POST['tourCountry'])) {

    Результатом обработки этого условия (как и любого другого) будет значение true (истина) или false (ложь). Если возвращается значение true (то есть переменной формы не существует), сценарий должен определить, существует ли переменная URL-адреса. Если возвращается значение false, становится ясно, что посетитель выбрал страну из списка формы, а, следовательно, нужно выполнять третий запрос.

  3. С помощью клавиши (Tab) установите отступ от края для всех трех SQL-запросов. Над строкой с третьим запросом создайте новую строку и введите в ней код, благодаря которому будет запускаться третий запрос.

    Для ASP:

    Else

    Для ColdFusion:

    <cfelse>

    Для PHP:

    } else {

    Если после проверки условия возвращается значение false, обработчик будет проводить в коде поиск операторов else if или else. Когда он их находит, они выполняются. Добавление этого кода обеспечивает запуск запроса, производящего фильтрацию на основе переменной формы, в том случае, если она существует.

  4. Добавьте приведенный ниже код после строки третьего запроса, чтобы закрыть блок if…else .

    Для ASP:

    End If

    Для ColdFusion:

    </cfif>

    Для PHP:

    }

    Итак, половина задачи решена. Если сейчас загрузить страницу на сервер и запустить ее через форму, выбрав страну из списка и нажав кнопку Submit, она будет работать надлежащим образом. Но если попытаться перейти на страницу другими способами, то появится сообщение об ошибке, поскольку обработчик будет пытаться одновременно выполнить два остальных запроса.

  5. Еще раз установите отступ для двух верхних строк с 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-адреса существует, и должен выполняться второй запрос.

  6. В строке между двумя верхними запросами введите код, необходимый для запуска второго запроса.

    Для ASP:

    Else

    Для ColdFusion:

    <cfelse>

    Для PHP:

    } else {

    Этот запрос может быть запущен только в том случае, если не существует переменной формы, но имеется переменная URL-адреса.

  7. После второго SQL-запроса добавьте новую строку, чтобы закрыть блок с вложенным условием.

    Для ASP:

    End If

    Для ColdFusion:

    </cfif>

    Для PHP:

    }

    Этот код завершает блок с вложенным условием, урок и приложение для поиска и отображения путешествий.

  8. Сохраните файл и загрузите его на сервер. Откройте страницу 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).

Екатерина Мезенцева
Екатерина Мезенцева
Россия
Маргарита Туктарова
Маргарита Туктарова
Соединенное Королевство, London, kingston university, 2012