Окончательный этап этой головоломки - сценарий details.cgi, который использует переданные ему через URL данные (идентификатор статьи и идентификатор комментария) для того, чтобы создать запрос к базе данных и вывести одну страницу (см. рис. 20.7) с именем автора, временем размещения комментария и текстом комментария.
Листинг 20.39.
#!/usr/bin/perl
# считать необходимые модули use DBI;
use CGI;
# инициировать объект CGI $cgi = new CGI();
# распечатать HTTP- заголовки print $cgi->header();
# распечатать заголовок страницы print $cgi->start_html;
# проверка отправки идентификатора статьи if (!$cgi->param('aid'))
{
print " Невозможно найти идентификатор статьи, завершение рабо­ты..."; 
die;
}
else
{
$aid = $cgi->param('aid');
}
# проверка идентификатора комментария if (!$cgi->param('cid')
{
print " Невозможно найти идентификатор комментария, завершение ра­боты
die;
}
else
{
$cid = $cgi->pararn('cid');
}
# подключиться к базе данных
my $dbh = DBI->connect("DBI:mysql:database=dbl;host=localhost",
"root", "pass', ('RaiseError' => 1));
# выбрать наименование статьи и ее описание
my $sth = $dbh->prepare("SELECT atitle, adesc FROM articles WHERE aid = '$aid'");
$sth->execute();
# если получен результат
# распечатать содержание статьи
# иначе - сообщение об ошибке if ($sth->rows() > 0)
{
$ref = $sth->fetchrow_hashref();
print "<font face="Verdana, Aria1" size="4"
color="#66CC00">n";
print $ref->{'atitle'), "n";
print "</font>n"; print "<p>n";
print "<font face="Verdana, Aria1" size="2"
color="Black">n";
print $ref->{'adesc'), "n"; print "</font>n";
}
else
{
print " Невозможно выбрать содержание статьи, завершение рабо­ты..."; die;
}
# очистить дескриптор оператора $sth->finish ();
print" <hr> n" ;
# а теперь получить детали комментария
# выполнить запрос
my $sth = $dbh->prepare("SELECT cemail, ctimestarnp.csubject. cpost FROM comments WHERE cid = '$cid'");
$sth->execute() ;
# распечатать содержание комментария if ($sth->rows() > 0) 
{
$ref = $sth->fetchrow_hashref();
print "<font face="Verdana, Arial" size="2"
color="Black">n";
print "Размещен <b>$ref->{'cemail'}</b> в $ref->{'ctimestamp'} <br>n":
print "^^ема:</b> $ref->{'csubject'} <br>n";
print "^комментарий:</b> $ref->{ 'cpost'} <br>n";
print "</font>n"; print "<p>n";
}
else
{
print " Невозможно выбрать комментарий, завершение работы..."; die;
}
print" <hr>n";
# закрыть соединение с базой данных $sth->finish(); $dbh->disconnect();
# Распечатать нижний колонтитул страницы
# со ссылкой на ответы с возможностью просмотра других комментариев print <<EOF;
<font face="Verdana, Arial" size="2" color="Black">
<a href="post.cgi?aid=$aid&creply=$cid">Ответить</a> на этот коммента­рий rara<a
href="article.cgi?aid=$aid">прочесть другие комментарии</a> </font>
EOF
print $cgi->end_html;
Следует обратить особое внимание на ссылку в конце сценария. В случае, когда читатель хочет ответить на этот конкретный комментарий, переменная $creply будет хранить идентификатор комментария, согласно которому будет формироваться ответ. После этого переменная $creply передается сценарию post.cgi в виде дополнительного параметра и сохраняется в базе данных. Таким образом, завершается цикл, необходимый для генерации дерева обсуждения.
Копаем глубже
Для получения более подробной информации о Perl можно порекомендовать сле­дующие Internet-ресурсы!
• Официальный Web-узел Perl: http://www.perl.com/
• CPAN: http://www.cpan.org
• Perldoc: http://www.perldoc.com
• Справочное руководство по DBI.pm: http://search.cpan.org/author/TIMB/ DBI-1.37/DBI.pm
• Посвященный языку Perl раздел на Web-узле Melonfire, содержащий статьи, практи­ческие примеры и курсы обучения: http://www.melonfire.com/community/ columns/trog/archives.php?category=Perl
• Посвященный языку Perl раздел на Web-узле Devshed: http://www.devshed. com/Server_Side/Perl/ 
Резюме
DBI-интерфейс языка Perl включает широкий диапазон функций, предназначенных для управления соединением, выполнения запроса, обработки результирующих наборов и ошибок. В этой главе обсуждаются важнейшие методы каждой из перечисленных функций, примеры и иллюстрации их использования.
Не вдаваясь в сложности программирования, эта глава также содержит практический пример взаимодействия Perl и MySQL с простой системой комментариев, реализованной на Web-узле. Не пользуясь Web-сервером и применяя CGI-интерфейс в качестве шлюза, это приложение предоставляет пользователям интерфейс для просмотра, добавления и ответа на комментарии, размещенные на Web-узле. Модуль DBI-интерфейса Perl отвечает за подключение к базе данных, выборку и модификацию табличных данных и форматирование полученных данных для вывода их на экран.