Урок - Класс PDO

Главная » Курсы » Курс PHP5, PDO - PHP Data Objects » Урок - Класс PDO

Обучающий онлайн курс
PHP5, PDO - PHP Data Objects

Лицензия: Копирование запрещено.

Класс PDO

Класс PDO используется для соединения с базой данных, выполенения запросов.

Методы класса PDO

  • PDO::__construct() - подключение к базе данных
  • PDO::beginTransaction() - начинается операция транзакции
  • PDO::commit() - комментирование транзакции
  • PDO::errorCode() - получает код ошибки, если таковые имеются, из базы данных
  • PDO::errorInfo() - получает массив информации об ошибках из базы данных
  • PDO::exec() - выполненяет SQL запрос и возвращает количество запрошенных строк
  • PDO::getAttribute() - получает атрибут соединения с базой данных
  • PDO::getAvailableDrivers() - вернет список доступных драйверов в виде массива (pdo_drivers()).
  • PDO::lastInsertId() - извлекает значение последней строки, которая была вставлена в таблицу
  • PDO::prepare() - готовит SQL запрос для выполнения
  • PDO::query() - выпускает SQL statement и возвращает результирующий набор
  • PDO::quote() - возвращает экранируемую строку версию строки для использования в запросах SQL
  • PDO::rollBack() - откат транзакции
  • PDO::setAttribute() - устанавливает атрибуты соединения с базой данных

Подключение к БД используя PDO

Для начала уточним какие драйвера доступны PDO. Выполните следующий код:

echo 'Доступные драйвера:';
print_r(PDO::getAvailableDrivers());
// синоним
print_r(pdo_drivers());

Или выполните следующий код для проверки доступности конкретного драйвера:

if (array_search('mysql', PDO::getAvailableDrivers())){
echo 'Драйвер PDO MySQL доступен';
}else{
echo 'Драйвер PDO MySQL не доступен';
exit();
}

Синтаксис подключения используя класс PDO следующий:

$pdo = new PDO( <DSN-путь>, <DB-user>, <DB-password>[, <Settings>])

<DSN-путь> - строка в формате:

'<Driver>:host=<HostName>;dbname=<DataBaseName>' 
  • <Driver> - имя PDO-драйвера
  • <HostName> - имя хоста
  • <DataBaseName> - имя базы данных

<DB-user> - логин пользователя для доступа к Базе Данных.

<DB-password> - пароль пользователя для доступа к базе данных.

<Settings> - массив настроек для подключения.

Примеры подключения к БД используя класс PDO:

Пример 1: Простое подключение к БД используя класс PDO:

$pdo = new PDO( 'mysql:dbname=dbase;host=127.0.0.1', 'root', 'psw'); 

Пример 2: Подключение к БД используя класс PDO, используя константы:

// можно сохранить в отдельный файл настроек
define('PDO_DSN', 'mysql:dbname=dbase;host=127.0.0.1');
define('PDO_USERNAME', 'root');
define('PDO_PASSWORD', 'psw');

//...
$pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);

Пример 3: Подключение к БД используя класс PDO с обработкой исключения:

define('PDO_DSN', 'mysql:dbname=dbase;host=127.0.0.1');
define('PDO_USERNAME', 'root');
define('PDO_PASSWORD', 'psw');

try {
$pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);
} catch (PDOException $e) {
echo 'Connection error: ' . $e->getMessage();
}

Закрытие соединения в PDO

Закрытие соединения происходит удалением объекта соединения PDO:

 $pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);
// что-то делаем
$pdo = NULL;
 $pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);
// что-то делаем
unset($pdo);

Выполнение запросов средствами PDO

Выполнение запросов посредством метода PDO::exec()

Метод PDO::exec(), возвращает количество отработанных строк.

 $count = $pdo->exec("INSERT INTO `test` (name, ints) VALUES ('Name', 100);");
echo "Обработано $count строк";

Выполнение запросов посредством метода PDO::query()

