PHP va-t-il bientôt arrêter de supporter MySQL ? C’est exac­te­ment cette question qui a quelque peu ébranlé la com­mu­nauté PHP, avec la parution d’un message d’erreur, au moment où on tentait de se connecter à un serveur en utilisant l’ancienne extension mysql, ac­com­pagné d’une in­vi­ta­tion à basculer vers ext/mysqli. Cette no­ti­fi­ca­tion d’ob­so­les­cence a été éditée depuis le PHP 5.5. Pourtant, l’extension mysqli avait fait sa première ap­pa­ri­tion avec PHP 5.0. Pour rappel : c’était en 2004.

Mais d’où venait donc cet af­fo­le­ment ? L’équipe PHP de Oracle a constaté que les uti­li­sa­teurs de ext/mysql, dont des poids lourds comme WordPress, étaient encore nombreux. C’est ce qui a poussé Oracle à en­tre­prendre un processus d’ob­so­les­cence lent et pro­gres­sif. Mais comme toute chose a une fin, l’extension mysql a été arrêtée au moment de l’in­tro­duc­tion du PHP 7. Cet article vous présente de manière détaillée le suc­ces­seur MySQLi, au moyen de quelques exemples. Nous ana­ly­se­rons aussi ce qui dif­fé­ren­cie ces deux ex­ten­sions.

IONOS Cloud Object Storage
Stockage de données sûr et éco­no­mique

Augmentez votre ren­ta­bi­lité grâce à un stockage évolutif, qui s'intègre à vos scénarios d'ap­pli­ca­tion. Vos données sont protégées par nos serveurs d'une grande fiabilité et un contrôle des accès per­son­na­lisé.

Qu’est-ce que MySQLi ?

MySQLi (la lettre « i » vient de « improved » en anglais, qui signifie amélioré) est une extension du langage de pro­gram­ma­tion PHP, per­met­tant d’accéder aux bases de données MySQL. MySQL fait partie, avec Oracle et Microsoft SQL Server, des systèmes de gestion de base de données re­la­tion­nelles (SGBD) les plus répandues dans le monde. Les bases de données re­la­tion­nelles re­pré­sen­tent un élément central de l’Internet, car elles per­met­tent le trai­te­ment et l’en­re­gis­tre­ment de gros volumes de données. De gros ensembles de données sont dissociés en volumes plus res­treints avant d’être reliés les uns aux autres, si né­ces­saire.

Le logiciel conçu en 1994 par la société suédoise MySQL AB est distribué à ce jour par Oracle Cor­po­ra­tion au moyen d’un système de licence double. En plus de sa version pro­prié­taire En­ter­prise, Oracle propose une version libre, open source. Cette double forme de licence donne aux en­tre­prises la pos­si­bi­lité de dé­ve­lop­per leurs propres ap­pli­ca­tions sur la base de MySQL, sans avoir à se soumettre à la licence Open Source.

Que renferme l’extension mysqli ?

En PHP, il existe trois manières dif­fé­rentes d’accéder à une base de données MySQL. La plus ancienne repose sur l’extension MySQL, qui a cependant été rendue obsolète depuis l’arrivée de PHP 5.5 et qui a été supprimée depuis le PHP 7. En PHP 7 la fonction mysql() n’est plus uti­li­sable, et a été remplacée par mysqli().

Pour pouvoir accéder à la base de données MYSQL, le PHP disposait, en plus de l’ancienne extension mysql, du PHP Data Objects (PDO), par­ti­cu­liè­re­ment flexible dans son uti­li­sa­tion. La troisième variante utilise MySQL Improved Extension. Depuis la version PHP 5, l’extension mysqli permet d’accéder aux bases de données MySQL. Le fragment de code ci-dessous vous donne une idée de ce qu’est MySQLi.

Fragment de code : envoyer une requête SQL à la base de données

Pour envoyer une requête à la base de données, on utilise la méthode query($sql) :

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
    die("connexion a échoué: " . $mysqli->connect_error);
}
 
$sql = "UPDATE tabelle SET colonne = 'Valeur' WHERE id = 1";
$mysqli->query($sql);
?>

Quels sont les avantages de MySQLi ?

À la dif­fé­rence de son pré­dé­ces­seur, l’extension mysqli peut être utilisée non seulement de façon pro­cé­du­rale, mais aussi avec une orien­ta­tion objet. L’un des avantages de la pro­gram­ma­tion orientée objet est qu’il est plus facile de gérer et de modifier le code. De nouvelles classes sont par exemple proposées, et elles héritent des pro­prié­tés et com­por­te­ments des classes exis­tantes. Cela réduit sen­si­ble­ment le temps de pro­gram­ma­tion et facilite l’adap­ta­tion du programme aux nouvelles exigences, et à un en­vi­ron­ne­ment en constante mutation.

