Maison > base de données > tutoriel mysql > Comment récupérer la sortie des procédures stockées MySQL à l'aide de PDO en PHP ?

Comment récupérer la sortie des procédures stockées MySQL à l'aide de PDO en PHP ?

DDD
Libérer: 2024-11-08 05:03:02
original
460 Les gens l'ont consulté

How to Retrieve Output from MySQL Stored Procedures Using PDO in PHP?

Récupération des variables de procédure stockée MySQL en PHP à l'aide de PDO

Problème :

Comment puis-je récupérer la valeur LAST_INSERT_ID() à partir d'une procédure stockée MySQL utilisant PHP et AOP ?

Procédure :

Considérez le code PHP suivant :

<?php
$stmt = $db->prepare("CALL simpleProcedure(:name,:returnid)");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':returnid', $returnid, PDO::PARAM_INT, 11);
$stmt->execute();
echo $returnid;
?>
Copier après la connexion

Bien que ce code puisse sembler correct, il ne fonctionne pas en raison de un bug de longue date dans PDO.

Solution :

Pour récupérer le résultat d'une procédure MySQL, suivez ces étapes :

Étape 1 : Exécuter la procédure

Exécutez la procédure avec vos entrées et spécifiez quelles variables MySQL stockeront les résultats. Par exemple :

<?php
$stmt = $db->prepare("CALL simpleProcedure(:name, @returnid)");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();
?>
Copier après la connexion

Étape 2 : interroger les variables MySQL

Exécutez une requête distincte pour sélectionner les variables MySQL :

<?php
$stmt = $db->query("SELECT @returnid");
$result = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
$returnid = $result[0];
?>
Copier après la connexion

Exemple :

Le code suivant inclut un exemple plus détaillé montrant l'utilisation de variables pour différents types de paramètres (IN, INOUT, OUT) :

Procédure SQL :

CREATE PROCEDURE `demoSpInOutSqlVars`(
    IN     pInput_Param  INT, 
    /* --- */  
    INOUT  pInOut_Param  INT, 
    OUT    pOut_Param    INT)
BEGIN
    /*
     * Pass the full names of SQL User Variable for these parameters. e.g. '@varInOutParam'
     * These 'SQL user variables names' are the variables that Mysql will use for:
     *    1) finding values
     *    2) storing results
     *
     * It is similar to 'variable variables' in PHP.  
     */
     SET pInOut_Param      := ABS(pInput_Param) + ABS(pInOut_Param); 
     SET pOut_Param        := ABS(pInput_Param) * -3;                
END$$
Copier après la connexion

Code PHP :

<?php
// Bind PHP variables
$phpInParam = 5;                  
$phpInOutParam = 404;
$phpOutParam = null;

// Prepare the SQL procedure call
$sql = "call demoSpInOut(:phpInParam, 
                         @varInOutParam, 
                         @varOutParam)";

$stmt = $db->prepare($sql);
$stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);

// Set the SQL User INOUT variables
$db->exec("SET @varInOutParam = $phpInOutParam");

// Execute the procedure
$stmt->execute();

// Get the SQL variables into PHP variables
$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";

$results = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$phpInOutParam = $results[0]['phpInOutParam'];
$phpOutParam = $results[0]['phpOutParam'];

// Display the PHP variables
echo "phpInParam: $phpInParam<br>";
echo "phpInOutParam: $phpInOutParam<br>";
echo "phpOutParam: $phpOutParam<br>";
?>
Copier après la connexion

En suivant ces étapes, vous pouvez récupérer efficacement le résultat des procédures stockées MySQL à l'aide de PDO.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal