PHP предоставляет различные API для доступа к MySQL. Ниже показаны API, предоставляемые модулями mysqli и PDO. В каждом примере кода создаётся соединение с сервером MySQL запущенном на сервере "example.com" с использованием логина "user" и пароля "password" и выполняется запрос к нему.
Пример #1 Сравнение MySQL API
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
?>
Пример #2 Сравнение подготовленных запросов
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$statement = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo htmlentities($row['District']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['District']);
Сравнение возможностей
Общая производительность обоих модулей примерно одинакова. Хотя производительность модуля составляет лишь часть общего времени выполнения веб-запроса PHP, обычно не более 0.1%.
ext/mysqli | PDO_MySQL | |
---|---|---|
Появилось в версии PHP | 5.0 | 5.1 |
Работает в PHP 7.x и 8.x | Да | Да |
Статус разработки | Активный | Активный |
Жизненный цикл | Активный | Активный |
Рекомендовано для новых проектов | Да | Да |
ООП интерфейс | Да | Да |
Процедурный интерфейс | Да | Нет |
API поддерживает асинхронные, неблокирующие запросы mysqlnd | Да | Нет |
Постоянные (persistent) соединения | Да | Да |
API поддерживает кодировки (charset) | Да | Да |
API поддерживает подготовленные запросы на стороне сервера | Да | Да |
API поддерживает подготовленные запросы на стороне клиента | Нет | Да |
API поддерживает хранимые процедуры | Да | Да |
API поддерживает множественные запросы | Да | Большинство |
API поддерживает транзакции | Да | Да |
Можно контролировать транзакции посредством SQL | Да | Да |
Поддерживает всю функциональность MySQL 5.1+ | Да | Большинство |