2010-02-22 9 views
7

Me postulo una consulta con un procedimiento almacenado mysql:Procedimiento almacenado provoca "comandos fuera de sincronización" en la siguiente consulta

$AddProf_qr = mysql_query("call AddStudent('$d_Pass', '$d_Titl', '$d_Firs', '$d_Midd', '$d_Last', '$d_Addr', '$d_City', '$d_Stat', '$d_County', '$d_Zipc', $d_Gend, '$d_Birh', '$d_Phom', '$d_Phoh', '$d_Phoo', '$d_Email', '$d_Webs', '$d_Natn', '$d_Profsn', '$d_Compny', '$d_Desig', $d_ProfAcc)", $this->c_remote) or die ("first call" . mysql_error($this->c_remote)); 

supone que tengo que obtener sólo uno de los resultados de la llamada: @@ IDENTITY = un número;

$AP_result = mysql_fetch_array($AddProf_qr); 
$CurrentSID = $AP_result['@@IDENTITY']; 

que funciona bien. pero cuando corro otra consulta de actualización de MySQL justo después de esto, se da un error que dice:

de error: 2014 (CR_COMMANDS_OUT_OF_SYNC) mensaje: Comandos fuera de sincronización; no se puede ejecutar este comando ahora

he intentado insertar:

mysql_free_result($AddProf_qr); 

pero sigue siendo el mismo.

La llamada de MySQL se ejecuta bien también el resto de la secuencia de comandos se ejecuta sin problemas, lo anterior está comentado. pero no se ejecutan al mismo tiempo. Mi mejor suposición es que la llamada está haciendo algo que está estropeando esto.

+0

está cambiando a Mysqli o DOP es una opción? – VolkerK

+0

Tengo toda la secuencia de comandos escrita en mysql (varias consultas). Esperaba que alguien supiera de qué se trataba, antes de volver a escribirlo. – DMin

+3

mysql() es un montón de basura y obsoleto – hobodave

Respuesta

8

Su procedimiento almacenado devuelve resultados múltiples. Ver this post

¿Solución?

  • Uso mysqli_multi_query
  • Deje de usar la biblioteca MySQL antiguo - la i de mysqli significa "mejorado" - con buena razón.
+0

mysqli no soluciona este problema, pero la respuesta fue muy útil, sin embargo :-) – Richard

0

Salida aquí: http://us3.php.net/manual/en/function.mysql-query.php En los comentarios, un hombre afirma que lo hizo funcionar mediante el establecimiento de conexión con la bandera MYSQL_MULTI_RESULTS (131072).

Pero sería mucho mejor utilizar mysqli ...

+0

bien, lo resolvió. no es la mejor solución en el mundo, pero mientras funcione, estoy feliz. Esa fue la primera consulta en mi script. Hice una conexión con el DB, ejecuté la consulta. cerró la conexión. hizo una nueva conexión y ejecutó el resto del script. :) – DMin

2

@DMin Sí que es funcionaría, pero se podrán bloquear el servidor tarde o temprano. ¡Solo haga los cálculos, una búsqueda en una página que hace 3 * cantidad de procedimientos en la base de datos! ¡Solo piénselo!

[ACTUALIZACIÓN] solución:

$aCategory = array(); 
$it=0; 
$res = $mysqli->multi_query("call ListCategory();"); 
if($res) { 
    do { 
    if ($result = $mysqli->store_result()) { 

     while($row = $result->fetch_row()) { 
       $aCategory[$it] =$row; 
       $it= $it + 1; 
     } 
     $result->close(); 
    } 
    } while($mysqli->next_result()); 
} 

foreach($aCategory as $row){ 
    echo . $row[0] . " - " . $row[1] . "<br />"; 
} 

sólo quería añadir que está listo para llamar a la siguiente rutina.

PS: De esta manera no podía usar

echo $aCategory['category_id'] ; 
//or 
echo $aCategory->category_id; 
//just 
echo $aCategory[0] 
0

mysql_free_result (cliente-> res);

while (mysql_more_results(client->conn)) 
{ 
    mysql_next_result(client->conn); 
} 

Esto hizo el encanto para mí :)

0

conjuntos de resultados devueltos desde un procedimiento almacenado no se pueden recuperar correctamente utilizando mysqli_query(). La función mysqli_query() combina la ejecución de la sentencia y la obtención del primer conjunto de resultados en un conjunto de resultados almacenados en el búfer, si los hay. Sin embargo, hay conjuntos de resultados de procedimientos almacenados adicionales ocultos para el usuario que hacen que mysqli_query() falle al devolver los conjuntos de resultados esperados por el usuario.

Los conjuntos de resultados devueltos de un procedimiento almacenado se obtienen usando mysqli_real_query() o mysqli_multi_query(). Ambas funciones permiten obtener cualquier cantidad de conjuntos de resultados devueltos por una instrucción, como CALL.

vistazo a official manual

Cuestiones relacionadas