Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL recupera la variabile da Stored Procedure in PHP PDO

Si scopre che questo è un bug che va avanti da molto tempo... dal 2005!

Ecco la segnalazione di bug originale:dal 2005 al 2013 . Ed ecco la nuova segnalazione di bug:Dal 2013 ad oggi .

Esistono vari approcci per ottenere la risposta restituita, ne ho trovato uno e lo dimostro...

Il "trucco" è quello di ottenere l'output da una procedura "mysql". È un processo a "due fasi".

  • La prima parte consiste nell'eseguire la procedura con i tuoi input e anche dirgli in quali variabili MYSQL memorizzare il risultato.

  • Quindi, esegui una query separata per "selezionare" quelle variabili "mysql".

È descritto abbastanza chiaramente qui:php-calling-mysql-stored-procedures

Aggiornamento (gennaio 2017):

Ecco un esempio che mostra l'uso delle variabili per i parametri delle procedure Mysql 'IN', 'INOUT' e 'OUT'.

Prima di iniziare, ecco alcuni suggerimenti:

  • Durante lo sviluppo:eseguire PDO in "modalità emula" poiché è più affidabile nel determinare gli errori nella chiamata della procedura.
  • Collega le variabili PHP solo ai parametri 'IN' della procedura.

Otterrai alcuni errori di runtime davvero strani quando provi a associare variabili ai parametri INOUT e OUT.

Come al solito, tendo a fornire più commenti del necessario;-/

Ambiente di runtime (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Codice sorgente:

Codice SQL:

CREATE PROCEDURE `demoSpInOutSqlVars`(IN     pInput_Param  INT, /* PHP Variable will bind to this*/   
                                      /* --- */  
                                      INOUT  pInOut_Param  INT, /* contains name of the SQL User variable that will be read and set by mysql */
                                      OUT    pOut_Param    INT) /* contains name of the SQL User variable that will be set by mysql */
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); /* always positive sum  */
     SET pOut_Param        := ABS(pInput_Param) * -3;                /* always negative * 3  */ 
END$$

Codice PHP:

Connessione DB:

$db = appDIC('getDbConnection', 'default'); // get the default db connection
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);    
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Nota:l'output è lo stesso con EMULATE_PREPARES =falso.

Imposta tutte le variabili PHP che verranno utilizzate:

$phpInParam     = 5;                  
$phpInOutParam  = 404;          /* PHP InOut variable  ==> read and should be changed  */
$phpOutParam    = null;         /* PHP Out   variable  ==> should be changed           */

Definire e preparare la chiamata alla procedura SQL:

$sql = "call demoSpInOut(:phpInParam, 
                         @varInOutParam, /* mysql variable name will be read and updated */
                         @varOutParam)"; /* mysql variable name that will be written to  */

$stmt = $db->prepare($sql);

Collega variabili PHP e imposta variabili SQL:

  • 1) associare le variabili PHP

    $stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);

  • 2) Impostare le variabili INOUT dell'utente SQL

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Questo è sicuro in quanto imposta semplicemente il valore nella variabile MySql.

Esegui la procedura:

$allOk = $stmt->execute();

Inserisci le variabili SQL nelle variabili PHP:

$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam   = $results['phpOutParam'];

Nota:forse non è il modo migliore;-/

Visualizza le variabili PHP

"$phpInParam:"     => "5"
"$phpInOutParam:"  => "409"
"$phpOutParam:"    => "-15"