Метод PDO::query(), возвращает экземпляр класса PDOStatement (рассмотрим позже), который сожержит в себе ссылку на выборку.

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles` LIMIT 2");
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}
$pdoStatement = $pdo->query("INSERT INTO `articles` (`title`, `viewed`) values('Title 2', '200')");
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}

В случае ошибки запроса PDO::query() вернет FALSE:

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `не известная таблица` LIMIT 2");
print_r($pdoStatement);
echo $pdoStatement === FALSE ? 'FALSE' : 'NOT FALSE';

У метода PDO::query() есть несколько не обязательных параметров. Второй параметр указывает в каком виде и какую информацию возвращать:

  • PDO::FETCH_BOTH- возвращает данные в виде массива с числовыми и ассоциативными ключами.
  • PDO::FETCH_NUM- указывает вернуть данные в виде массива только с числовыми ключами.
  • PDO::FETCH_ASSOC (PDO::FETCH_NAMED) - возвращает данные в виде массива только с ассоциативными ключами.
  • PDO::FETCH_COLUMN- указывает вернуть данные определенной колонки.
  • PDO::FETCH_OBJ - указывает вернуть данные в виде объекта.

Если указано PDO::FETCH_BOTH, то данные выборки будут возвращаться в виде массива с числовыми и ассоциативными ключами.

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_BOTH);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}

Параметр PDO::FETCH_BOTH используется в методе PDO::query() по умолчанию.

Следующий параметр PDO::FETCH_NUM- указывает возвращать данные только с числовыми ключами.

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_NUM);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}

Параметр PDO::FETCH_ASSOC(PDO::FETCH_NAMED) - указывает возвращать данные только с ассоциативными ключами.

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_ASSOC);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}
$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_NAMED);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}

Для параметра PDO::FETCH_COLUMN- указывает возвращать данные только определенной колонки.

Для настройки PDO::FETCH_COLUMN обязательно указывать третий параметр.

Ниже приведены примеры кода использующие параметр PDO::FETCH_COLUMN. В первом и последнем случае будет ошибка уровня E_WARNING:

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_COLUMN);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}
$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_COLUMN, 0);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}
$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_COLUMN, 1);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}
$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`", PDO::FETCH_COLUMN, 2);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}

Обратите внимание, что данные выводятся не массивами (как в случае с PDO::FETCH_BOTH), а строками

Вставка данных в БД средствами PDO

Получение значения первичного ключа последней вставленной записи с помощью PDO::lastInsertId()

Для получения значения первичного ключа последней вставленной записи используется метод PDO::lastInsertId():

echo $pdo->lastInsertId(); 

Пример вставки данных используя PDO::exec():

$pdo->exec("INSERT INTO `articles` (`title`, `viewed`) values('Title 1', '100');");
echo $pdo->lastInsertId();

Пример вставки данных используя PDO::query():

$pdoStatement = $pdo->query("INSERT INTO `articles` (`title`, `viewed`) values('Title 2', '200')");
echo $pdo->lastInsertId();

Изменение данных из БД средствами PDO

Пример обновления данных используя PDO::exec():

$pdo->exec("UPDATE `articles` SET `title` = 'Title New' WHERE `id` = `;"); 

Пример обновления данных используя PDO::query():

$pdo->query("UPDATE `articles` SET `title` = 'Title New' WHERE `id` = `;"); 

Получение данных из БД в виде объектов средствами PDO

Как уже говорилось ранее, в зависимости от второго парметра метода PDO::query() можно получать данные отличающиеся ключами:

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles` LIMIT 2", PDO::FETCH_BOTH);
print_r($pdoStatement);
foreach($pdoStatement as $k => $v){
print_r($v);
}

Рассмотрим возможность - получать данные в виде объекта указывая параметр PDO::FETCH_OBJ:

$pdo = new PDO(...);
$pdoStatement = $pdo->query('SELECT * FROM `test`', PDO::FETCH_OBJ);
$obj = $pdoStatement->fetch();
print_r( $obj);

Теперь объект $obj содержит нужные нам данные в виде объекта.

PDO дает возможность получать объект определенного класса:

class article{
public function getTitle(){
echo $this->title . ' (' . $this->viewed . ')';
}
}

$pdoStatement = $pdo->query("SELECT `title`,`viewed` FROM `articles`");
$article = $pdoStatement->fetchObject('article');
print_r($article);
echo $article->getTitle();

Когда PDO создает экземпляр класса он автоматически вызывает конструктор указанного класса, который в свою очередь может обрабатывать переменные.

Задание для выполнения

Необходимо создать несколько функций для работы с таблицами справочников. Справочник представляет собой набор терминов. Например:

  • Справочник метрических единиц. Состоит из м., см., дм., световой год, ...
  • Справочник валют. Состоит из EURA, RURA, USDA =))
  • Справочник производителей. Acir, 6Tech, Ponosonic, ...

Необходим следующий функционал:

  • сохранение термина - функция сохраняющая термин в базу.
  • удаление термина - функция удаляющая термин.
  • создание списка - функция возвращает корректный HTML код для элемента <select> из всех терминов указанного справочника .

Работу с базой производить с помощью PDO. Структуру таблиц создать по своему усмотрению.