Урок 12: Создание поисковых интерфейсов
-
Непосредственно перед предложением ORDER BY , расположенным ближе к концу SQL-инструкции, введите следующий код:
Для ASP:
WHERE tbl_country.region=" & Request.QueryString("regionID") & "
Для ColdFusion:
WHERE tbl_country.region = #url.regionID#
Для PHP:
WHERE tbl_country.region =". $_GET['regionID'] ."
После закрывающих кавычек ( " ) в ASP и PHP, а также после закрывающего знака # в ColdFusion должен стоять пробел. Другими словами, предложение ORDER BY не должно без пробела примыкать к кавычкам или знаку #.
Совет.Как говорилось ранее, в ASP оператор & применяется для конкатенации (или объединения) текстовых строк. С той же целью используется точка ( .) в PHP. Конкатенация необходима в обоих случаях, поскольку смешиваются литеральные строки (составляющие большую часть SQL-запросов), которые ASP или PHP должны передать без изменения, и специальный код ASP или PHP, который требуется оценить, например, Request.QueryString () (ASP) или $_GET() (PHP). Строки заключаются в кавычки, а выражения нет. Для их совместного употребления следует объединить участки кода при помощи оператора & или точки. При использовании ColdFusion такой проблемы не возникает, поскольку в этом случае выражения, которые требуется оценить, помещаются между знаками #…#.Итак, для чего предназначен добавленный в запрос код? Он создает дополнительный критерий для отбора, который значительно сужает первоначально заданную область поиска. При выполнении первого варианта поиска из базы данных извлекается вся информация, необходимая для отображения всей информации о турах. Новый запрос делает то же самое, но при этом извлекает только те путешествия, которым соответствует значение поля regionID, равное значению переданного на страницу параметра URL-адреса.
Приведем конкретный пример. Каждому путешествию соответствует поле, в котором можно указать страну. Как известно из предшествующих уроков, в этом поле содержится внешний ключ, указывающий на таблицу tbl_country. Таким образом, двум турам, проводимым во Франции, соответствует одно и то же значение внешнего ключа countryID. Это общее поле связывает таблицу путешествий с таблицей стран (в данном случае все туры, проводимые во Франции, посредством этого поля связаны со значением France в таблице tbl_country ).
Одно из полей в таблице стран ( tbl_country ) является внешним ключом из таблицы регионов ( tbl_region ). Таким образом, Франции будет соответствовать значение 3 в поле regionID, поскольку 3 – это идентификатор Европы, а Франция, естественно, входит в Европу. Помимо Франции, в Европе находятся Соединенное Королевство и Италия, – так что каждой из этих стран соответствует идентификатор региона, равный 3. Японии соответствует значение regionID, равное 4 (East Asia [Восточная Азия]). Следовательно, все путешествия, которые проводятся в Японии, соответствуют значению regionID, равному 4, а не 1 или 3. Поскольку Таиланд тоже находится в Восточной Азии, и ему соответствует значение regionID, равное 4, то все туры в Таиланд также связаны с этим значением ( regionID=4 ).
Таким образом, связь параметра regionID со странами относится к типу отношений "один-ко-многим". То есть, каждому региону может соответствовать несколько стран. Точно так же любая страна связана с многочисленными турами (тоже отношением "один-ко-многим"), то есть, в одной стране может проводиться несколько путешествий. Однако ни одна страна не может принадлежать к нескольким регионам, и ни одно путешествие не может соответствовать нескольким странам. Таким образом, достаточно написать запрос, который бы извлекал путешествия, если соответствующие им страны расположены в выбранном регионе. Отображаться будут только эти путешествия.
Именно это условие определяет предложение WHERE в SQL-инструкции. Чтобы убедиться в том, что файл работает, как и ожидалось, следует протестировать его в браузере.
-
Сохраните страницу tours_detail.asp , загрузите на сервер, и закройте. На панели Site (Сайт) выберите страницу tours.asp и нажмите клавишу (F12), чтобы протестировать ее.
Тестировать страницу tours_detail.asp напрямую не представляется возможным, поскольку при загрузке страницы появится сообщение об ошибке. Для выполнения написанного в предыдущем шаге SQL-запроса обязательно наличие переменной URL-адреса regionID. Если просто загрузить страницу, эта переменная окажется недоступной, вследствие чего выполнение SQL-запроса окажется невозможным, и появится сообщение об ошибке.
-
На странице tours.asp выберите в меню ссылку на любой из регионов.
При переходе по выбранной ссылке на странице будут показаны только те туры, которые соответствуют выбранному региону, так что эта часть сценария работает вполне корректно.
Но есть и не очень приятные новости: навигационная панель для перемещения между записями осталась на странице. Поскольку в данный момент ни в одном регионе не проводится больше пяти туров, страница становится одновременно и первой, и последней, – поэтому все четыре ячейки оказываются пустыми. Модель поведения Repeat Region (Повторяющаяся область), предназначенная для отображения путешествий на этой странице, ограничена отображением только пяти туров. Было бы неплохо скрывать навигационную панель в том случае, если страница является единственной, то есть когда из базы извлечено не более пяти записей. Но если количество извлеченных записей превысит пять (в частности, когда в компании Newland Tours будут проводиться новые туры по Германии, Норвегии и Испании), навигационная панель должна появиться вновь.