sql >> Databasteknik >  >> RDS >> Mysql

MySQL hämta variabel från lagrad procedur i PHP PDO

Det visar sig att detta är en bugg som har pågått länge... sedan 2005!

Här är den ursprungliga felrapporten:2005 till och med 2013 . Och här är den nya felrapporten:Från 2013 till idag .

Det finns olika tillvägagångssätt för att få svaret tillbaka, jag hittade ett av dem och demonstrerade det...

'Knepet' är att få utdata från en 'mysql'-procedur. Det är en process i två steg.

  • Den första delen är att köra proceduren med dina indata, och även berätta vilka MYSQL-variabler som ska lagras resultatet i.

  • Sedan kör du en separat fråga för att "välja" dessa "mysql"-variabler.

Det beskrivs ganska tydligt här:php-calling-mysql-stored-procedures

Uppdatering (januari 2017):

Här är ett exempel som visar användningen av variabler för 'IN', 'INOUT' och 'OUT' Mysql-procedurparametrar.

Innan vi börjar här är några tips:

  • Vid utveckling:Kör PDO i "emuleringsläge" eftersom det är mer tillförlitligt när det gäller att fastställa fel i proceduranropet.
  • Bind endast PHP-variabler till procedurens "IN"-parametrar.

Du kommer att få några riktigt udda runtime-fel när du försöker binda variabler till INOUT- och OUT-parametrar.

Som vanligt brukar jag ge ganska fler kommentarer än vad som krävs;-/

Runtime Environment (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Källkod:

SQL-kod:

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-kod:

DB-anslutning:

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

Obs:Utdata är samma som EMULATE_PREPARES =falskt.

Ställ in alla PHP-variabler som kommer att användas:

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

Definiera och förbered SQL-proceduranropet:

$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 och ställ in SQL-variabler:

  • 1) bind PHP-variablerna

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

  • 2) Ställ in variablerna för SQL User INOUT

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Detta är säkert eftersom det bara ställer in värdet i MySql-variabeln.

Utför proceduren:

$allOk = $stmt->execute();

Hämta SQL-variablerna i PHP-variablerna:

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

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

Notera:kanske inte det bästa sättet;-/

Visa PHP-variablerna

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


  1. Hur lagrar man bilder i en varbinär(max) kolumn?

  2. Hitta avståndet mellan två punkter med hjälp av latitud och longitud i mysql

  3. Flera uppdateringar i MySQL

  4. SET NULL:Ange en sträng som ska returneras när ett nollvärde förekommer i SQLcl / SQL*Plus