Використання pdo в php
PDO це абревіатура від PHP Data Objects. Дане розширення надає нам доступ до Базам Даних використовуючи об'єкти. І в цій статті ми детально розглянемо, як працювати з цим розширенням, що в ньому хорошого і поганого. Велкам.
Перш ніж почати розмову про PDO, давайте розберемося, чому нас не влаштовують mysql і mysqli. Ну, mysql не влаштовує хоча б тим, що воно вже оголошено deprecated, і в нових версіях підтримуватися не буде. Mysqli - більш нове розширення, яке має ряд переваг, перед його попередником mysql і прекрасно працює, але ... Якщо ви починаєте розробку нового проекту і вибираєте, що використовувати: mysqli або PDO, ви повинні вибрати PDO і ось чому.
По-перше, додатки на PHP вже стали об'єктно-орієнтованими, і PDO реалізує саме об'єктно-орієнтований підхід до роботи з БД. Це сильно спрощує роботу з кодом, його масштабованість і підтримку, а так само стандартизированность, якщо можна так висловитися. По-друге, і це більш важливо, PDO - це високорівнева інтерфейс доступу до Бази даних, але не обов'язково до MySQL. PDO підтримує безліч різних баз даних: MySQL, PostgreSQL, SQLite, MSSQL і інші. Якщо одного прекрасного ранку ви вирішите переїхати з MySQL в PostgreSQL, то вам потрібно буде замінити всього-лише один рядок, а не переписувати весь код. По-третє, в PDO є така штука, як "Біндінг" параметрів. Далі ви дізнаєтеся, що це. Поки лише скажемо, що це дозволяє легше "конструювати" складні запити динамічно і забезпечує захист від SQL-ін'єкцій.
Установка з'єднання з базою
Для установки з'єднання з базою даних за допомогою PDO, вам потрібно форматувати об'єкт PDO наступним чином:
Конструктор приймає три параметри:
- Так звана рядок dsn. У ній вказано драйвер підключення до бази, хост, ім'я бази і кодування.
- Логін
- пароль
На відміну від звичних тобі mysql_query (або mysqli_query), в PDO для здійснення запитів є два методи: один використовується для запитів, які повертають результат (select, show), другий - для запитів, які не повертають результат (insert, update, delete ...) .
виконання запитів
Ось, простий приклад вставки даних:
Ось які можуть бути варіанти значень:
- PDO. FETCH_ASSOC - повертає асоціативний масив. В наведеному вище прикладі, щоб отримати id потрібно використовувати $ row [ 'id']
- PDO. FETCH_NUM - повертає нумерований масив. В наведеному вище прикладі, щоб отримати id потрібно використовувати $ row [0];
- PDO. FETCH_OBJ - повертає об'єкт. Для отримання id викликаємо $ row -> id;
- PDO. FETCH_CLASS - повертає екземпляр заздалегідь зазначеного класу, при цьому вибрані дані (поля таблиці в БД) будуть відповідати відповідним полях (властивостями) класу.
Примітка: Рекомендується завжди вказувати FETCH_MODE, в іншому випадку за замовчуванням буде вказано FETCH_BOTH, що означає, що дані будуть доступні в двох варіантах, як асоціативний масив, і як звичайний масив, що витрачає рівно в 2 рази більше пам'яті.
Напевно ви звернули увагу на константу FETCH_CLASS. Так, це супер можливість. Давайте подивимося на неї ближче.
Припустимо, ось наш клас User:
Коли ми викликаємо метод prepare (), PDO парсит запит і кешує його для подальшого використання. Коли в нашому циклі ми знову викликаємо execute (), запит вже не створюється. Ми тільки підставляємо нове значення. Як я вже говорив, це позитивно позначається на швидкодії програми.
Так само ви могли помітити, що я використовував метод fetchColumn (), про який нічого не говорив ще. Настав час. Цей метод повертає значення першого поля. Він дуже зручний, коли нам потрібно виконати count (), sum (), min (), max () і інші подібні запити.
Біндінг значень в умова IN
Багато програмістів, які вперше стикаються з PDO і доходять до ситуації з використанням умови IN () стикаються з деякими проблемами. Уявіть, що ми склали рядок із значень розділених комами з айдішніков користувачів, яких хочемо дістати з бази.