MySQL / 18. Обработка ввода через Web с помощью MySQL

Выполнение поиска и получение результатов

Задача
Вы хотите реализовать веб-интерфейс для поиска.

Решение
Предложите пользователю форму, содержащую поля, в которых можно указать параметры поиска – ключевые слова. Используйте эти ключевые слова для формирования запроса, затем выведите результаты.

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

Вы как разработчик сценария должны реализовать следующие операции:

• Генерирование формы и отправка ее пользователю.

• Интерпретация отправленной формы и создание запроса на основе ее содержимого. Соответствующим образом используются заполнители и кавычки для предотвращения разрушения сценария некорректным вводом.

• Отображение результата запроса. Это просто, если результирующее множество небольшое, или сложнее, если результат большой.

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

В этом разделе приводится сценарий search_state.pl, реализующий самый простой интерфейс поиска: форму с одним полем для ввода ключевого слова, по которому строится запрос, возвращающий не более одной записи. Сценарий выполняет двусторонний поиск в таблице states. Если пользователь вводит название штата, сценарий выводит соответствующую аббревиатуру. И наоборот, если пользователь вводит аббревиатуру, сценарий ищет для нее имя:

#! /usr/bin/perl -w
# search_state.pl – простое приложение "поиска штата"
# Вывести форму с полем ввода и кнопкой отправки. Пользователь вводит в поле
# аббревиатуру или полное название штата и отправляет форму. Сценарий находит
# аббревиатуру и выводит полное имя или находит имя и выводит аббревиатуру.
use strict;
use lib qw(/usr/local/apache/lib/perl);
use CGI qw(:standard escapeHTML);
use Cookbook;
my $title = "State Name or Abbreviation Lookup";
print header (), start_html (-title => $title, -bgcolor => "white");
# Извлечь параметр keyword. Если его значение задано и не пусто, выполняется поиск.
my $keyword = param ("keyword");
if (defined ($keyword) && $keyword !~ /^\s*$/)
{
my $dbh = Cookbook::connect ();
my $found = 0;
my $s;
# Сначала пытаемся найти совпадающую с ключевым словом аббревиатуру;
# в случае неудачи ищем совпадающее имя.
$s = $dbh->selectrow_array ("SELECT name FROM states WHERE abbrev = ?",
undef, $keyword);
if ($s)
{
++$found;
print p ("You entered the abbreviation: " . escapeHTML ($keyword));
print p ("The corresponding state name is : " . escapeHTML ($s));
}
$s = $dbh->selectrow_array ("SELECT abbrev FROM states WHERE name = ?",
undef, $keyword);
if ($s)
{
++$found;
print p ("You entered the state name: " . escapeHTML ($keyword));
print p ("The corresponding abbreviation is : " . escapeHTML ($s));
}
if (!$found)
{
print p ("You entered the keyword: " . escapeHTML ($keyword));

Статьи по MySQL на эту тему:

Ведение журнала Apache с помощью MySQL
Журнал доступа к веб-странице
Сортировка результатов запроса по произвольному столбцу
Счетчики посещаемости веб-страниц
Формирование ссылок на предыдущую и следующую страницы