Escolhendo uma API

O PHP oferece diferentes APIs para conexão ao MySQL. Pode-se ver abaixo as APIs fornecidas pelas extensões mysqli e PDO. Cada porção de código cria uma conexão a um servidor MySQL sendo executado em "example.com" usando o usuário "user" e a senha "password". E uma consulta é executada para cumprimentar o usuário.

Example #1 Comparando as APIs do MySQL

<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Olá, prezado usuário 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 'Olá, prezado usuário MySQL!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

Example #2 Comparando instruções preparadas

<?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']);

Comparação de características

O desempenho geral de ambas as extensões é considerada aproximadamente a mesma, embora o desempenho da extensão contribui somente para uma fração do tempo total de uma requisição web do PHP. Frequentemente, o impacto é tão baixo quanto 0,1%.

  ext/mysqli PDO_MySQL
Versão em que foi introduzida no PHP 5.0 5.1
Incluída no PHP 7.x e 8.x Sim Sim
Estado do desenvolvimento Ativo Ativo
Ciclo de vida Ativo Ativo
Recomendado para novos projetos Sim Sim
Interface POO Sim Sim
Interface Procedural Sim Não
API suporta consultas sem bloqueio assíncronas com mysqlnd Sim Não
Conexões persistentes Sim Sim
API suporta conjuntos de caracteres Sim Sim
API suporta Instruções Preparadas no lado do servidor Sim Sim
API suporta Instruções Preparadas no lado do cliente Não Sim
API suporta Procedimentos Armazenados Sim Sim
API suporta Múltiplas Instruções Sim A maioria
API suporta Transações Sim Sim
Transações podem ser controladas com SQL Sim Sim
Supporta toda a funcionalidade do MySQL 5.1+ Sim A maioria