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"