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

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

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

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


$dbh = DBI->connect("DBI::db_name:hostname.domainname.ru", "login", "password");

Метод DBI->connect() в случае успешного выполнения возвращает дескриптор БД. В случае неудачи возвращается неопределенное значение и устанавливаются переменные $DBI::err (код ошибки) и $DBI::errstr (описание ошибки).

Perl: Запросы к БД

Установив соединение с БД и получив дескриптор БД, можно приступать к выполнению SQL-запросов. Всего существует два вида запросов: запросы, которые не возвращают данные, и, соответственно, те, которые их возвращают. Для первого типа используется метод do() дескриптора БД, возвращающий логическую истину в случае удачного выполнения запроса или логическую ложь в случае неудачи. Примером запроса, не возвращающего данные, может служить запрос на создание новой таблицы в БД:

$dbh->do("CREATE TABLE new_table (id INT, name CHAR(8))");

Другой пример запросов, не возвращающих данные, - запросы на удаление таблицы, изменение структуры таблицы и т.д.

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

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

$sth->execute();

После выполнения метода execute() можно приступать к получению результата выполнения запроса.

Perl: Получение результатов

Для получения результатов запроса используются методы fetchrow_array() и fetchrow_hashref() дескриптора состояния. Результаты запросов, как правило, представляют собой набор рядов и полей. При этом сразу после выполнения запроса (вызов метода execute()) первый ряд становится текущим. При каждом вызове методов fetchrow_array() или fetchrow_hashref(), как понятно из их названия, возвращается только один текущий ряд, при этом текущим становится следующий за ним и т.д. В случае если все ряды закончились, данные методы возвращают неопределенное значение.

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

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

$sth->execute();

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

# Здесь обрабатываем текущий ряд, который расположен в массиве @arr

}

или же:

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

$sth->execute();

while ($hashp = $sth->fetchrow_hashref()){

%hash = %$hashp;

# Здесь обрабатываем текущий ряд, который расположен в хэше %hash

}

Хотелось бы заметить, что на практике в большинстве случаев конструкций вида

@arr = $sth->fetchrow_array()

следует избегать. Дело в том, что для доступа к полям ряда ты будешь вынужден использовать цифровые индексы, а это значит, что разобраться в таком коде без структуры базы перед глазами будет очень трудно. Сравним два этих примера кода, и все станет ясно:

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