MySQLi и PDO — это два основных API для работы с базами данных в PHP. Вот их ключевые различия и особенности.
Характеристика | MySQLi | PDO |
---|---|---|
Поддержка СУБД | Только MySQL | 12+ драйверов (MySQL, PostgreSQL, SQLite и др.) |
Стиль программирования | Процедурный и объектно-ориентированный | Только объектно-ориентированный |
Подготовленные выражения | Есть (менее гибкие) | Более мощная реализация |
Именованные параметры | Нет | Да |
Транзакции | Есть | Есть (более универсальные) |
Возврат ошибок | Разные методы для разных типов ошибок | Единый интерфейс через исключения |
MySQLi:
// Объектно-ориентированный стиль
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
// Процедурный стиль
$link = mysqli_connect('localhost', 'user', 'password', 'database');
PDO:
try {
$pdo = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
MySQLi:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
Кроссплатформенность:
Именованные параметры:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND status = :status");
$stmt->execute([
'email' => $email,
'status' => 'active'
]);
Гибкость получения данных:
$stmt->fetch(PDO::FETCH_ASSOC); // как ассоциативный массив
$stmt->fetch(PDO::FETCH_OBJ); // как объект
$stmt->fetchAll(PDO::FETCH_GROUP); // с группировкой
Обработка ошибок через исключения:
try {
$pdo->query("INVALID SQL");
} catch (PDOException $e) {
error_log($e->getMessage());
}
Специфичные для MySQL функции:
$mysqli->ping()
- проверить соединение$mysqli->thread_id
- получить ID потока$mysqli->get_charset()
- получить кодировкуПроцедурный стиль:
Быстродействие:
Выбирайте PDO когда:
Выбирайте MySQLi когда:
PDO предлагает более современный, гибкий и универсальный подход, в то время как MySQLi предоставляет более тесную интеграцию с MySQL. Для новых проектов рекомендуется PDO как более перспективное и универсальное решение. MySQLi может быть предпочтителен в legacy-проектах или когда нужны специфичные MySQL-возможности.