Si scopre che questo è un bug che va avanti da molto tempo... dal 2005!
Ecco la segnalazione di bug originale:dal 2005 al 2013 . Ed ecco la nuova segnalazione di bug:Dal 2013 ad oggi .
Esistono vari approcci per ottenere la risposta restituita, ne ho trovato uno e lo dimostro...
Il "trucco" è quello di ottenere l'output da una procedura "mysql". È un processo a "due fasi".
-
La prima parte consiste nell'eseguire la procedura con i tuoi input e anche dirgli in quali variabili MYSQL memorizzare il risultato.
-
Quindi, esegui una query separata per "selezionare" quelle variabili "mysql".
È descritto abbastanza chiaramente qui:php-calling-mysql-stored-procedures
Aggiornamento (gennaio 2017):
Ecco un esempio che mostra l'uso delle variabili per i parametri delle procedure Mysql 'IN', 'INOUT' e 'OUT'.
Prima di iniziare, ecco alcuni suggerimenti:
- Durante lo sviluppo:eseguire PDO in "modalità emula" poiché è più affidabile nel determinare gli errori nella chiamata della procedura.
- Collega le variabili PHP solo ai parametri 'IN' della procedura.
Otterrai alcuni errori di runtime davvero strani quando provi a associare variabili ai parametri INOUT e OUT.
Come al solito, tendo a fornire più commenti del necessario;-/
Ambiente di runtime (XAMPP):
- PHP:5.4.4
- Mysql:5.5.16
Codice sorgente:
Codice SQL:
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$$
Codice PHP:
Connessione DB:
$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);
Nota:l'output è lo stesso con EMULATE_PREPARES
=falso.
Imposta tutte le variabili PHP che verranno utilizzate:
$phpInParam = 5;
$phpInOutParam = 404; /* PHP InOut variable ==> read and should be changed */
$phpOutParam = null; /* PHP Out variable ==> should be changed */
Definire e preparare la chiamata alla procedura SQL:
$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);
Collega variabili PHP e imposta variabili SQL:
-
1) associare le variabili PHP
$stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);
-
2) Impostare le variabili INOUT dell'utente SQL
$db->exec("SET @varInOutParam =$phpInOutParam"); // Questo è sicuro in quanto imposta semplicemente il valore nella variabile MySql.
Esegui la procedura:
$allOk = $stmt->execute();
Inserisci le variabili SQL nelle variabili PHP:
$sql = "SELECT @varInOutParam AS phpInOutParam,
@varOutParam AS phpOutParam
FROM dual";
$results = current($db->query($sql)->fetchAll());
$phpInOutParam = $results['phpInOutParam'];
$phpOutParam = $results['phpOutParam'];
Nota:forse non è il modo migliore;-/
Visualizza le variabili PHP
"$phpInParam:" => "5"
"$phpInOutParam:" => "409"
"$phpOutParam:" => "-15"