KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Виктор Гольцман - MySQL 5.0. Библиотека программиста

Виктор Гольцман - MySQL 5.0. Библиотека программиста

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Виктор Гольцман, "MySQL 5.0. Библиотека программиста" бесплатно, без регистрации.
Перейти на страницу:

Для получения информации о возникшей ошибке предназначены методы

errstr()

и

err()

Метод errstr() возвращает описание ошибки, произошедшей при выполнении последней SQL-команды, или значение undef, если команда была выполнена успешно. Метод mysql_errno() возвращает код ошибки, произошедшей при выполнении последней SQL-команды, или undef, если команда была выполнена успешно.

Значения, возвращаемые методами errstr() и err(), не рекомендуется отображать на веб-странице, чтобы не раскрывать информацию об архитектуре приложения. Вместо этого вы можете записывать сведения об ошибке в файл или отсылать по электронной почте разработчику или администратору приложения.

Приведу пример обработки возникшей ошибки – запись ошибки в файл:

my $dbh = DBI -> connect(«DBI:mysql:database=SalesDept;host=localhost»,

«username»,»userpassword»,

{PrintError=>0,RaiseError=>0});

if(!$dbh)

{

#Формируем сообщение об ошибке

my $logmessage = localtime.”

«.DBI->err().» «.DBI->errstr().»n»;

#Открываем log-файл

my $res = open(my $log, «>>», «mysqlerror.log»);

if(!$res)

{

print “Ошибка при открытии журнала”;

die();

};

#Записываем в файл сообщение об ошибке

print $log $logmessage;

#Закрываем файл

$res = close $log;

if(!$res)

{

print “Ошибка при закрытии журнала”;

die();

}

#Выводим сообщение об ошибке на странице

print “Ошибка доступа к базе данных.

Приносим свои извинения”;

#Завершаем работу

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 Filesxamppperlbinperl.exe»

print «Content-type: text/html; charset=windows-1251nn»;

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.=»<tr><td>».$product->{DESCRIPTION}.»</td>».

«<td>».$product->{DETAILS}.»</td>».

«<td>».$product->{PRICE}.»</td></tr>n»;

}

#Освобождаем ресурсы

$query -> finish();

#Отсоединяемся от базы данных

$dbh->disconnect();

#Выводим полученные данные

print “

<html>

<head>

<title>Работа с MySQL</title>

</head>

<body>

<!– Выводим заголовок списка товаров –>

<h1>Список товаров</h1>

<table>

<tr>

<th>Наименование</th>

<th>Описание</th>

<th>Цена</th>

</tr>

«.$pagecontent.»

</table>

</body>

</html>

“;

Открыв в браузере страницу http://localhost/cgi-bin/output.pl, вы увидите список товаров (рис. 4.24).

Рис. 4.24. Вывод информации на странице

Отметим, что если в результате запроса присутствуют несколько столбцов с одинаковыми именами (это возможно в случае получения информации из нескольких таблиц), то метод fetchrow_hashref() предоставляет доступ только к последнему из этих столбцов. Кроме того, порядок элементов в хеше может отличаться от порядка столбцов в таблице; в этом легко убедиться, если вывести значения всех полей с помощью цикла foreach:

while(my $product = $query->fetchrow_hashref(«NAME_uc»))

{

print «

»

foreach my $field_name (keys %$product)

{

print «$product->{$field_name}t»;

}

print “

}

Этих недостатков лишен метод fetchrow_arrayref(), который работает аналогично методу fetchrow_hashref(), но возвращает ссылку на массив с числовыми индексами. При использовании метода fetchrow_arrayref() сценарий для вывода списка товаров будет следующим (листинг 4.13). Листинг 4.13. Получение информации и отображение ее на странице

#!»C:Program Filesxamppperlbinperl.exe»

print «Content-type: text/html; charset=windows-1251nn»;

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=””;

#Для каждой строки из результата запроса

#записываем данные в массив и сохраняем ссылку на массив

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*