Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL ruft Variable aus gespeicherter Prozedur in PHP PDO ab

Es stellt sich heraus, dass dies ein Fehler ist, der schon lange besteht... seit 2005!

Hier ist der ursprüngliche Fehlerbericht:2005 bis 2013 . Und hier ist der neue Fehlerbericht:Von 2013 bis heute .

Es gibt verschiedene Ansätze, um die Antwort zurückzubekommen, ich habe einen davon gefunden und demonstriere ihn ...

Der „Trick“ besteht darin, die Ausgabe einer „mysql“-Prozedur zu erhalten. Es ist ein „zweistufiger“ Prozess.

  • Der erste Teil besteht darin, die Prozedur mit Ihren Eingaben auszuführen und ihr auch mitzuteilen, in welchen MYSQL-Variablen das Ergebnis gespeichert werden soll.

  • Dann führen Sie eine separate Abfrage aus, um diese 'mysql'-Variablen 'auszuwählen'.

Es ist hier ganz klar beschrieben:php-calling-mysql-stored-procedures

Aktualisierung (Januar 2017):

Hier ist ein Beispiel, das die Verwendung von Variablen für 'IN'-, 'INOUT'- und 'OUT'-Mysql-Prozedurparameter zeigt.

Bevor wir beginnen, hier einige Tipps:

  • Beim Entwickeln:Führen Sie PDO im 'emulierten Modus' aus, da dies zuverlässiger bei der Bestimmung von Fehlern im Prozeduraufruf ist.
  • Binden Sie nur PHP-Variablen an die 'IN'-Parameter der Prozedur.

Sie erhalten einige wirklich seltsame Laufzeitfehler, wenn Sie versuchen, Variablen an INOUT- und OUT-Parameter zu binden.

Wie üblich neige ich dazu, eher mehr Kommentare abzugeben, als erforderlich sind;-/

Laufzeitumgebung (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Quellcode:

SQL-Code:

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

DB-Verbindung:

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

Hinweis:Die Ausgabe ist die gleiche wie bei EMULATE_PREPARES =falsch.

Stellen Sie alle PHP-Variablen ein, die verwendet werden:

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

Definieren und bereiten Sie den SQL-Prozeduraufruf vor:

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

PHP-Variablen binden und SQL-Variablen setzen:

  • 1) Binden Sie die PHP-Variablen

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

  • 2) Setzen Sie die INOUT-Variablen des SQL-Benutzers

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Dies ist sicher, da es nur den Wert in die MySql-Variable setzt.

Führen Sie den Vorgang aus:

$allOk = $stmt->execute();

Holen Sie die SQL-Variablen in die PHP-Variablen:

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

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

Hinweis:vielleicht nicht der beste Weg;-/

Anzeigen der PHP-Variablen

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