Position actuelle: Accueil> Derniers articles> Comment utiliser next_result () pour lire les paramètres de sortie des procédures stockées

Comment utiliser next_result () pour lire les paramètres de sortie des procédures stockées

gitbox 2025-05-02

L'appel des procédures stockées est une pratique courante lorsque vous utilisez PHP pour manipuler les bases de données MySQL, en particulier lorsque nous voulons encapsuler la logique métier complexe au niveau de la base de données. Cependant, de nombreux développeurs rencontrent souvent des situations où la valeur du paramètre de sortie ne peut pas être lue lors de l'appel des procédures stockées avec des paramètres de sortie ** (paramètres OUT).

L'un des points clés est l'utilisation de next_result () . Cet article expliquera en détail pourquoi cette fonction doit être appelée et comment lire correctement les paramètres de sortie des procédures stockées.

1. Qu'est-ce que Next_result () ?

Lorsque vous utilisez le pilote MySQLI pour appeler une procédure stockée qui renvoie plusieurs ensembles de résultats (tels que plusieurs sélections ou les deux paramètres de sélection et de sortie), MySQL renvoie les données sous la forme de "plusieurs ensembles de résultats". La méthode Next_Result () est utilisée pour faire en sorte que le pilote MySQLI prépare à lire le jeu de résultats suivant.

Si next_result () n'est pas explicitement appelé et que tous les ensembles de résultats sont traversés, certains résultats de la base de données (tels que les paramètres de sortie ou l'ensemble de résultats finaux) ne seront pas accessibles.

2. Exemples de processus stockés

Examinons d'abord une procédure stockée simple MySQL, qui a un paramètre d'entrée et un paramètre de sortie:

 DELIMITER $$

CREATE PROCEDURE get_user_email(IN user_id INT, OUT email VARCHAR(255))
BEGIN
    SELECT user_email INTO email FROM users WHERE id = user_id;
END $$

DELIMITER ;

Cette procédure stockée interroge sa boîte aux lettres en fonction de l'ID utilisateur et le renvoie via le paramètre OUT.

3. PHP appelle la procédure stockée

 <?php
$mysqli = new mysqli("localhost", "username", "password", "your_database");

// Vérifiez la connexion
if ($mysqli->connect_error) {
    die("Échec de la connexion: " . $mysqli->connect_error);
}

// 1. installation OUT Variables de paramètre
$mysqli->query("SET @email = ''");

// 2. Appelez les procédures stockées
$mysqli->query("CALL get_user_email(1, @email)");

// 3. Doit utiliser next_result() Effacer l&#39;ensemble de résultats
while ($mysqli->more_results()) {
    $mysqli->next_result();
    $result = $mysqli->store_result();
    if ($result) {
        $result->free();
    }
}

// 4. Obtenir OUT paramètre
$result = $mysqli->query("SELECT @email AS user_email");
$row = $result->fetch_assoc();

echo "L&#39;adresse e-mail de l&#39;utilisateur est: " . $row['user_email'];

$mysqli->close();
?>

4. Pourquoi next_result () est-il la clé?

Après avoir appelé l'instruction d'appel , MySQL peut en fait renvoyer un ou plusieurs ensembles de résultats implicites. Si next_result () n'est pas utilisé pour effacer ces ensembles de résultats, les requêtes suivantes (telles que select @email ) peuvent être bloquées ou n'étant pas exécutées.

Certains développeurs rencontreront le problème des "paramètres de sortie de lecture sont vides". En fait, ce n'est pas que la procédure stockée n'a pas été exécutée avec succès, mais que l'ensemble de résultats précédents n'a pas été effacé, ce qui a permis de ne pas être exécutée du tout.

5. Avancé: utilisez des déclarations de prétraitement

Si vous utilisez des instructions de prétraitement, vous pouvez également utiliser une logique similaire:

 $stmt = $mysqli->prepare("CALL get_user_email(?, @email)");
$stmt->bind_param("i", $userId);
$userId = 1;
$stmt->execute();

// Nettoyez tous les ensembles de résultats
do {
    if ($result = $stmt->get_result()) {
        $result->free();
    }
} while ($stmt->more_results() && $stmt->next_result());

// Obtenir输出paramètre
$result = $mysqli->query("SELECT @email AS user_email");
$row = $result->fetch_assoc();
echo "L&#39;adresse e-mail de l&#39;utilisateur est: " . $row['user_email'];

6. Résumé

Lorsque vous utilisez l'appel pour exécuter les procédures stockées, vous devez appeler Next_Result () pour itérer tous les ensembles de résultats potentiels , que les paramètres de sortie soient utilisés ou que plusieurs ensembles de résultats soient renvoyés .

Ce n'est pas seulement une bonne pratique, mais aussi une condition préalable pour vous assurer que vous pouvez lire correctement les paramètres de sortie. Garder cela à l'esprit peut vous aider à éviter de nombreux maux de tête de problèmes de "résultats non lus".

Pour plus de meilleures pratiques pour les appels de procédure stockés, vous pouvez visiter notre guide de développement: https://gitbox.net/docs/mysql/stored-procedures