Вывод списка статей

Архив WebclubТехнологии2011

Публикация прежнего Webclub · 2011 год. Примеры и сведения сохранены в историческом контексте.

Теперь, когда у вас есть работающая база данных с пресс-релизами, можно без особых проблем подключить ее к Web-странице. Начнем с создания простейшей страницы, которая отображает список всех имеющихся пресс-релизов. Заметьте, что по умолчанию Web-сервер Apache «думаеть», что все ваши документы должны находится в его директории htdocs, а исполняемые файлы — в cgi-bin. Следовательно, необходимо поместить все файлы с расширением .pl в каталог cgi-bin. В свою очередь, создаваемые файлы HTML-шаблонов нужно разместить в каталоге tpl. Иерархия каталогов будет выглядеть следующим образом:

/ (корень любого диска)

/local

/local/usr

/local/usr/bin

/local/usr/cgi-bin

/local/usr/htdocs

/local/usr/tpl

Для систем DOS/Windows путь к cgi-bin может выглядеть так:

c:\local\usr\cgi-bin

Шаг 1

Используя свой любимый текстовый редактор, создайте файл pr-list-tpl.htm:

15. <html>

16. <head>

17. <title>Пресс-релизы 2001</title>

18. </head>

19. <body>

20. @BLOCK@

21. </body>

22. </html>

Этот файл предназначен для отображения списка всех доступных пресс-релизов.

Шаг 2

Создайте файл pr-list-block-tpl.htm, который будет отображать каждый блок с найденным пресс-релизом в виде таблицы:

23. <table border="1" width="400" cellpadding= _

"2" cellspacing="1">

24. <tr><td width="400"><a href= _

"/cgi-bin/@READ@?id=@NUMBER@">@TITLE@</a></td></tr>

25. <tr><td width="400"><i><b>@AUTHOR@</b>,    _

@DATE@</i></td></tr>

26. </table>

Шаг 3

Создайте файл pr-content-tpl.htm, который будет отображать содержание пресс-релиза:

27. <html>

28. <head>

29. <title>Press-releases 2001: @TITLE@</title>

30. </head>

31. <body>

32. <h2>@TITLE@</h2>

33. <table>

34. <tr><th align="left">@TITLE@</th></tr>

35. <tr><td><i>Author: <b>@AUTHOR@</b> Date: @DATE@</i></td></tr>

36. <tr><td>@BODY@</td></tr>

37. </table>

38. <a href="/cgi-bin/@LIST@">Show the list of press-releases..</a>

39. </body>

40. </html>

Шаг 4

Создайте Perl-скрипт pr-list-dbi.pl, который будет читать данные из базы данных db_website и, используя шаблонные HTML-файлы, отображать список пресс-релизов (текст этого скрипта вы сможете найти на нашем компакт-диске).

А теперь пройдемся по листингу кода и рассмотрим, как работает программа вывода списка пресс-релизов.

Строки 1-9 представляют собой как бы инициализирующий блок, в котором объявляются все глобальные переменные и константы:

41. #!/local/usr/bin/perl

42. 

43. use DBI;

44. $dbh = DBI->connect(‘dbi:mysql:db_website’,’root’,’’);

45. $path = "/local/usr/tpl";

46. $TPL_LIST = "$path/pr-list-tpl.htm";

47. $TPL_LIST_BLOCK = "$path/pr-list-block-tpl.htm";

48. 

49. print "Content-type:text/html\n\n";

Сперва мы сообщаем Web-серверу Apache путь, указывающий, где находится интерпретатор Perl, который запускается при запросе скрипта, проверяет его на ошибки и затем выполняет его. Далее мы объявляем модуль DBI (DataBase Interface), методы которого будут использоваться в программе для взаимодействия с базой данных (строка 3). Затем мы устанавливаем соединение с нашей базой данных db_website (4), указывая в качестве входного имени пользователя root (администратор), а в качестве пароля пустую строку (значение, принятое по умолчанию). В переменной $path указываем путь, по которому находятся файлы HTML-шаблонов (5). В переменных $TPL_LIST и $TPL_LIST_BLOCK соответственно указываем их имена (6, 7). Потом, сообщаем Web-серверу, что все исходящие данные должны представляться в MIME-формате text/html для вывода HTML-потока в пользовательский браузер (9).

