W3docs

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é par mysqli_connect / mysqli_real_connect.
  • Valeur de retour — un objet mysqli_stmt en cas de succès, ou false en 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_init retourne false en cas d'échec, il faut donc toujours vérifier avec if ($stmt === false) avant d'appeler mysqli_stmt_prepare.
  • Confondre init et prepare. Un objet retourné par mysqli_stmt_init est vide — appeler mysqli_stmt_execute dessus avant mysqli_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_result n'est pas disponible. mysqli_stmt_get_result nécessite le pilote mysqlnd. S'il est absent, liez les colonnes de sortie avec mysqli_stmt_bind_result et parcourez les résultats avec mysqli_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.

Entraînement

Pratique
Que fait mysqli_stmt_init() en PHP ?
Que fait mysqli_stmt_init() en PHP ?
Was this page helpful?