Foros del Web » Programando para Internet » PHP »

No puedo llamar mas de un procedimiento almacenados en mysql desde php

Estas en el tema de No puedo llamar mas de un procedimiento almacenados en mysql desde php en el foro de PHP en Foros del Web. Hola Tengo el siguiente problema en php al tratar de llamar dos procedimientos almacenados en mysql, solo me ejecuta el procedimiento que tenga de primero, ...
  #1 (permalink)  
Antiguo 06/03/2013, 10:37
 
Fecha de Ingreso: marzo-2013
Ubicación: Colombia
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 1
No puedo llamar mas de un procedimiento almacenados en mysql desde php

Hola
Tengo el siguiente problema en php al tratar de llamar dos procedimientos almacenados en mysql, solo me ejecuta el procedimiento que tenga de primero, el procedimiento que tenga en segundo lugar genera error

Este es el codigo

$resultado = $mysqli->query("CALL prueba01()");
$fila = $resultado->fetch_assoc();
echo $fila['acciNomb']."<br>";
mysqli_free_result($resultado);

$resultado2 = $mysqli->query("CALL prueba02()");
$fila2 = $resultado2->fetch_assoc();
echo $fila2 ['actiActi'];


Este es el error generado

Fatal error: Call to a member function fetch_assoc() on a non-object in

Agradezco la ayuda que me puedan brindar
  #2 (permalink)  
Antiguo 06/03/2013, 10:47
Avatar de T4ke0veR  
Fecha de Ingreso: agosto-2007
Ubicación: Quito - Ecuador
Mensajes: 1.720
Antigüedad: 17 años, 3 meses
Puntos: 28
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

podrias contarme un poco que deseas hacer???...
muestra tambien tu consulta por favor...
__________________
Diseño gráfico, Web, imagen corporativa, publicidad ...
  #3 (permalink)  
Antiguo 06/03/2013, 12:53
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Cita:
Iniciado por alfhagamma Ver Mensaje
Hola
Tengo el siguiente problema en php al tratar de llamar dos procedimientos almacenados en mysql, solo me ejecuta el procedimiento que tenga de primero, el procedimiento que tenga en segundo lugar genera error

Este es el codigo

$resultado = $mysqli->query("CALL prueba01()");
$fila = $resultado->fetch_assoc();
echo $fila['acciNomb']."<br>";
mysqli_free_result($resultado);

$resultado2 = $mysqli->query("CALL prueba02()");
$fila2 = $resultado2->fetch_assoc();
echo $fila2 ['actiActi'];


Este es el error generado

Fatal error: Call to a member function fetch_assoc() on a non-object in

Agradezco la ayuda que me puedan brindar
Aparte de mirar como estas creando los procedimientos almacenados (importante para saber el error) me causa curiosidad que mezclas mysqli estructurado y orientado a objetos. Usa uno u otro nunca los dos.

Código PHP:
$resultado->close();//creo que tambien sirve $resultado->free();
// asi no lo debes cerrar mysqli_free_result($resultado); 
__________________
Blog de humor http://elcuasatar.net63.net/
  #4 (permalink)  
Antiguo 06/03/2013, 15:47
 
Fecha de Ingreso: marzo-2013
Ubicación: Colombia
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Ok mira en cada procedimiento almacenado para el ejemplo lo que trato de hacer es un consulta sencilla, en otras ocaciones puede ser un insert o un update pero para este prueba en es especial utilizo un "SELECT " en cada consulta

//Procedimiento almacenado 1
DELIMITER @@
DROP PROCEDURE prueba01 @@
CREATE PROCEDURE getcal.prueba01
()
BEGIN
SELECT * FROM acciones;
END @@
DELIMITER ;


//Procedimiento almacenado 2

DELIMITER @@
DROP PROCEDURE prueba02 @@
CREATE PROCEDURE getcal.prueba02
()
BEGIN
SELECT * FROM actividadesacciones;
END @@
DELIMITER ;

Ok en lo de "mysqli_free_result($resultado);" ya lo he cambiado por "$resultado->free();" pero igual me genera error

la consulta al primer procedimiento me arroja un resultado pero cuando realiza la consulta al segundo procedimiento es cuando me arroja el error

"Fatal error: Call to a member function fetch_assoc() on a non-object in"
  #5 (permalink)  
Antiguo 06/03/2013, 19:15
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Intenta mirar esto a ver que error te da:

Código PHP:
if (!$mysqli->query("CALL prueba02()")) 
{
    echo 
"Falló CALL: (" $mysqli->errno ") " $mysqli->error;

Pues en teoria estas haciendolo de manera correcta. Creo que alguna vez tuve el mismo error y no me equivocaba. Te tocaria hacer algo un poco "cutre" pero revisando mis scripts lo solucione asi. Despues de tu primer store procedure vuelve a crear la conexión que tienes de mysqli. Si quieres llamala con otro nombre pero podria llamarse igual, es cosa de que probaras.

Código PHP:
$conn2 mysql_connect($dbhost$dbusuario,$dbpassword,true,131072);//conectar store procedure 
Asi me enseñaron que se conecta un procedimiento almacenado.

No recuerdo la explicación que me dieron porque se debia repetir la conexión cuando se usan los store procedures pero a mi me funciono. Si alguien tiene una explicación mas elegante por favor que no la diga para que todos aprendamos y si existe alguna manera en la que se pueda obviar eso.

p.s. Realiza la conexión normal con mysqli, pegue el ejemplo con mysql_connect porque era el que tenia a la mano en mi script viejo pero tal y como te lo comente no es bueno mezclar mysql y mysqli y mysqli estructurado y mysqli por objetos.
__________________
Blog de humor http://elcuasatar.net63.net/

Última edición por cuasatar; 06/03/2013 a las 19:23
  #6 (permalink)  
Antiguo 08/03/2013, 10:25
 
Fecha de Ingreso: marzo-2013
Ubicación: Colombia
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Ok mira lo he resuelto provisionalmente de esta forma

$resultado = $mysqli->query("CALL prueba01()");
$fila = $resultado->fetch_assoc();
echo $fila['acciNomb']."<br>";
$resultado->free();

$mysqli2 = new mysqli($server,$usuario,$contra,$base); //Nueva conexión
$resultado2 = $mysqli2->query("CALL prueba02()");
if (!$mysqli2->query("CALL prueba02()")) {
echo "Falló CALL: (" . $mysqli2->errno . ") " . $mysqli2->error;
}
$fila2 = $resultado2->fetch_assoc();
echo $fila2 ['actiActi'];

De esta forma me funciona y me trae el resultado de las dos consultas, si embargo, si se pudiera realizar si tener que volver a crear una instancia de mysqli seria muy conveniente. Como digo en esta caso me funciona, pero antes de generar el resultado, sale una línea de error al colocar el condicional, Esto se soluciona simplemente con eliminar este condicional del código

if (!$mysqli2->query("CALL prueba02()")) {
echo "Falló CALL: (" . $mysqli2->errno . ") " . $mysqli2->error;
}

Igual quisiera saber que significa este error

Genera el siguiente error "Falló CALL: (2014) Commands out of sync; you can't run this command now"

Gracias
  #7 (permalink)  
Antiguo 08/03/2013, 13:30
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Pues no mates solamente la consulta sino tambien la conexión $mysqli (No la estas cerrando). Debes liberarla creo que con close si mal no recuerdo.

Código PHP:
$mysqli->close(); 
Cita:
De esta forma me funciona y me trae el resultado de las dos consultas, si embargo, si se pudiera realizar si tener que volver a crear una instancia de mysqli seria muy conveniente.
Pues yo tambien estoy esperando esa respuesta. Que nos digan la manera mas elegante de hacer esto.
__________________
Blog de humor http://elcuasatar.net63.net/
  #8 (permalink)  
Antiguo 26/04/2013, 13:48
 
Fecha de Ingreso: marzo-2013
Ubicación: Colombia
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Bueno como esta ya he encontrado la forma de realizar esta tarea

Les dejo el código que he utilizado para prode ejecutar los dos procedimientos sin la necesidad de tener que volver a realizar la conexión a la base de datos

if (!($resultado = $mysqli1->query("CALL prueba01()"))) //primer call
echo "Falló CALL: (" . $mysqli1->errno . ") " . $mysqli1->error;
$fila = $resultado->fetch_assoc();
echo $fila['acciNomb']."<br>";

$mysqli1->next_result(); //función clave

if (!($resultado = $mysqli1->query("CALL prueba02()"))) //Segundo call
echo "Falló CALL: (" . $mysqli1->errno . ") " . $mysqli1->error;
$fila = $resultado->fetch_assoc();
echo $fila ['actiActi'];
$mysqli1->close();
  #9 (permalink)  
Antiguo 26/04/2013, 19:24
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

Muy buen aporte. La solución es sencilla pero yo nunca antes la habia encontrado en ningún otro post. Es un dolor de cabeza y me parecia muy extraño que no se pudiera realizar de una manera mas elegante. Ya sera cosa de empezarla a usar en trabajos futuros.
__________________
Blog de humor http://elcuasatar.net63.net/
  #10 (permalink)  
Antiguo 02/05/2013, 21:05
Avatar de rocha7778  
Fecha de Ingreso: mayo-2013
Ubicación: Cartagena Colombia
Mensajes: 79
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: No puedo llamar mas de un procedimiento almacenados en mysql desde php

excelente aporte, jamas me inscribía en un foro solo, buscaba las soluciones y listo, pero llego la hora de trabajar con procedimientos almacenados y no encontraba como solucionar este problema, la respuesta me ayudo. y desde ahora soy un miembro mas activo y sacara tiempo para ayudar a los que hoy también me ayudaron.

Etiquetas: mysql, procedimiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:38.