Строки 11-22 представляют собой тело программы:

50. 

51. open (L, "$TPL_LIST");

52. while ($line1=<L>) {

53. chomp($line1);

54. if ($line1=~/\@BLOCK\@/) {

55. read_db();

56. ins_data();

57. } else {

58. print "$line1\n"; 

59. }

60. }

61. close(L);

62. 

63. $dbh->disconnect;

Открываем файл-шаблон pr-list-tpl.htm (11) и в цикле (12-20) просматриваем его, записывая каждую считанную строку в переменную $line. Во время каждой итерации производим проверку на наличие в этой строке ключевого слова @BLOCK@ (14-19), означающего, что в данном месте надо вставить блок с пресс-релизом. Как только оно найдено, вызываем процедуры read_db() и ins_data().

Строки 26-39 — тело процедуры read_db(), предназначенной для считывания содержимого таблицы tbl_news_items, в которой хранятся наши пресс-релизы:

64. 

65. 

66. sub read_db {

67. $c=0;

68. my($sql) = "SELECT * FROM tbl_news_items";

69. $rs = $dbh->prepare($sql);

70. $rs->execute;

71. while (my $ref = $rs->fetchrow_hashref()) {

72. $id[$c] = "$ref->{‘col_id’}";

73. $title[$c] = "$ref->{‘col_title’}";

74. $author[$c] = "$ref->{‘col_author’}";

75. $date[$c] = "$ref->{‘col_date’}";

76. $c++;

77. }

78. $rs->finish();

79. }

Инициализируем счетчик $c=0, составляем запрос выборки всех данных из таблицы (28), выполняем запрос (29, 30) и получаем данные в рекордсет (recordset — набор записей) $rs. Затем в цикле (31-37) извлекаем данные из рекордсета, используя метод fetshrow_hashref и возвращая ссылку на ассоциативный массив %ref (31), содержащий имена и значения полей текущей записи. Записываем извлеченные данные (32-35) в соответствующие их типам обычные массивы @id, @title, @author и @date. Закрываем рекордсет (38).

Строки 41-53 — тело процедуры ins_data(), реализующей вставку извлеченных из БД данных в исходящий поток данных; строки 55-63 — тело процедуры pr_block(), вызываемой в цикле из процедуры ins_data():

80. 

81. sub ins_data {

82. $toread = "pr-read-dbi.pl";

83. for ($i=0; $i<$c; $i++) {

84. $line = &pr_block;

85. 

86. $line =~ s/\@NUMBER\@/$id[$i]/;

87. $line =~ s/\@TITLE\@/$title[$i]/;

88. $line =~ s/\@AUTHOR\@/$author[$i]/;

89. $line =~ s/\@DATE\@/$date[$i]/;

90. $line =~ s/\@READ\@/$toread/;

91. print "$line";

92. }

93. }

94. 

95. sub pr_block {

96. my($block) = ‘’;

97. open (B, "$TPL_LIST_BLOCK");

98. while ($line=<B>) {

99. $block = $block.$line;

100. }

101. close(B);

102. return ($block);

103. }

Итак, получив в результате выполнения процедуры read_db() максимальное значение счетчика $c, в цикле (43-52) мы запускаем процедуру pr_block(), которая читает содержимое HTML-шаблона pr-list-block-tpl.htm и записывает его в переменную $block (59), значение которой затем возвращается (62) в переменную $line (44) процедуры ins_data(). Далее в этом же цикле мы заменяем (46-50) найденные в исходящем потоке $line ключевые слова @NUMBER@, @TITLE@, @AUTHOR@, @DATE@, @READ@ на соответствующие данной итерации цикла ($i) значения массивов @id, @title, @author, @date и переменной $toread.

Ещё из архива

Архив клуба
веб-разработчиков

HTML, CSS, программирование и история интернета. Публикации прежнего Webclub по своим адресам.

Открыть архив
Сайт на ноутбуке и телефоне