MySQLi : une nouveauté dans le PHP

PHP va-t-il bientôt arrêter de supporter MySQL ? C’est exactement cette question qui a quelque peu ébranlé la communauté 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, accompagné d’une invitation à basculer vers ext/mysqli. Cette notification d’obsolescence a été éditée depuis le PHP 5.5. Pourtant, l’extension mysqli avait fait sa première apparition avec PHP 5.0. Pour rappel : c’était en 2004.

Mais d’où venait donc cet affolement ? L’équipe PHP de Oracle a constaté que les utilisateurs de ext/mysql, dont des poids lourds comme WordPress, étaient encore nombreux. C’est ce qui a poussé Oracle à entreprendre un processus d’obsolescence lent et progressif. Mais comme toute chose a une fin, l’extension mysql a été arrêtée au moment de l’introduction du PHP 7. Cet article vous présente de manière détaillée le successeur MySQLi, au moyen de quelques exemples. Nous analyserons aussi ce qui différencie ces deux extensions.

IONOS S3 Object Storage

Le IONOS S3 Object Storage est idéal pour les sauvegardes et pour l'archivage des données de l'entreprise. Vous pouvez stocker n'importe quel volume de données statiques à faible coût.

Évolutif
Économique
Pratique

Qu’est-ce que MySQLi ?

MySQLi (la lettre « i » vient de « improved » en anglais, qui signifie amélioré) est une extension du langage de programmation PHP, permettant 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 relationnelles (SGBD) les plus répandues dans le monde. Les bases de données relationnelles représentent un élément central de l’Internet, car elles permettent le traitement et l’enregistrement de gros volumes de données. De gros ensembles de données sont dissociés en volumes plus restreints avant d’être reliés les uns aux autres, si nécessaire.

Le logiciel conçu en 1994 par la société suédoise MySQL AB est distribué à ce jour par Oracle Corporation au moyen d’un système de licence double. En plus de sa version propriétaire Enterprise, Oracle propose une version libre, open source. Cette double forme de licence donne aux entreprises la possibilité de développer leurs propres applications 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 diffé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 utilisable, 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), particulièrement flexible dans son utilisation. 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 différence de son prédécesseur, l’extension mysqli peut être utilisée non seulement de façon procédurale, mais aussi avec une orientation objet. L’un des avantages de la programmation 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 propriétés et comportements des classes existantes. Cela réduit sensiblement le temps de programmation et facilite l’adaptation du programme aux nouvelles exigences, et à un environnement en constante mutation.

Autre avantage très important de MySQLi : les Prepared Statements. Une Prepared Statement est une requête préparée, destinée à être utilisée dans une base de données. À la différence d’un statement ordinaire, elle ne contient aucune valeur-paramètre, mais des marqueurs. Si un Statement avec différents paramètres doit être exécuté plusieurs fois (dans une boucle par exemple) sur une base de données, il est intéressant d’utiliser des Prepared Statements qui amélioreront la vitesse de traitement. En effet, le Statement a déjà été pré-interprété dans la base de données, et doit simplement être exécuté avec les nouveaux paramètres. Les Prepared Statements ont aussi l’avantage de vous prévenir des injections SQL, étant donné que la base de données vérifie la validité des paramè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 paramè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 paramètres. ssi indique quant à lui qu’il y a trois paramè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 paramètres, on leur assigne la valeur correspondante, 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é.

Hébergement Managed Nextcloud

Pour un travail d'équipe conforme à la RGPD.

Stocker, gérer, modifier des données. Idéal pour les petites entreprises, agences & freelances.

Respecte la RGPD
Assistance 24/7
Data center en UE

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

Le passage à MySQLi était inévitable, car l’ancienne extension mysql était tout simplement obsolète. Le code devenait de plus en plus difficile à entretenir, car il fallait toujours assurer sa compatibilité avec les versions précédentes. Le code datant de l’époque de PHP et de MySQL, son développement 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 essayaient 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’identifiant de connexion était facultatif dans l’ancienne fonction. Dans la nouvelle extension, il est obligatoire. Il a aussi été ajouté des Prepared Statements (requêtes préparées) qui facilitent et sécurisent la lecture des données dans les tables des bases de données.

Sur le plan pratique, de nombreuses fonctions peuvent être modifiées en ajoutant un -i à la fonction mysql(). Il existe cependant quelques différences entre les deux extensions.

Fragment de code : identifiant de connexion dans MySQL et MySQLi

Certaines fonctions mysqli() requièrent un identifiant 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 identifiant 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 requièrent également un identifiant de connexion :

En conclusion: MySQLi est plus rapide et plus sûr

La transition vers MySQLi était indispensable pour rendre plus rapide l’accès aux bases de données. Dans la nouvelle extension, il a été ajouté des Prepared Statements qui augmentent la sécurité de la connexion, car elles protègent des injections SQL. Le système de base de données vérifie la validité des paramètres avant de traiter la requête. Ce nouveau code présente par ailleurs l’avantage d’être un code orienté objet, plus facile à entretenir.