Доступ к БД из 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() следует избегать. Дело в том, что для доступа к полям ряда ты будешь вынужден использовать цифровые индексы, а это значит, что разобраться в таком коде без структуры базы перед глазами будет очень трудно. Сравним два этих примера кода, и все станет ясно: |