Повний гайд: як користуватися PDO в PHP

PDO (PHP Data Objects) — це сучасний, безпечний та універсальний спосіб роботи з базами даних у PHP. PDO підтримує MySQL, PostgreSQL, SQLite та інші СУБД і дозволяє писати портований код без прив’язки до конкретної бази.

У цій статті ви навчитеся користуватися PDO на практиці: від підключення до бази даних до виконання складних запитів і транзакцій.


1. Чому варто використовувати PDO

  • ✔ Захист від SQL-інʼєкцій
  • ✔ Prepared statements
  • ✔ Єдиний API для різних СУБД
  • ✔ Підтримка транзакцій
  • ✔ Зручна обробка помилок

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

<?php
$dsn  = "mysql:host=localhost;dbname=test_db;charset=utf8mb4";
$user = "db_user";
$pass = "db_password";

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ]);
} catch (PDOException $e) {
    die("Помилка підключення: " . $e->getMessage());
}

3. SELECT-запити

Простий SELECT

$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll();

SELECT з параметрами (prepared statement)

$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE email = :email"
);

$stmt->execute([
    'email' => '[email protected]'
]);

$user = $stmt->fetch();

4. INSERT, UPDATE, DELETE

INSERT

$stmt = $pdo->prepare(
    "INSERT INTO users (name, email)
     VALUES (:name, :email)"
);

$stmt->execute([
    'name'  => 'Ivan',
    'email' => '[email protected]'
]);

$lastId = $pdo->lastInsertId();

UPDATE

$stmt = $pdo->prepare(
    "UPDATE users SET name = :name WHERE id = :id"
);

$stmt->execute([
    'name' => 'Petro',
    'id'   => 5
]);

DELETE

$stmt = $pdo->prepare(
    "DELETE FROM users WHERE id = :id"
);

$stmt->execute([
    'id' => 10
]);

5. Плейсхолдери в PDO

Іменовані

WHERE id = :id

Позиційні

WHERE id = ?
$stmt->execute([5]);

6. Типи даних та bindValue

Для числових значень, LIMIT та OFFSET рекомендується явно вказувати тип:

$stmt = $pdo->prepare(
    "SELECT * FROM users
     WHERE active = :active
     LIMIT :limit OFFSET :offset"
);

$stmt->bindValue(':active', true, PDO::PARAM_BOOL);
$stmt->bindValue(':limit', 20, PDO::PARAM_INT);
$stmt->bindValue(':offset', 0, PDO::PARAM_INT);

$stmt->execute();

7. Отримання результатів

  • fetch() — один рядок
  • fetchAll() — всі рядки
  • rowCount() — не рекомендовано для SELECT

8. Транзакції

try {
    $pdo->beginTransaction();

    $pdo->exec(
        "UPDATE accounts
         SET balance = balance - 100
         WHERE id = 1"
    );

    $pdo->exec(
        "UPDATE accounts
         SET balance = balance + 100
         WHERE id = 2"
    );

    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    echo "Помилка транзакції";
}

9. Обробка помилок

try {
    $pdo->query("SELECT * FROM unknown_table");
} catch (PDOException $e) {
    echo $e->getMessage();
}

10. Типові помилки при роботі з PDO

  • ❌ Конкатенація змінних у SQL
  • ❌ Відсутність prepared statements
  • ❌ ATTR_EMULATE_PREPARES = true
  • ❌ rowCount() для SELECT

11. PDO у WordPress

Хоча WordPress використовує $wpdb, PDO можна застосовувати:

  • у власних плагінах
  • у REST API
  • у CLI-скриптах

12. Висновок

PDO — це стандарт для сучасного PHP. Використання prepared statements, транзакцій та портованого SQL робить код безпечним, масштабованим і готовим до майбутніх змін.

Рекомендація: завжди використовуйте PDO у нових PHP-проєктах.