Foros del Web » Programando para Internet » PHP »

CALL Procedure() Commands out of sync; you can't run this command now

Estas en el tema de CALL Procedure() Commands out of sync; you can't run this command now en el foro de PHP en Foros del Web. Buenas a todos, Tengo un desarrollo que hace una llamada a dos procedimientos: de esta forma... CALL procedimiento1 (var1, var2); ... ... $variable = valor_campo_de_registro_de_procedimiento1 ...
  #1 (permalink)  
Antiguo 22/11/2015, 03:03
 
Fecha de Ingreso: marzo-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
CALL Procedure() Commands out of sync; you can't run this command now

Buenas a todos,

Tengo un desarrollo que hace una llamada a dos procedimientos: de esta forma...

CALL procedimiento1 (var1, var2);
...
...
$variable = valor_campo_de_registro_de_procedimiento1
CALL procedimiento2 ($variable);
...
...

Si solo hay una llamada a un procedimiento no hay problema, o si en lugar de llamar a los procedimientos los cambio por las select funciona sin problema. Pero si lo hago como os he indicado obtengo este error:

Commands out of sync; you can't run this command now

Por lo que he mirado por internet parece que falta que se cierre la conexion cuando obtengo el primer conjunto de resultados. Pero no consigo dar con la forma de hacerlo. La unica manera de que me funcione es destruyendo el objeto de la conexion y volviendolo a crear antes de la segunda llamada .. pero esa forma no me parece la correcta.

El metodo que utilizo es el siguiente y lo que hace es volcar los resultados en un array :

Código PHP:
Ver original
  1. $resultado = mysqli_query($this->conexion, $sql);
  2.                 if (!$resultado) {
  3.                     $this->error = mysqli_errno($this->conexion);
  4.                 } else {
  5.                     if (mysqli_num_rows($resultado) == 0) {
  6.                         return false;
  7.                     } else {
  8.                         $i = 0;
  9.                         while ($row = mysqli_fetch_array($resultado, MYSQLI_ASSOC)) {
  10.                             foreach ($row as $indice => $valor) {
  11.                                 $r["$indice"][$i] = $valor;
  12.                             }
  13.                             $i++;
  14.                         }
  15.                         mysqli_free_result($resultado);
  16.                         return $r;
  17.                     }
  18.                 }


Si alguien me puede echar una mano, muchas gracias.
  #2 (permalink)  
Antiguo 22/11/2015, 06:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Posetea el bloque anterios, desde el principio, donde creas el contenido de $sql.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/11/2015, 06:42
 
Fecha de Ingreso: marzo-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Esta es la clase completa...

Código PHP:
Ver original
  1. class Mysql{
  2.  
  3.     private $host;
  4.     private $usuario;
  5.     private $password;
  6.     private $basededatos;
  7.     private $conexion;
  8.     public $error;
  9.  
  10.     public function __construct($host, $usuario, $password, $basededatos)
  11.     {
  12.         $this->host = $host;
  13.         $this->usuario = $usuario;
  14.         $this->password = $password;
  15.         $this->basededatos = $basededatos;
  16.         if (!$this->_conect()) {
  17.             $this->error = mysqli_connect_error();
  18.             echo mysqli_connect_error();
  19.         }
  20.     }
  21.  
  22.     public function _conect()
  23.     {
  24.         $this->conexion = mysqli_connect($this->host, $this->usuario, $this->password, $this->basededatos);
  25.         $this->conexion->query("SET NAMES utf8");
  26.        $this->conexion->query("SET CHARACTER SET utf8");
  27.         $this->conexion->set_charset('utf8');
  28.         if ($this->conexion) mysqli_select_db($this->conexion, $this->basededatos);
  29.         else {
  30.             $this->error = mysqli_connect_error();
  31.             return false;
  32.         }
  33.  
  34.     }
  35.  
  36.     public function filtrar($valor)
  37.     {
  38.         $valor = stripcslashes($valor);
  39.         $valor = ltrim($valor);
  40.         $valor = rtrim($valor);
  41.         return mysqli_real_escape_string($this->conexion, $valor);
  42.     }
  43.  
  44.     public function charset()
  45.     {
  46.        return mysqli_character_set_name($this->conexion);
  47.     }
  48.     public function consulta($sql)
  49.     {
  50.        $tipo=explode(" ",$sql);
  51.         $tipo_consulta = strtoupper($tipo[0]);
  52.         switch ($tipo_consulta) {
  53.             case 'CALL':
  54.             case 'SELECT':
  55.             case 'DESCRI':
  56.           case 'SHOW': // show tables
  57.               $resultado = mysqli_query($this->conexion, $sql);
  58.                 if (!$resultado) {
  59.                     $this->error = mysqli_errno($this->conexion);
  60.                 } else {
  61.                     if (mysqli_num_rows($resultado) == 0) {
  62.                         return false;
  63.                     } else {
  64.                         $i = 0;
  65.                         while ($row = mysqli_fetch_array($resultado, MYSQLI_ASSOC)) {
  66.                             foreach ($row as $indice => $valor) {
  67.                                 $r["$indice"][$i] = $valor;
  68.                             }
  69.                             $i++;
  70.                         }
  71.                         mysqli_free_result($resultado);
  72.                         return $r;
  73.                     }
  74.                 }
  75.                 break;
  76.             case 'INSERT':
  77.                 $resultado = mysqli_query($this->conexion, $sql);
  78.                 if (!$resultado) {
  79.                     $this->error = mysqli_errno($this->conexion);
  80.                 } else {
  81.                     return mysqli_insert_id($this->conexion);
  82.                 }
  83.                 break;
  84.             case 'DELETE':
  85.             case 'UPDATE':
  86.                 $resultado = mysqli_query($this->conexion, $sql);
  87.                 if (!$resultado) {
  88.                     $this->error = mysqli_errno($this->conexion);
  89.                 } else {
  90.                     return mysqli_affected_rows($this->conexion);
  91.                 }
  92.                 break;
  93.             default:
  94.                 $resultado = mysqli_query($this->conexion, $sql);
  95.                 if (!$resultado) {
  96.                     $this->error = mysqli_errno($this->conexion);
  97.                 } else {
  98.                     return mysqli_affected_rows($this->conexion);
  99.                 }
  100.                 break;
  101.         }
  102.     }
  103.  
  104.     public function __destruct()
  105.     {
  106.         @mysqli_close($this->conexion);
  107.     }
  108. }
  109.  
  110. ?>
  #4 (permalink)  