Autre avantage très important de MySQLi : les Prepared Sta­te­ments. Une Prepared Statement est une requête préparée, destinée à être utilisée dans une base de données. À la dif­fé­rence d’un statement ordinaire, elle ne contient aucune valeur-paramètre, mais des marqueurs. Si un Statement avec dif­fé­rents pa­ra­mètres doit être exécuté plusieurs fois (dans une boucle par exemple) sur une base de données, il est in­té­res­sant d’utiliser des Prepared Sta­te­ments qui amé­lio­re­ront la vitesse de trai­te­ment. En effet, le Statement a déjà été pré-in­ter­prété dans la base de données, et doit sim­ple­ment être exécuté avec les nouveaux pa­ra­mètres. Les Prepared Sta­te­ments ont aussi l’avantage de vous prévenir des in­jec­tions SQL, étant donné que la base de données vérifie la validité des pa­ra­mètres, avant d’exécuter la requête.

Fragment de code : les requêtes préparées dans MySQLi

Voici à quoi ressemble un exemple de requêtes préparées dans MySQLi :

<?php
$mysqli = new mysqli("localhost", "user", "Password", "database");
if ($mysqli->connect_errno) {
    die("connexion a échoué: " . $mysqli->connect_error);
}
$sql = "UPDATE user SET email = ?, motdepasse = ? WHERE id = ?";
$statement = $mysqli->prepare($sql);
$statement->bind_param('ssi', $email, $passwort, $id);
//Assigner des valeurs variables
$id= 1;
$email = "un@exemple.fr";
$passwort = "nouveau mot de passe";
$statement->execute();
?>

En utilisant bind_param(), vous associez les pa­ra­mètres de la requête SQL aux variables. Le premier argument de bind_param() dans l’exemple ci-dessous, avec la valeur ssi, décrit les types des pa­ra­mètres. ssi indique quant à lui qu’il y a trois pa­ra­mètres dans la requête, le premier est de type string, le deuxième de type string et le troisième de type integer. Pour les nombres à virgule flottante, il existe encore la valeur d.

Une fois les variables associées aux pa­ra­mètres, on leur assigne la valeur cor­res­pon­dante, et la requête préparée est envoyée à la base de données au moyen de $statement->execute(). Comparé à PDO, c’est beaucoup plus compliqué.

Managed Nextcloud de IONOS Cloud
Tra­vail­lez en équipe dans votre propre Cloud
  • Sécurité des données
  • Outils de col­la­bo­ra­tion intégrés
  • Hé­ber­ge­ment dans des data centers européens

mysqli() vs. mysql() : pourquoi cette fonction PHP a-t-elle été modifiée ?

Le passage à MySQLi était iné­vi­table, car l’ancienne extension mysql était tout sim­ple­ment obsolète. Le code devenait de plus en plus difficile à en­tre­te­nir, car il fallait toujours assurer sa com­pa­ti­bi­lité avec les versions pré­cé­dentes. Le code datant de l’époque de PHP et de MySQL, son dé­ve­lop­pe­ment n’a pas été mené de façon très optimale.

Par exemple, puisque aucune ressource de connexion n’avait été définie de manière explicite, toutes les fonctions es­sayaient d’utiliser la dernière connexion établie. Il pouvait même arriver qu’on puisse accéder à une toute autre base de données avec mysql_query(). L’iden­ti­fiant de connexion était fa­cul­ta­tif dans l’ancienne fonction. Dans la nouvelle extension, il est obli­ga­toire. Il a aussi été ajouté des Prepared Sta­te­ments (requêtes préparées) qui fa­ci­li­tent et sé­cu­ri­sent la lecture des données dans les tables des bases de données.

Sur le plan pratique, de nom­breuses fonctions peuvent être modifiées en ajoutant un -i à la fonction mysql(). Il existe cependant quelques dif­fé­rences entre les deux ex­ten­sions.

Fragment de code : iden­ti­fiant de connexion dans MySQL et MySQLi

Certaines fonctions mysqli() re­quiè­rent un iden­ti­fiant de connexion, une variable PHP, créée lors de la connexion à la base de données. Dans cet exemple, il s’agit de : $link.

<?php
// mysql() Établir une connexion :
mysql_connect("localhost", "root", "", "test");
// mysqli() Établir une connexion :
$link = mysqli_connect("localhost", "root", "", "test");
?>

Fragment de code : lire les données dans une table de base de données

La fonction mysqli_query() requiert un iden­ti­fiant de connexion, ce qui n’est pas le cas de la fonction mysqli_fetch_array().

<?php
$link = mysqli_connect("localhost", "root", "", "test");
// Lire des jeux de données :
 $dataRecord = mysqli_query($link,
 "SELECT `name`, 'text', 'datum' FROM 'messages'");
// Valider des jeux de données :
while (list($name, $text, $datum) = mysqli_fetch_array($dataRecord)) {
 echo "<p>$name - $titel - $text - $datum</p>";
}
?>

Au-delà des fonctions que nous avons déjà citées, les fonctions suivantes re­quiè­rent également un iden­ti­fiant de connexion :

En con­clu­sion: MySQLi est plus rapide et plus sûr

La tran­si­tion vers MySQLi était in­dis­pen­sable pour rendre plus rapide l’accès aux bases de données. Dans la nouvelle extension, il a été ajouté des Prepared Sta­te­ments qui aug­men­tent la sécurité de la connexion, car elles protègent des in­jec­tions SQL. Le système de base de données vérifie la validité des pa­ra­mètres avant de traiter la requête. Ce nouveau code présente par ailleurs l’avantage d’être un code orienté objet, plus facile à en­tre­te­nir.

Aller au menu principal