Работа с MySql. Создание Web интерфейса
Работа с MySql. Создание Web интерфейса
Cухинин A., Webscript.ru
Весь смысл нашей разработки теряется, если мы ее не облачим в Web оболочку или иначе говоря, не создадим для нее Web интерфейс. В первую очередь, нас интересует список категорий. В предыдущей статье:"Работа с MySql. Введение."
был рассмотрен пример с SQL запросом, который выводит список категорий на консоль. Теперь нам надо вывести это все в HTML страницу.
Значит установим цель: вывести в две колонки список категорий, слегка облагородив его. Поступим так: изготовим любую HTML страницу с необходимым нам дизайном, и в то место, где нам нужен список категорий поставим комментарий :
<!-- CATEGORIES_HERE -->
Сей шаг мы делаем для того, чтобы скрипт не перегружать текст программы избыточным кодом. Итак, приступим:
- Вывести заголовок типа данных;
- Выполнить SQL запрос;
- Разобрать результат;
- Вставить результат в шаблон HTML страницы;
План действий составлен, можно кодировать.
>
#/usr/bin/perl # Используем библиотеку DBI
use DBI;
# Выведем заголовок типа данных
print "Content-type:text/html\n\n"; # коннектимся к серверу MySql
my $dbh = DBI->connect("DBI:mysql:database=ваша_база_данных;host=адрес_сервера_mysql", "логин", "пароль") || die $DBI::errstr; # готовим запрос
my $result = $dbh->prepare("SELECT * FROM category"); # и выполняем его
$result->execute(); # начинаем вывод в шаблон вместо комментария.
open FILE, "cat_template.html" || die ("Не могу открыть файл cat_template.html!\n"); @arr = <FILE>; close FILE; # ищем строку комментария
foreach $line(@arr) { if ($line =~ "<!-- CATEGORIES_HERE") { # если нашли,
print "<tr>\n"; # начинаем вывод таблицы
$bg = 1; # признак начатой строки таблицы
$col = 1; # номер текущей колонки
print "<table width = \"80%\">\n"; # разбор резульата SQL запроса
while (my $ln = $result->fetchrow_hashref()) { if ($bg == 1) { # начата строка таблицы
if ($col == 1) { # если первая колонка
print "<td>",$ln->{'name'},"</td>"; $col++; } else { # $col == 2 т.е. 2-я колонка
print "<td>",$ln->{'name'},"</td></tr>\n"; $col = 1; $bg = 0; }
} else { if ($col == 1) { # начинаем строку таблицы
print "<tr>&td;td>",$ln->{'name'},"&td;/td>"; $col = 2; $bg = 1; } else { # $col == 2
print "<td>",$ln->{'name'},"</td></tr>\n"; $col = 1; $bg = 0; } } } if ($bg == 1) { # если строка начата и больше нет данных в результате
print "<td> </td></tr>\n"; # надо корректно закрыть начатую строку таблицы
} print "</table>\n"; # и закрыть таблицу
} } # метод finish означает, что ссылка на текущий SQL запрос использоваться больше не будет # и его можно завершить. По идее, его нужно вызывать перед выполнением нового запроса или перед # разрывом соединения с базой данных. # Вообще-то когда все данные выбраны из результата, этот метод вызывается автоматически, # но возникают ситуации, когда его нужно вызывать принудительно. На моей машине именно так и было # У вас эта ситуация может и не возникнуть.
$result->finish(); # Разрыв соединения с сервером.
$dbh->disconnect();
В результате вы должны получить следующую таблицу (рамки включены умышленно):
Все хорошо, только толку от нашей таблицы нет никакого. Нужно, чтобы, щелкнув по категории, открывалась страница со ссылками этой категории. Для этого нужно немного дописать код нашей программы. Введем переменную "$scr_name", обозначающую файл, содержащий скрипт, который будет выводить страницу со ссылками. После строки use DBI; вставим строку $scr_name="getlinks.pl"
Далее, внутри цикла while заменим все параметры функции print .... $ln->{'name'} на
<a href=\"$scr_name?page=$ln->{'id'}\">$ln->{'name'}</a>
Должно получиться что-то типа:
print "<td>","<a href=\"$scr_name?page=$ln->{'id'}\">$ln->{'name'}</a>","</td></tr>\n";
После этой процедуры все категории в вышеприведенной таблице в результате окажутся ссылками, правла неработающими, так как сам скрипт нам предстоит только написать.