Acontece que este é um bug que vem acontecendo há muito tempo... desde 2005!
Aqui está o relatório de bug original:2005 até 2013 . E aqui está o novo relatório de bug:De 2013 até o presente .
Existem várias abordagens para obter a resposta retornada, encontrei uma delas e demonstro ...
O 'truque' é obter a saída de um procedimento 'mysql'. É um processo de 'duas etapas'.
-
A primeira parte é executar o procedimento com suas entradas e também informar em quais variáveis MYSQL armazenar o resultado.
-
Então, você executa uma consulta separada para 'selecionar' essas variáveis 'mysql'.
Está descrito claramente aqui:php-calling-mysql-stored-procedures
Atualização (janeiro de 2017):
Aqui está um exemplo mostrando o uso de variáveis para parâmetros de procedimento Mysql 'IN', 'INOUT' e 'OUT'.
Antes de começarmos aqui estão algumas dicas:
- Ao desenvolver:execute o PDO no 'modo de emulação', pois é mais confiável na determinação de erros na chamada do procedimento.
- Ligue apenas variáveis PHP aos parâmetros 'IN' do procedimento.
Você obterá alguns erros de tempo de execução realmente estranhos ao tentar vincular variáveis aos parâmetros INOUT e OUT.
Como sempre, costumo fornecer mais comentários do que o necessário;-/
Ambiente de execução (XAMPP):
- PHP:5.4.4
- Mysql:5.5.16
Código-fonte:
Código 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$$
Código PHP:
Conexão de banco de dados:
$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:A saída é a mesma com
EMULATE_PREPARES
=falso. Defina todas as variáveis PHP que serão usadas:
$phpInParam = 5;
$phpInOutParam = 404; /* PHP InOut variable ==> read and should be changed */
$phpOutParam = null; /* PHP Out variable ==> should be changed */
Definir e preparar a chamada do procedimento 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);
Vincule variáveis PHP e defina variáveis SQL:
-
1) ligar as variáveis PHP
$stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);
-
2) Defina as variáveis INOUT do usuário SQL
$db->exec("SET @varInOutParam =$phpInOutParam"); // Isso é seguro, pois apenas define o valor na variável MySql.
Execute o procedimento:
$allOk = $stmt->execute();
Coloque as variáveis SQL nas variáveis PHP:
$sql = "SELECT @varInOutParam AS phpInOutParam,
@varOutParam AS phpOutParam
FROM dual";
$results = current($db->query($sql)->fetchAll());
$phpInOutParam = $results['phpInOutParam'];
$phpOutParam = $results['phpOutParam'];
Obs:talvez não seja a melhor maneira;-/
Exibir as variáveis PHP
"$phpInParam:" => "5"
"$phpInOutParam:" => "409"
"$phpOutParam:" => "-15"