2011-06-21 16 views
5

Acabo de empezar a utilizar PHP PDO con procedimientos almacenados MySQL y tengo un problema con la forma de obtener los parámetros OUT de la llamada al procedimiento. Miré muchos temas similares de stackoverflow, pero desafortunadamente no pude encontrar una manera de resolver mi problema: |PHP PDO no puede obtener el valor del parámetro OUT

aquí están los detalles:

El procedimiento tarda 1 parámetro de entrada y tiene 2 parámetros de salida obligatorios, y devuelve un resultado de estado en ellos.

Así es como yo lo llamo:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 

El procedimiento devuelve INT en el parámetro @o_code y la cadena en el parámetro @o_message. Si se llama desde la CLI, y después de la llamada que escribir en el CLI

select @o_code, @o_message; 

todo está bien, es que soy capaz de ver los valores devueltos en estos parámetros OUT. Sin embargo, no puedo hacerlo desde el código PHP, por alguna razón siempre obtengo resultados FALSOS. El procedimiento funciona correctamente, pero no puedo obtener sus resultados.

Me trataron los siguientes métodos para obtener los valores, justo después de hacer la llamada se ha descrito anteriormente:

$output = $proc->fetch(PDO::FETCH_ASSOC); // also with PDO:FETCH_OBJ 
$output = $mydb->query("select @o_code, @o_message"); 
$output = $mydb->query("select @o_code, @o_message")->fetch(); 
$output = $mydb->query("select @o_code, @o_message")->fetchColumn(); 
$output = $mydb->query("select @o_code, @o_message")->fetchAll(); 

pero ninguna de ellas devuelve ningún resultado distinto de NULL o FALSO. También probé con bindParam, pero aún así no pude hacerlo funcionar.

¡Gracias por cualquier ayuda en este tema y buen día!

----- ----- EDITAR

Aquí está el código que he intentado con bindParam, que todavía no funciona:

$input = 5; 
$proc = $mydb->prepare("CALL proc_name(?, ?, ?)"); 
$proc->bindParam(1, $input, PDO::PARAM_INT); 
$proc->bindParam(2, $code, PDO::PARAM_INT); 
$proc->bindParam(3, $message, PDO::PARAM_STR); 
$proc->execute(); 

var_dump($code, $message); // NULL, NULL 
+0

lo encontró: http://stackoverflow.com/a/32224294/2717254 –

+0

La pregunta que usted está señalando es un problema diferente y no resuelve el problema de la pregunta publicada aquí. Puede verificar la respuesta aceptada a continuación para ver si el problema fue el "closeCursor()" para que las cosas funcionen correctamente. Tu respuesta en la otra quesion tiene esa línea de código, así que supongo que tampoco funcionará. – middlehut

+1

¡La respuesta se trata de obtener el valor de param de salida! La llamada closeCursor() no está involucrada. Actualicé la respuesta para aclarar mejor por cierto –

Respuesta

5

El problema era que la primera consulta que está llamando al procedimiento almacenado no se considera terminado y cerrado, y PDO no ejecutará otra consulta hasta que se realice la consulta anterior.

La solución fue añadir $proc->closeCursor();

La muestra de trabajo conjunto es:

$input = 5; 
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass"); 
$proc = $mydb->prepare("CALL proc_name($input, @o_code, @o_message)"); 
$proc->execute(); 
$proc->closeCursor(); 

$output = $mydb->query("select @o_code, @o_message")->fetch(PDO::FETCH_ASSOC); 
var_dump($output); // array('@o_code'=>value, 'o_message'=>value) 
Cuestiones relacionadas