Guide complet sur la fonction mysqli_stmt_init en PHP
Découvrez comment utiliser mysqli_stmt_init en PHP pour créer un objet mysqli_stmt vide et préparer des requêtes SQL sécurisées.
Lorsque vous travaillez avec des bases de données MySQL en PHP, l'extension mysqli fournit des fonctions pour diverses opérations de base de données. L'une d'elles est mysqli_stmt_init, qui alloue et retourne un objet de requête vide que vous transformerez ensuite en requête préparée avec mysqli_stmt_prepare.
Ce guide explique ce que fait mysqli_stmt_init, quand vous en avez réellement besoin et comment elle s'intègre dans le cycle de vie complet des requêtes préparées dans vos projets PHP.
Qu'est-ce que la fonction mysqli_stmt_init ?
mysqli_stmt_init est une fonction PHP intégrée qui crée un objet mysqli_stmt vide lié à une connexion de base de données ouverte. Elle n'analyse ni ne prépare aucun SQL par elle-même — c'est le rôle de mysqli_stmt_prepare. Considérez-la comme « donnez-moi un handle de requête vierge que je pourrai préparer ensuite. »
Syntaxe
mysqli_stmt_init(mysqli $connection): mysqli_stmt|false$connection— l'identifiant de lien retourné parmysqli_connect/mysqli_real_connect.- Valeur de retour — un objet
mysqli_stmten cas de succès, oufalseen cas d'échec (par exemple, si la connexion est invalide).
Style procédural vs. orienté objet
En PHP moderne, vous appelez rarement mysqli_stmt_init directement. La méthode orientée objet $mysqli->stmt_init() est équivalente, et $mysqli->prepare("...") effectue les étapes d'initialisation et de préparation en un seul appel :
// These two snippets produce the same prepared statement.
// Procedural, init then prepare:
$stmt = mysqli_stmt_init($connection);
mysqli_stmt_prepare($stmt, "SELECT id FROM users WHERE name = ?");
// Object-oriented shortcut (init + prepare in one call):
$stmt = $connection->prepare("SELECT id FROM users WHERE name = ?");Quand l'utiliser ?
La plupart du code peut se passer de mysqli_stmt_init et appeler directement mysqli_prepare (ou $mysqli->prepare()), qui retourne un objet de requête prêt à l'emploi. Vous avez recours à mysqli_stmt_init lorsque vous souhaitez un handle explicite avant la préparation — par exemple, pour définir des attributs de requête avec mysqli_stmt_attr_set (comme le type de curseur) avant que le SQL soit préparé, ou simplement pour rendre les étapes d'initialisation et de préparation plus lisibles.
Comment utiliser la fonction mysqli_stmt_init
Voici les étapes pour utiliser la fonction mysqli_stmt_init dans vos projets PHP :
1. Connexion au serveur MySQL
Avant de pouvoir utiliser la fonction mysqli_stmt_init, vous devez établir une connexion au serveur MySQL avec mysqli_connect. Voici un exemple de code :
<?php
$host = 'localhost';
$user = 'username';
$password = 'password';
$database = 'mydatabase';
$connection = mysqli_connect($host, $user, $password, $database);
if (!$connection) {
die('Connection failed: ' . mysqli_connect_error());
}2. Initialisation d'un objet de requête
Une fois la connexion au serveur MySQL établie, vous pouvez utiliser la fonction mysqli_stmt_init pour initialiser un objet de requête. Voici un exemple :
$stmt = mysqli_stmt_init($connection);
if ($stmt === false) {
die('Statement initialization failed: ' . mysqli_error($connection));
}Ce code initialise un objet de requête à l'aide de la fonction mysqli_stmt_init et inclut une gestion d'erreurs de base.
3. Cycle de vie complet d'une requête préparée
Pour tirer pleinement parti de l'objet initialisé, vous devez suivre le cycle de vie complet : préparer la requête, lier les paramètres, exécuter, récupérer les résultats et fermer la requête. Voici un exemple complet :
// Prepare the SQL statement
if (!mysqli_stmt_prepare($stmt, "SELECT id, name, email FROM users WHERE name = ?")) {
die('Prepare failed: ' . mysqli_stmt_error($stmt));
}
// Bind parameters
$name = "John Doe";
if (!mysqli_stmt_bind_param($stmt, "s", $name)) {
die('Bind failed: ' . mysqli_stmt_error($stmt));
}
// Execute the statement
if (!mysqli_stmt_execute($stmt)) {
die('Execute failed: ' . mysqli_stmt_error($stmt));
}
// Fetch results
// Note: mysqli_stmt_get_result requires the MySQL native driver (mysqlnd)
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
print_r($row);
}
// Close the statement and connection
mysqli_stmt_close($stmt);
mysqli_close($connection);Pour en savoir plus sur la récupération de lignes, consultez mysqli_fetch_assoc, et pour une vue d'ensemble des requêtes préparées, lisez PHP MySQL Prepared Statements.
Erreurs courantes
- Oublier de vérifier la valeur de retour.
mysqli_stmt_initretournefalseen cas d'échec, il faut donc toujours vérifier avecif ($stmt === false)avant d'appelermysqli_stmt_prepare. - Confondre init et prepare. Un objet retourné par
mysqli_stmt_initest vide — appelermysqli_stmt_executedessus avantmysqli_stmt_prepareéchouera. - Fuite de ressources. Fermez chaque requête avec
mysqli_stmt_close($stmt)lorsque vous avez terminé ; réutiliser une connexion pour de nombreuses requêtes sans les fermer gaspille les ressources du serveur. get_resultn'est pas disponible.mysqli_stmt_get_resultnécessite le pilotemysqlnd. S'il est absent, liez les colonnes de sortie avecmysqli_stmt_bind_resultet parcourez les résultats avecmysqli_stmt_fetch.
Conclusion
La fonction mysqli_stmt_init est une étape fondamentale pour travailler avec des requêtes préparées dans des bases de données MySQL en PHP. Elle alloue un objet mysqli_stmt vide qui doit être passé à mysqli_stmt_prepare avant toute exécution SQL. Fermez toujours la requête avec mysqli_stmt_close($stmt) une fois terminé pour éviter les fuites de ressources.
Remarque : utilisez des requêtes préparées pour toute requête contenant des valeurs fournies par l'utilisateur afin de prévenir les injections SQL — elles maintiennent strictement séparées les données et la syntaxe SQL. Pour des requêtes simples et statiques sans variables, mysqli_query est suffisant et moins verbeux.