Antiguo 22/11/2015, 07:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Perdon, pero...
¿La consulta la recibes desde la pagina, de un form?

Eso es suicida, supongo que lo sabrás, ¿no?

En cualquier caso, el problema que hay que analizar es que tan bien construida esta la query, y como se incorpora su parametrización, cosa que en tu código no se ve. Sin eso, el error es imposible de diagnosticar y sólo podríamos hacer suposiciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/11/2015, 07:42
 
Fecha de Ingreso: marzo-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Mensaje Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Hola, el parametro me llega por un $_REQUEST, pero ya me encargo de que no se pueda hacer sqlinjection.

La select del primer procedimiento puedes ser:

Select * from productos...

cuando obtengo el id_producto la segunda select

select * from inventario where id_producto = '".$id_producto."'

es decir...

Código PHP:
Ver original
  1. $a="CALL Producto()";
  2. $haz=$db->consulta($a);
  3. $hay=count($haz["id_productos"]);
  4. for ($x=0;$x<$hay;$x++){
  5.  $b="CALL Inevtario('".$haz["id_productos"][$x]."');
  6. [B]AQUI SE PRODUCE EL ERROR[/B]
  7. $haz_b=$db->consulta($b);
  8. ....
  9.  
  10. }

Las select son correctas porque sustituyendo los Procedures por select funcionan correctamente.


GRacias.
  #6 (permalink)  
Antiguo 22/11/2015, 20:31
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Saludo.
Pues eso es porque se intenta realizar doble query,
y mysqli ocupa querys sin buffer para ello, en cuyo caso una de dos,
o usar mysqli_store_result o hacer el primer query, guardar en un array
los ids, y luego recorrerlos y ejecutar el segundo query
en dicho recorrido.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #7 (permalink)  
Antiguo 23/11/2015, 03:01
 
Fecha de Ingreso: marzo-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Hola mortiprogramador, eso ya lo hago...

obtengo del primer procedure el array con todos los resultados, pero necesito destruir el objeto de la conexion y volver a crearlo para ejecutar el siguiente procedure, pero eso no me parece correcto..

¿no se podría hacer algo dentro de la clase, una vez que devuelve el array con los datos para que no se produzca el error y no tenga que destruir y volver a crear el objeto de la conexión?

gracias
  #8 (permalink)  
Antiguo 23/11/2015, 21:49
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Saludo
Pues revisando el tema a fondo, el asunto es por el llamado como tal
a los SP sin liberar recursos antes, así que se debe hacer uso de
mysqli_next_result enviando como parámetro la conexión
y mysqli_free_result enviando como parámetro el result de mysql_query.

En tu caso creo que podría ser en el else del default
de la función consultar de la clase Mysql.

Así incluso no habría necesidad de obtener los resultados para
luego tener que recorrerlos nuevamente, sino que en el mismo
ciclo de recorrido de los resultados se puede ejecutar los querys.


__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #9 (permalink)  
Antiguo 24/11/2015, 04:59
 
Fecha de Ingreso: marzo-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

En tu caso creo que podría ser en el else del default
de la función consultar de la clase Mysql.



de default del switch???, pero si no entra en el default.... o te refieres
a meter mysqli_free_result dentro del if (!$resultado) { .. <aqui> }

Gracias...
  #10 (permalink)  
Antiguo 24/11/2015, 05:41
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: CALL Procedure() Commands out of sync; you can't run this command now

Cita:
Iniciado por Javierc Ver Mensaje
En tu caso creo que podría ser en el else del default
de la función consultar de la clase Mysql.



de default del switch???, pero si no entra en el default.... o te refieres
a meter mysqli_free_result dentro del if (!$resultado) { .. <aqui> }

Gracias...

Saludo.
Me refería al else pero de ese if que mencionas,
sin embargo esto para CALL, habría que ver
como se comporta con los otros CASE (SELECT, DESCRI y SHOW) que
hacen uso de esta misma parte de código.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Etiquetas: call, mysql, procedure, registro, run, select, sql, variable
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




La zona horaria es GMT -6. Ahora son las 15:40.