#Завершаем работу
die();
}
Если при подключении к базе данных произойдет ошибка, в файл mysqlerror. log, находящийся в папке cgi-bin, будет записано сообщение, содержащее дату и время, номер и описание ошибки. Например, если база данных SalesDept (Отдел продаж) была удалена, в файле появится запись вида Sat Jun 28 11:15:00 2008 1049 Unknown database \'salesdept\'.
Далее вы узнаете о том, каким образом приложение Perl работает с данными, полученными из БД с помощью запроса.
Выполнение запроса к базе данных
Для поиска информации в базе данных необходимо последовательно вызвать методы
prepare(«<���Текст запроса>»)
и
execute()
Метод prepare() обеспечивает подготовку запроса для последующего выполнения и возвращает дескриптор команды – указатель на объект, реализующий все операции, связанные с запросом: выполнение запроса, обработку результатов запроса и др. Далее вызывается метод execute() дескриптора команды, который выполняет запрос и возвращает значение TRUE в случае успеха или значение undef в случае ошибки. Например, чтобы получить все данные из таблицы Products (Товары), выполните команды
my $query = $dbh->prepare(«SELECT * FROM Products»); $query -> execute();
В переменной $query хранится дескриптор команды.
...
Примечание
Если требуется выполнить динамический запрос, содержащий переменные величины, вы можете воспользоваться привязкой параметров, о которой было сказано в подразделе «Ввод данных в базу». А именно, в тексте команды эти величины нужно заменить символами? а их значения передать в качестве параметров метода execute(). Например, получить список товаров, цена которых не превосходит значения переменной $max_price, можно следующим образом:
my $query = $dbh->prepare(SELECT * FROM Products
WHERE price <= ?);
$query -> execute($max_price);
Для получения доступа к значениям в результате запроса вы можете использовать метод
fetchrow_hashref([<���Регистр>])
или
fetchrow_arrayref()
Метод fetchrow_hashref() получает очередную строку из результата запроса, преобразует ее в ассоциативный массив (хеш) и возвращает ссылку на этот массив. Вы можете указать в качестве аргумента значение NAME_uc или NAME_lc, чтобы привести имена столбцов к верхнему или, соответственно, нижнему регистру. После обработки результатов запроса освободить память, занятую под массив полученных запросом данных, можно с помощью метода
finish()
Рассмотрим работу с запросом на примере вывода списка товаров, то есть данных из таблицы Products (Товары). Создайте в папке cgi-bin корневой папки XAMPP файл input.pl, содержащий код, представленный в листинге 4.12. Листинг 4.12.Получение информации и отображение ее на странице
#!»C:\Program Files\xampp\perl\bin\perl.exe»
print «Content-type: text/html; charset=windows-1251\n\n»;
use DBI;
#Подсоединяемся к базе данных
my $dbh = DBI -> connect(«DBI:mysql:database=SalesDept;host=localhost»,
«username»,»userpassword»);
if(!$dbh)
{
print «Ошибка доступа к базе данных. Приносим свои извинения”;
die();
}
#Устанавливаем кодировку CP-1251
$dbh->do(«SET NAMES cp1251»);
#Выполняем запрос к базе данных
my $query = $dbh->prepare(«SELECT * FROM Products»);
my $qresult = $query -> execute();
if(!$qresult)
{
print “Ошибка доступа к базе данных. Приносим свои извинения”;
die();
}
#Создаем строку для вывода результатов запроса
my $pagecontent=””;
#Для каждой строки из результата запроса
#записываем данные в хеш и сохраняем ссылку на хеш
#в переменной $product
while(my $product = $query -> fetchrow_hashref(«NAME_uc»))
{
#Выводим элементы хеша
#с индексами DESCRIPTION, DETAILS и PRICE
$pagecontent.=»
».$product->{DESCRIPTION}.» |
».$product->{DETAILS}.» |
».$product->{PRICE}.» |
\n»;
}
#Освобождаем ресурсы
$query -> finish();
#Отсоединяемся от базы данных
$dbh->disconnect();
#Выводим полученные данные
print “
Список товаров
«.$pagecontent.»
Наименование |
Описание |
Цена |
“;
Открыв в браузере страницу http://localhost/cgi-bin/output.pl, вы увидите список товаров (рис. 4.24).
Рис. 4.24.Вывод информации на странице
Отметим, что если в результате запроса присутствуют несколько столбцов с одинаковыми именами (это возможно в случае получения информации из нескольких таблиц), то метод fetchrow_hashref() предоставляет доступ только к последнему из этих столбцов. Кроме того, порядок элементов в хеше может отличаться от порядка столбцов в таблице; в этом легко убедиться, если вывести значения всех полей с помощью цикла foreach:
Читать дальше
Конец ознакомительного отрывка
Купить книгу