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"