Выбор API

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+ Да Большинство