Введення в PDO

19

Від автора: при створенні власних сайтів або CMS на мові PHP, так або інакше, необхідно використовувати бази даних для зберігання контенту, і часто розробники використовують для цього систему керування базами даних MySQL. Довгий час, для роботи з вищевказаної СУБД використовувалося однойменне розширення мови PHP – mysql, яке дуже добре справлявся зі своїм завданням, але як кажуть, ні що не вічне, і з виходом PHP 5.5, це розширення було оголошено застарілим. Тому в даному невеликому уроці я хотів би поговорити про розширення PDO, яке пропонує універсальний спосіб роботи з різними базами даних.

Введення в PDOВведення в PDO

Отже, PDO – PHP Data Objects – це бібліотека, яка містить набір методів, з роботи з різними базами даних, при цьому доступ до конкретної бази даних, здійснюється за допомогою відповідного драйвера, який обов’язково повинен бути підключений в інтерпретатор мови PHP, Таким чином PDO, забезпечує абстракцію доступу до баз даних, а це означає, що незалежно від того, яка база використовується для роботи з даними, Ви можете використовувати одні і ті ж методи. Що дуже зручно для реалізації підтримки в створюваному скрипті різних баз даних.

PDO пропонує тільки об’єктно-орієнтованих підхід і впроваджений в мову PHP, починаючи з версії 5.1.

Початок роботи

Для початку, необхідно переконатися, що драйвер розширення PDO, для цікавить бази даних підключений у Вашому інтерпретатор PHP. Для цього відкриваємо головний конфігураційний файл php.ini, який міститься в корені директорії, в яку встановлений інтерпретатор. Далі опускаємося в блок підключаються розширень, і ставимо крапку з комою перед будівництвом цікавить драйвера. Приміром, якщо, PDO, буде використовуватися для роботи з СУБД MySQL, значить необхідно переконатися, що підключено розширення php_pdo_mysql.dll.

Введення в PDO

Для СУБД SqLite — php_pdo_sqlite.dll. В даний час PDO PHP підтримує 12 різних СУБД, повний список яких наведено на сторінці офіційній документації.

Якщо цікавить розширення закомментировано, тобто перед рядком драйвера вказана точка з комою, значить, її необхідно видалити і перезапустити веб-сервер Apache. Тепер можна приступати до роботи з PDO.

Підключення до бази даних

Для підключення до цікавої базі даних, потрібно створити об’єкт глобального класу PDO, і передати певні параметри методу конструктору. Для підключення до бази даних MySQL (PDO MySQL), необхідно вказати наступне:

$pdo = new PDO(‘mysql:host=localhost;dbname=slim_db;charset=utf8′,’root’,»);

В якості першого параметра, в конструктор класу PDO, передається спеціальний рядок, яка містить у собі тип бази даних (ім’я драйвера), далі шлях до сервера бази даних (через двокрапку), ім’я бази даних, яку буде виконано підключення та кодування. При цьому спеціальна рядок з інформацією підключення, для кожного драйвера своя, і більш докладно про кожен драйвер можна почитати в документації.

Другий параметр – ім’я користувача для підключення до бази даних. Третій і останній параметр – пароль доступу до бази даних. Для роботи з базою даних SqLite, при створенні об’єкта PDO, слід передати наступні параметри:

$pdo = new PDO(‘sqlite:example.db’);

База даних SqLite, зазвичай розташовується в єдиному файлі, тому конструктору класу PDO, достатньо передати всього один параметр, із зазначенням імені драйвера і імені файлу з базою даних.

І останній приклад – для з’єднання з СУБД MsSQL, необхідно прописати наступне:

$pdo = new PDO(«mssql:host=$host;dbname=$dbname», $user, $pass);

Для обробки винятків, код можна укласти в блок try, і відповідно в блоці catch(), виконувати необхідні дії, при виникненні помилок:

try {
$pdo = new PDO(‘mysql:host=localhost;dbname=slim_db;charset=utf8′,’root’,»);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo $e->getMessage();
}

При цьому в PDO передбачений спеціальний клас для роботи з винятками PDOException, який, звичайно ж, ми і використовуємо. Використовуючи метод setAttribute(), вказуємо режим обробки помилок – константа PDO::ERRMODE_EXCEPTION. Це найкращий режим, на етапі розробки коду. Тобто при виникненні помилки, буде згенеровано виняток, який буде опрацьовано в блоці catch().

Вибірка даних

Тепер давайте поговоримо про те, як же виконати вибірку даних з певної таблиці бази даних. Для виконання запиту, який повинен повернути якийсь результат, тобто запит типу SELECT, в класі PDO передбачений метод query():

$sql = «SELECT * FROM slim_users»;
$result = $pdo->query($sql);
foreach($result as $row) {
echo «

«.$row[‘id’].» | «.$row[‘username’];
}

Зверніть увагу, що викликаючи метод query(), в якості першого параметра передається запит, який необхідно виконати. При цьому повертається об’єкт класу PDOStatement, який можна використовувати для отримання готового результат. А саме, використовуючи цикл foreach(), пройтися по даному об’єкту, як по звичайному багато-мірного асоціативним масивом та відобразити дані на екран в необхідному вигляді.

Також для читання результатів можна використовувати метод fetch(), який отримує наступний рядок з результуючого набору.

