Калининград+7.962.2626.555

Работа с PDO

05.03.2012

Подключение PDO

Во-первых, нужно подключить базу данных через PDO:

<?
try {
    $host = 'localhost';
    $dbname = 'test';
    $username = 'root';
    $password = '';
    $dbh = new PDO('mysql:host='.$host.';dbname='.$dbname,$username,$password);

    // Напомним PDO про кодировку с которой будем работать
    $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8');

    // Установим режим контроля ошибок, при котором можно обрабатывать ошибки
    // и при этом скрывать данные, которые могут помочь злоумышленнику при взломе
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) { // При возникновении ошибки в блоке try вызывается исключение

    // Полный путь к файлу, где возникло исключение
    $e->getFile();
    // Номер строки, где возникло исключение
    $e->getLine();
    // Текстовое сообщение исключения
    $e->getMessage();

}
?>

Используем подготовленные выражения

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

Добавление строк

Метод prepare() как раз отвечает за подготовку запроса с именнованным шаблоном. Метод execute() выполняет действие, описанное в prepare(), подставляя массив с данными для шаблонов. Важно, чтобы имена ключей массива соответствовали именам шаблонов, т.е. тому что идет после знака «:».

try {
    $sth = $dbh->prepare('INSERT INTO `test` (`id`, `caption`, `text`) values (:id, :caption, :text)');
    $data = array('id' => NULL, 'caption' => 'Заголовок', 'text' => 'Текст');
    $sth->execute($data);
} catch (PDOException $e) {
    ...
}

Для того, чтобы узнать идентификатор только что добавленной записи AUTO_INCREMENT (аналог стандартной функции mysql_insert_id()) нужно использовать метод lastInsertId():

$last_id = $dbh->lastInsertId();

Обновление строк

Аналогичная картина с обновлением строк:

try {
    $sth = $dbh->prepare('UPDATE `test` SET `caption`=:caption, `text`=:text WHERE `id`=:id LIMIT 1');
    $data = array('id' => '1', 'caption' => 'Заголовок', 'text' => 'Текст');
    $sth->execute($data);
} catch (PDOException $e) {
    ...
}

Удаление строк

try {
    $sth = $dbh->prepare('DELETE FROM `test` WHERE `id`=:id LIMIT 1');
    $data = array('id'=>'1');
    $sth->execute($data);
} catch (PDOException $e) {
    ...
}

Получение данных

Для получения данных используется метод fetch(). Перед тем как вызвать этот метод, нужно сообщить PDO, в каком виде мы хотим получить данные. Всего этих видов существует около 8. Но для нас интересен только массив, индексированный по именам столбцов таблицы из которой происходит выборка. За это отвечает опция FETCH_ASSOC. Т.о. для установки нужной опции извлечения данных используется запись:

try {
    $sth = $dbh->prepare('SELECT * FROM `test` WHERE `id`=:id LIMIT 1');
    $data = array('id'=>'1');
    $sth->execute($data);

    $sth->setFetchMode(PDO::FETCH_ASSOC);

    while ($array = $sth->fetch()) {
        print_r($array);
    };
} catch (PDOException $e) {
    ...
}

Для получения количества строк, которые были успешно обработаны методом execute(), нужно воспользоваться методом rowCount():

$rows_count = $sth->rowCount();

Вышеописанного вполне достаточно, для решения большинства задач.