Код информационно-поисковой системы

001 #!C:/apache/bin/perl/perl
002
003
004 # Вывод поля заголовка о типе содержимого
005 print "Content-type: text/html\n\n";
006
007
008 # Подключаемые модули
009 require '_stdlib.pl';
010
011
012 # Вызов подпрограммы получения и разбора пользовательского запроса,
? переданного методом GET
013 &recvquery_get;
014
015
016 # Вызов подпрограммы формирования начального блока кода
017 &start('Каталог книг');
018
019
020 # Вывод формы поиска
021 print "<form action=\"search.pl\" method=\"get\">\n";
022 print "<p>Автор:<br /><input type=\"text\" size=\"30\"
? maxlength=\"100\" name=\"author\"
? value=\"$userdata{'author'}\"/></p>\n";
023 print "<p>Название:<br /><input type=\"text\" size=\"30\"
? maxlength=\"100\" name=\"title\"
? value=\"$userdata{'title'}\"/></p>\n";
024 print "<p>Издательство:<br /><input type=\"text\" size=\"30\"
? maxlength=\"50\" name=\"publisher\"
? value=\"$userdata{'publisher'}\" /></p>\n";
025 print "<p>Год выпуска:<br />с <input type=\"text\" size=\"4\"
? maxlength=\"4\" name=\"year1\" value=\"$userdata{'year1'}\" /> по
? <input type=\"text\" size=\"4\" maxlength=\"4\" name=\"year2\"
? value=\"$userdata{'year2'}\" /></p>\n";
026 print "<p><input type=\"submit\" value=\"Найти\"></p>\n";
027 print "</form>\n";
028
029
030 # Проверка введенных данных
031 if(($userdata{'author'} ne '') || ($userdata{'title'} ne '') ||
? ($userdata{'publisher'} ne '') || ($userdata{'year1'} ne '') ||
? ($userdata{'year2'} ne ''))
032 {
033 if(($userdata{'year1'} ne '') && ($userdata{'year1'} !~ /^\d{4}$/))
034 {
035 print "<p><span style=\"color: #c00; font-weight:
? bold\">Ошибка!</span> Значение минимального года должно быть
? четырехзначным числом!</p>\n";
036 &stop;
037 }
038
039 if(($userdata{'year2'} ne '') && ($userdata{'year2'} !~ /^\d{4}$/))
040 {
041 print "<p><span style=\"color: #c00; font-weight:
? bold\">Ошибка!</span> Значение максимального года должно быть
? четырехзначным числом!</p>\n";
042 &stop;
043 }
044
045 if($userdata{'year1'} > $userdata{'year2'})
046 {
047 print "<p><span style=\"color: #c00; font-weight:
? bold\">Ошибка!</span> Минимальный год больше
? максимального.</p>\n";
048 &stop;
049 }
050
051
052 # Проверка существования и открытие файла данных
053 if(-e 'data.txt')
054 {
055 open(INFILE, 'data.txt')
056 }
057 else
058 {
059 print "<p><span style=\"color: #c00; font-weight:
? bold\">Ошибка!</span> Файл данных не существует.</p>\n";
060 &stop;
061 }
062
063 print "<table>\n";
064
065 # Начальное число найденных записей
066 $qty = 0;
067
068 # Непосредственно поиск
069 while($inline = <INFILE>)
070 {
071 chomp($inline);
072 @fields = split('\|', $inline);
073
074 $userdata{'author'} = lowcase($userdata{'author'});
075 $userdata{'title'} = lowcase($userdata{'title'});
076 $userdata{'publisher'} = lowcase($userdata{'publisher'});
077
078 if(((lowcase($fields[0]) =~ /$userdata{'author'}/) ||
? ($userdata{'author'} eq '')) && ((lowcase($fields[1]) =~
? /$userdata{'title'}/) || ($userdata{'title'} eq '')) &&
? ((lowcase($fields[2]) =~ /$userdata{'publisher'}/) ||
? ($userdata{'publisher'} eq '')) && (((($fields[3] >=
? $userdata{'year1'}) || ($userdata{'year1'} eq '')) &&
? (($fields[3] <= $userdata{'year2'}) || ($userdata{'year2'}
? eq '')))))
079 {
080 print "<tr>\n<td>$fields[0]</td>\n<td>$fields[1]</td>\n
?<td>$fields[2]</td>\n<td>$fields[3]</td>\n</tr>\n";
081 $qty++;
082 }
083 }
084
085 print "<tr>\n<td colspan=\"4\">Найдено записей:
? $qty.</td>\n</tr>\n";
086 print "</table>\n";
087
088 close(INFILE);
089 }
090
091
092 # Вызов подпрограммы формирования конечного блока кода
093 &stop;
094
095
096 # Подпрограмма приведения строк к нижнему регистру
097 sub lowcase
098 {
099 my $string = shift(@_);
100 $string =~ tr/A-ZА-Я/a-zа-я/;
101 return $string;
102 }
Данный пример представлен на компакт-диске, прилагаемом к этой книге, в папке \examples\05\03. Внешний вид окна браузера при работе с программой приведен на рис. 5.3.

Код этого скрипта, снабженный комментариями, полагаю, довольно прозрачен, но тем не менее представляется необходимым обсудить некоторые ключевые моменты.
Форма поиска (строки 21—27) имеет 5 текстовых полей:
? author — автор;
? title — название книги;
? publisher — издательство;
? year1 — начальный год диапазона;
? year2 — конечный год диапазона.
Данные формы передаются этому же скрипту (search.pl) при помощи HTTP-метода GET.
Поиск производится только в том случае, если заполнено хотя бы одно из полей (строка 31).
Значения, введенные пользователем в полях веб-формы, сохраняются там и после нажатия на кнопку «Найти», поскольку каждое поле формы использует атрибут value со значением, переданным с предыдущего шага при посредстве хэша %userdata.
Поиск является регистронезависимым, поскольку сопоставляемые данные (информация, переданная пользователем через веб-форму и информация, считываемая из файла данных) предварительно приводятся к нижнему регистру при помощи подпрограммы lowcase (строки 97—102).
Поиск по автору, названию книги и издательству осуществляется по подстроке. Иными словами, пользователь может ввести только часть фамилии автора или одно слово из названия книги — в выдаче он увидит все книги, информация о которых содержит эти подстроки в соответствующих полях (см. рис. 5.3). Поиск (строка 78) осуществляется с логикой «И»: если задано одновременно несколько критериев поиска, в выдаче будут фигурировать только те книги, информация о которых соответствует всем определенным пользователем критериям.


© 2008-2018 ОптимизацияВебСайтов.ру


Любое использование текстового и графического контента сайта без активной ссылки на источник не доскается.