$sql = «SELECT * FROM slim_users»;
$result = $pdo->query($sql);
while($row = $result->fetch()) {
echo «

«.$row[‘id’].» | «.$row[‘username’];}

В якості першого параметри при виклику методу fetch(), передається режим роботи даного методу, тобто в якому вигляді будуть повертатися дані. Режим роботи – це одна з наступних констант

PDO::FETCH_ASSOС — повертає асоціативний масив, у якому імена клітинок, співпадають з іменами полів.

while($row = $result->fetch(PDO::FETCH_ASSOC)) {
echo «

«.$row[‘id’].» | «.$row[‘username’];
}

PDO::FETCH_NUM — повертає простий індексний масив.

while($row = $result->fetch(PDO::FETCH_NUM)) {
echo «

«.$row[0].» | «.$row[1];
}

PDO::FETCH_BOTH повертає як індексний масив, так і асоціативний.

while($row = $result->fetch(PDO::FETCH_BOTH)) {
echo «

«.$row[0].» | «.$row[‘username’];
}

PDO::FETCH_OBJ – повертає масив об’єктів, імена властивостей яких збігаються з іменами вибраних стовпців.

while($row = $result->fetch(PDO::FETCH_OBJ)) {
echo «

«.$row->getId().» | «.$row->getUsername();
}

PDO::FETCH_CLASS: створює і повертає об’єкт певного класу, привласнюючи значення стовпців результуючого набору, іменованим властивостями класу. При цьому дану константу передають в якості першого параметра методом setFetchMode(), а в якості другого — ім’я класу. Наприклад, створимо клас, імена властивостей, якого збігається з іменами вибраних стовпців.

id;
}
public function getUsername() {
return $this->username;
}
}

Тепер, використовуємо його для отримання даних вибірки:

$sql = «SELECT * FROM slim_users»;
$result = $pdo->query($sql);
$result->setFetchMode(PDO::FETCH_CLASS,’User’);
while($row = $result->fetch()) {
echo «

«.$row->getId().» | «.$row->getUsername();
}

Тобто в методах даного класу, можна вказати деякі дії, які будуть обробляти обрані дані. При цьому метод setFetchMode(), вказує на режим роботи методу fetch() і методу fetchAll(). Для отримання всіх рядків результуючого набору, можна використовувати метод fetchAll(), який за один виклик, поверне абсолютно всі вибрані дані, що дуже зручно:

$sql = «SELECT * FROM slim_users»;
$result = $pdo->query($sql);
$result->setFetchMode(PDO::FETCH_ASSOC);
print_r($result->fetchAll());

Вставлення та оновлення даних

Для виконання запитів типу INSERT і UPDATE, необхідно викликати метод exec() і в якості першого параметра, передати виконується SQL-запит. При цьому даний метод поверне кількість задіяних рядків в ході виконання запиту.

$sql = ‘INSERT INTO `slim_users` (`username`, `password`) VALUES («newsuser»,»newpassword»)’;
$affacted_rows = $pdo->exec($sql);
echo $affected_rows;

Підготовлені вираження

Розширення PDO, на відміну від застарілого mysql, підтримує підготовлені вираження. Підготовлений SQL запит – це заздалегідь скомпільовані SQL запит, який може бути виконаний багаторазово. Підготовлені вираження більш безпечні, оскільки не проходять SQL-ін’єкції і швидше стандартних запитів. Розглянемо наступний SQL-вираз:

$sql = «SELECT * FROM slim_users WHERE `id` = :id»;

На перший погляд – це звичайний SQL запит, але замість значення в умові WHERE, вказує так званий «placeholder», тобто комірка для майбутнього значення. Саме ж значення буде передано під час виконання запиту, після його підготовки. При цьому в SQL запиті, я використовував іменований «placeholder» (ім’я вказується після двокрапки). Для підготовки та виконання даного запиту використовуємо наступний код:

$result = $pdo->prepare($sql);
$id = 1;
$result->execute(array(‘:id’ => $id));

Тобто метод prepare(), готує SQL-вираз, а метод execute() – його виконує. При цьому в якості першого параметра, при виклику методу execute(), передається значення для «placeholder» (проставленою мітки в SQL вираженні). Формуючи SQL запит, можна використовувати неіменовані параметри:

$sql = «SELECT * FROM slim_users WHERE `id` = ?»;
$result = $pdo->prepare($sql);
$id = 3;
$result->execute(array($id));

Так само передаються значення в SQL-вираз, можна прив’язати до певних змінних, використовуючи метод bindParam():

$sql = «SELECT * FROM slim_users WHERE `id` = :id»;
$result = $pdo->prepare($sql);
$id = 3;
$result->bindParam(‘:id’,$id,PDO::PARAM_INT);
$result->execute();

При виклику методу bindParam(), в якості першого параметра, передається ім’я «placeholder», в якості другого – змінна, до якої прив’язується параметр запиту, а третім параметром передається тип даних значення параметра, який заданий однією з стандартних констант. Повний список констант, можна побачити на сторінці документації.

На цьому даний урок завершено. Ми з Вами розглянули тільки основи розширення PDO, тому якщо Вас зацікавила дана розширення, в офіційній документації, що Ви знайдете більш розширену інформацію.

Всього Вам доброго і вдалого кодування!!!