Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #52, МАРТ 2005 г.

Доступ к БД из web-приложений

Филипп Коряка

Спецвыпуск: Хакер, номер #052, стр. 052-062-3


while (@arr = $sth->fetchrow_array()){

print("Книга: $arr[1]<BR>\n");

print("Цена: $arr[2]<BR>\n");

print("<B>$arr[3]</B><BR>\n");

}

while (($index, $name, $price, $description) = $sth->fetchrow_array()){

print("Книга: $name<BR>\n");

print("Цена: $price<BR>\n");

print("<B>$description</B><BR>\n");

}

Твою жизнь еще больше облегчает использование метода fetchrow_hashref(), поскольку в этом случае нет необходимости перечислять все поля. Плюс ко всему этому, даже если таблица будет подвергнута изменениям, если поля станут располагаться в другом порядке, если в SQL-запросе вместо перечисления полей ты будешь использовать символ "*", твой код все равно останется рабочим. Правда, такой подход не лишен недостатков, но о них пока вежливо умолчу.

Иногда после выполнения всех действий с дескриптором состояния бывает нужно вызвать его метод finish(). Такой вызов будет свидетельствовать о том, что мы больше не собираемся получать данные из этого состояния и что все соответствующие буферы СУБД могут быть очищены. Конечно, необходимость вызова метода finish() возникает крайне редко, как правило, в ситуациях, в которых результатом выполнения команды является гораздо больший объем данных, чем мы реально используем. Например:

$sth = $dbh->prepare("SELECT * from new_table");

$sth->execute();

my $ex=0;

while ((($index, $name, $price) = $sth->fetchrow_array()) && !$ex){

$ex = analyse($index, $name, $price);

}

В данном примере после выполнения запроса в буфере СУБД размещается множество записей из таблицы new_table. Далее функция analyse() поочередно анализирует данные из каждого ряда и, предположим, возвращает 1 на третьем ряду. С этого момента оставшиеся ряды перестают интересовать нас, но продолжают храниться в буфере СУБД до тех пор, пока $sth не будет присвоено неопределенное значение или пока мы не выйдем из области действия $sth. Вызов метода finish() позволяет досрочно очистить буфер СУБД.

Perl: Дисконнект

По окончании работы с БД следует не забыть отключиться от нее вызовом метода disconnect():

$dbh->disconnect()

Замечу, что на момент отключения от БД все дескрипторы состояния должны быть неактивны, то есть для всех дескрипторов должен быть вызван метод finish(), или они должны содержать неопределенное значение, или должен быть осуществлен выход из области их действия. В случае вызова метода disconnect() при имеющихся активных дескрипторах состояния будет получена ошибка.

Не стоит забывать о том, что подключение к СУБД - довольно длительная процедура, поэтому подключений и отключений в скрипте должно быть как можно меньше. Идеальна ситуация с одним подключением к СУБД в начале скрипта и с одним отключением в конце. Не нужно подключаться к СУБД для выполнения одного запроса, затем отключаться и для следующего запроса проделывать все заново.

Иногда для большего ускорения работы скрипта подключение к БД происходит вообще всего один раз. А все скрипты, которые будут запускаться позже, используют уже имеющийся дескриптор БД. Такой подход используется в mod_perl.

Назад на стр. 052-062-2  Содержание  Вперед на стр. 052-062-4