Choisir une API

PHP offre 3 APIs différentes pour se connecter à MySQL. Ci-dessous, vous trouverez les APIs fournies par les extensions mysql, mysqli et PDO. Chaque exemple de code crée une connexion à un serveur MySQL s'exécutant sur le domaine "", en utilisant le nom d'utilisateur "user", le mot de passe "password". Et une requête est exécutée pour saluer l'utilisateur.

Exemple #1 Comparaison des 3 APIs MySQL

// mysqli
$mysqli = new mysqli("""user""password""database");
$result $mysqli->query("SELECT 'Bonjour, cher utilisateur de MySQL !' AS _message FROM DUAL");
$row $result->fetch_assoc();

// PDO
$pdo = new PDO(';dbname=database''user''password');
$statement $pdo->query("SELECT 'Bonjour, cher utilisateur de MySQL !' AS _message FROM DUAL");
$row $statement->fetch(PDO::FETCH_ASSOC);

// mysql
$c mysql_connect("""user""password");
$result mysql_query("SELECT 'Bonjour, cher utilisateur de MySQL !' AS _message FROM DUAL");
$row mysql_fetch_assoc($result);

API recommandé

Il est recommandé d'utiliser soit l'extension mysqli, soit l'extension PDO_MySQL. Il n'est pas recommandé d'utiliser l'ancienne extension mysql pour de nouveaux développements sachant qu'elle est obsolète depuis PHP 5.5.0, et sera supprimée dans un futur proche. Une matrice de comparaison détaillant les fonctionnalités est fournie ci-dessous. La performance globale des 3 extensions peut être considérée comme identique. Malgré tout, la performance de l'extension constitue seulement une fraction du temps total d'exécution d'une requête web PHP. Aussi, l'impact est inférieur à 0.1%.

Comparaison des fonctionnalités

  ext/mysqli PDO_MySQL ext/mysql
Introduite en PHP version 5.0 5.1 2.0
Inclus avec PHP 5.x Oui Oui Oui
Statut du développement Active Active Uniquement de la maintenance
Cycle de vie Active Active Obsolète
Recommandé pour de nouveaux projets Oui Oui Non
Interface orientée objet Oui Oui Non
Interface procédurale Oui Non Oui
L'API supporte les requêtes non-bloquantes, asynchrones avec mysqlnd Oui Non Non
Connexions persistentes disponibles Oui Oui Oui
L'API supporte les jeux de caractères Oui Oui Oui
L'API supporte les requêtes préparées côté serveur Oui Oui Non
L'API supporte les requêtes préparées côté client Non Oui Non
L'API supporte les procédures stockées Oui Oui Non
L'API supporte les requêtes multiples Oui La plupart Non
L'API supporte les transactions Oui Oui Non
Les transactions peuvent être contrôlées avec SQL Oui Oui Oui
Supporte toutes les fonctionnalités de MySQL 5.1+ Oui La plupart Non
add a note add a note

User Contributed Notes 4 notes

azizsaleh at gmail dot com
1 year ago
mysql_* functions are deprecated and will be removed from future versions in PHP. If you have an existing codebase that you are moving to such PHP version and is having a hard time converting to PDO/MySQLI you can use a PDO wrapper for all mysql_* functions found on github:
alvaro at demogracia dot com
2 years ago
Apart from the feature list, I suggest you try out both MySQLi and PDO and find out what API design you like most. MySQLi is more powerful and probably more complex to learn. PDO is more elegant and has the advantage that you only need to learn one PHP API if you need to work with different DBMS in the future.
michaeln at associations plus dot see eh
2 years ago
Another useful consideration to keep in mind when choosing your library is how extensible it is. Chances are, in any sufficiently advanced development scenario, you're going to be extending your database access class to add a method (or multiple methods) for how to handle database errors and alert the development team of errors and whether to have the code fail immediately or fail gracefully serving the user a user-friendly failure notice.

For example, I have a class where I have added extra parameters to the query() function (and a few others), which accept the __FILE__ and __LINE__ constants to facilitate tracking issues. If this were not reasonably possible with PDO-mysql for example (not sure, never used it), it may make one option or the other much less likely to be viable for your usage case.
roland at mxchange dot org
1 year ago
To solve PDO limitations as described by michaeln at associations plus dot see eh, you may try to overwrite PDO methods:

class MyPdo extends PDO {
// What ever parameters PDO wants + prepend some own:
public function query($caller, $line, $foo, $bar, $bazz) {
// Do your stuff here with $caller, $line (e.g. logging for debug purposes)
// Then call the extended method
return parent::QUERY($foo, $bar, $bazz) or $this->myErrorHandler($caller, $line, $someSqlToLog);

This is only a very basic example. You may otherwise choose to "wrap" the PDO class and save an instance of the "underlaying" PDO class inside the wrapper class. This is maybe a little more complex approach but allows you to have on interfaces in class signature + way better flexibility.
To Top