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"