sql >> Base de Datos >  >> RDS >> Mysql

MySQL recupera la variable del procedimiento almacenado en PHP PDO

Resulta que este es un error que ha estado ocurriendo durante mucho tiempo... ¡desde 2005!

Aquí está el informe de error original:2005 hasta 2013 . Y aquí está el nuevo informe de errores:Desde 2013 hasta el presente .

Hay varios enfoques para obtener la respuesta, encontré uno de ellos y lo demuestro...

El 'truco' es obtener la salida de un procedimiento 'mysql'. Es un proceso de 'dos ​​etapas'.

  • La primera parte es ejecutar el procedimiento con sus entradas y también decirle en qué variables MYSQL almacenar el resultado.

  • Luego, ejecuta una consulta separada para 'seleccionar' esas variables 'mysql'.

Se describe claramente aquí:php-calling-mysql-stored-procedures

Actualización (enero de 2017):

Aquí hay un ejemplo que muestra el uso de variables para los parámetros de procedimiento Mysql 'IN', 'INOUT' y 'OUT'.

Antes de comenzar, aquí hay algunos consejos:

  • Al desarrollar:Ejecute PDO en 'modo de emulación' ya que es más confiable para determinar errores en la llamada al procedimiento.
  • Solo vincule variables de PHP a los parámetros 'IN' del procedimiento.

Obtendrá algunos errores de tiempo de ejecución realmente extraños cuando intente vincular variables a los parámetros INOUT y OUT.

Como de costumbre, tiendo a proporcionar más comentarios de los necesarios;-/

Entorno de tiempo de ejecución (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Código fuente:

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:

Conexión de base de datos:

$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:El resultado es el mismo con EMULATE_PREPARES =falso

Establezca todas las variables de PHP que se utilizarán:

$phpInParam     = 5;                  
$phpInOutParam  = 404;          /* PHP InOut variable  ==> read and should be changed  */
$phpOutParam    = null;         /* PHP Out   variable  ==> should be changed           */

Definir y preparar la llamada al procedimiento 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);

Vincular variables de PHP y establecer variables de SQL:

  • 1) enlazar las variables de PHP

    $stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);

  • 2) Establezca las variables INOUT del usuario SQL

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Esto es seguro ya que solo establece el valor en la variable MySql.

Ejecute el procedimiento:

$allOk = $stmt->execute();

Obtenga las variables SQL en las variables de PHP:

$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam   = $results['phpOutParam'];

Nota:tal vez no sea la mejor manera;-/

Mostrar las variables de PHP

"$phpInParam:"     => "5"
"$phpInOutParam:"  => "409"
"$phpOutParam:"    => "-15"