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

MySQL hente variabel fra Stored Procedure i PHP PDO

Det viser sig, at dette er en fejl, der har stået på i lang tid... siden 2005!

Her er den originale fejlrapport:2005 til og med 2013 . Og her er den nye fejlrapport:Fra 2013 til i dag .

Der er forskellige tilgange til at få svaret returneret, jeg fandt en af ​​dem og demonstrerer den...

'Tricket' er at få output fra en 'mysql'-procedure. Det er en 'to-trins' proces.

  • Den første del er at køre proceduren med dine input, og også fortælle den, hvilke MYSQL-variabler resultatet skal lagres i.

  • Derefter kører du en separat forespørgsel for at 'vælge' disse 'mysql'-variabler.

Det er beskrevet ganske tydeligt her:php-calling-mysql-stored-procedures

Opdatering (januar 2017):

Her er et eksempel, der viser brugen af ​​variabler for 'IN', 'INOUT' og 'OUT' Mysql procedureparametre.

Før vi starter her er nogle tips:

  • Ved udvikling:Kør PDO i "emuleringstilstand", da det er mere pålideligt til at fastslå fejl i procedurekaldet.
  • Bind kun PHP-variabler til procedurens 'IN'-parametre.

Du vil få nogle virkelig mærkelige runtime-fejl, når du prøver at binde variabler til INOUT- og OUT-parametre.

Som sædvanlig er jeg tilbøjelig til at komme med noget flere kommentarer end nødvendigt;-/

Runtime Environment (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Kildekode:

SQL-kode:

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$$

PHP-kode:

DB-forbindelse:

$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);

Bemærk:Outputtet er det samme med EMULATE_PREPARES =falsk.

Indstil alle PHP-variabler, der skal bruges:

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

Definer og klargør SQL-procedurekaldet:

$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);

Bind PHP-variabler og sæt SQL-variabler:

  • 1) bind PHP-variablerne

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

  • 2) Indstil SQL User INOUT-variablerne

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Dette er sikkert, da det bare sætter værdien ind i MySql-variablen.

Udfør proceduren:

$allOk = $stmt->execute();

Få SQL-variablerne ind i PHP-variablerne:

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

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

Bemærk:måske ikke den bedste måde;-/

Vis PHP-variablerne

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


  1. hvad sker der i adoptionsfasen forberede

  2. MySQL-forespørgselsstreng indeholder

  3. Hvordan ændres CHARACTER SET (og COLLATION) i hele en database?

  4. Oracle, PDO_OCI vs OCI8