Выбор 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 Да Нет
Постоянные соединения Да Да
API поддерживает кодировки Да Да
API поддерживает подготовленные запросы на стороне сервера Да Да
API поддерживает подготовленные запросы на стороне клиента Нет Да
API поддерживает хранимые процедуры Да Да
API поддерживает множественные запросы Да Большинство
API поддерживает транзакции Да Да
Транзакции контролируются через SQL Да Да
Поддерживает функциональность MySQL 5.1+ Да Большинство