Опубликован: 24.12.2006 | Доступ: свободный | Студентов: 2671 / 212 | Оценка: 4.51 / 4.22 | Длительность: 23:31:00

Урок 12: Создание поисковых интерфейсов

  1. Сохраните файл и загрузите его на сервер. На панели Site (Сайт) выберите страницу tours.asp и нажмите клавишу (F12), чтобы протестировать ее. Выберите в списке любую страну и нажмите кнопку Submit.

    В большинстве стран есть только один тур, который и отобразится после выбора страны. Если выбрать страну, в которой проводится несколько путешествий (France, Japan, United Kingdom и United States), все они будут выведены на странице (см. рис. вверху следующей страницы).

    Если выбрать Тайвань (Taiwan), то загрузится пустая страница, поскольку, несмотря на то, что эта страна содержится в таблице tbl_country, в ней не проводится ни одного путешествия. Чисто гипотетически такое несоответствие вряд ли бы имело место. Однако в реальности путешествие по Тайваню может оказаться в стадии разработки. Менеджер, ответственный за добавление информации о странах, уже занес данные по Тайваню в базу данных, но полностью ввод всей информации о туре еще не завершен. Во многих базах данных, в том числе, в Microsoft Access (но не в MySQL), для учета этой ситуации в запрос добавляется условие для отбора только тех стран, в которых проводится как минимум одно путешествие.

  2. Только пользователям ASP и ColdFusion. Откройте файл tours.asp . На панели Bindings (Привязки) дважды щелкните на наборе записей Recordset ( rs_countries ), чтобы отредактировать его. В диалоговом окне Recordset (Набор записей) нажмите кнопку Advanced (Расширенный). Между строками FROM tbl_country и ORDER BY countryName ASC введите приведенный ниже код. Пользователям PHP выполнять этот шаг не нужно, однако рекомендуется прочитать последующий текст.
    WHERE EXISTS
    (SELECT * FROM tbl_tours WHERE tbl_tours.country = tbl_country.countryID)

    Пустое пространство не влияет на выполнение запроса, – так что для улучшения читаемости кода можно использовать разрывы строки.

    Поскольку в запрос внесен ряд дополнений, следует уделить пару слов языку SQL. Во-первых, здесь применяется подчиненный запрос, то есть запрос, включающий другой вложенный запрос или, что более характерно для данного случая, запрос, используемый в качестве критерия для другого запроса. В коде подчиненный запрос заключен в скобки. Он предназначен для поиска в таблице tbl_tours идентификаторов стран, которые совпадают с идентификаторами стран в таблице tbl_country. В эту категорию попадают все страны из базы данных, кроме Тайваня.

    Предикат EXISTS применяется для проверки существования строк, полученных в результате выполнения подчиненного запроса. Поскольку для выполнения запроса достаточно просто проверить их существование, действительные значения не извлекаются. В результате выполнения подчиненного запроса оказывается, что в двух таблицах одновременно ( tbl_tours и tbl_country ) находится 15 стран, после чего они включаются во внешний (основной) запрос. Поскольку Тайвань содержится только в одной из таблиц ( tbl_country ), он не включается.

    Примечание.Несмотря на то, что синтаксическая конструкция WHERE EXISTS и подчиненные запросы в целом являются частью стандарта ANSI для SQL, в MySQL они не поддерживаются. Если ввести этот код в MySQL, появится сообщение об ошибке. Именно из-за этого пользователи PHP не могут выполнить указанную операцию и вынуждены решать эту проблему другим способом. В данном случае лучшим решением будет создание двух баз данных, одна из которых применяется на сайте для разработки, а вторая предназначена на сайте для общего доступа. Во вторую базу копируются данные из первой только в том случае, если ее создание полностью завершено. Конечно, в данном случае волноваться по этому поводу не следует, поскольку проект является виртуальным.

    Чтобы увидеть результаты выполнения измененного запроса, следует нажать кнопку Test (Проверить). На этот раз, в списке будут отображены не 16, а 15 стран – без Тайваня. Как только в базу данных tbl_tours будет добавлено путешествие по Тайваню, эта страна снова появится в списке, поскольку она будет соответствовать условию с применением предиката EXISTS.

  3. Сохраните и закройте tours.asp.