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-проєктах.
