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"