Гольцман Виктор
Шрифт:
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.=»<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>
“;Открыв в браузере страницувы увидите список товаров (рис. 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 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_arrayref)
{
#Выводим элементы массива с номерами 1, 2, 3
$pagecontent.=»<tr><td>».$product->[1].»</td>».
«<td>».$product->[2].»</td>».
«<td>».$product->[3].»</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>
“;Итак, вы узнали, как создать сценарий Perl, запрашивающий информацию из базы данных. Теперь кратко обобщим основные сведения, изложенные в этом разделе.
Итоги
В данном разделе вы изучили функции языка Perl, позволяющие выполнять все необходимые операции с базой данных MySQL:
• подключение к базе данных и отключение от нее;
• выполнение SQL-команд как получающих информацию из базы данных (методы prepare и execute), так и не получающих ее (метод do);
• обработка ошибок.
Ознакомиться с полным списком функций модуля Perl DBI вы можете, перейдя по страницена ссылку Manual pages.
В следующем разделе вы узнаете о том, как взаимодействуют с базой данных веб-приложения на языке Java.
4.3. Интерфейс с Java
В этом разделе рассмотрим разработку Java-сервлетов, использующих базу данных MySQL для хранения и поиска информации. Вы узнаете, как создать и настроить среду разработки сервлетов, а также научитесь использовать для взаимодействия с MySQL функции JDBC (Java Database Connectivity – интерфейс доступа к базам данных из приложений Java).
В первую очередь вы узнаете, какое программное обеспечение потребуется для создания сервлетов.
Среда разработки сервлетов
Для создания сервлетов необходимы следующие программы:
• Java Development Kit (JDK) – пакет поддержки разработок в среде Java;
• дополнительная библиотека servlet-api.jar (или servlet.jar), необходимая для компиляции сервлетов, но не входящая в состав Java Development Kit;
• контейнер сервлетов – программа, обеспечивающая загрузку и выполнение сервлетов;