Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL recupera a variável do procedimento armazenado no PHP PDO


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"