2011-01-26 20 views
8

Estoy ejecutando varias eliminaciones a través de mysqli :: multi_query y está estropeando la siguiente consulta en la línea.El siguiente error es siendo arrojado."Comandos fuera de sincronización; no se puede ejecutar este comando ahora" - Causado por mysqli :: multi_query

Error - SQLSTATE HY000. 
Sql error: Commands out of sync; you can't run this command now 

¿Debo limpiar el multiquery de alguna manera para que no se meta con mi próxima consulta? ¿Cuál es la causa de este error?

Y así es como estoy corriendo mi multiquery

function deleteSomeTables($args){ 
    $sql = 'delete 1;delete another;'; 
    if($database->multi_query($sql)){ 
    return true; 
    }else{ 
    return false; 
    } 
} 

estoy usando una versión reciente de XAMPP en Windows 7

Respuesta

10

Mediante el uso de mysqli::multi_query que está disparando consultas, pero hay que manejar la resultados de esas consultas antes de continuar. El documentation page describe las diversas formas de manejar los resultados. Una vez que se haya manejado, podrá realizar otras consultas correctamente.

El mensaje de error que está encontrando se explica un poco mejor en la página para mysqli::query (aunque tenga en cuenta que mysqli :: query no devolverá un objeto de resultado en esta instancia, ya que está realizando una eliminación).

Por supuesto, puede cambiar la consulta múltiple a varias consultas individuales, no sé cuáles son los pros/contras de cada enfoque.

+3

Entonces, ¿cómo puedo eliminar la consulta, ya que no estoy consiguiendo regresar nada. En realidad, no me has dicho nada que yo no supiera ya. – andrew

+8

Algo como ... 'do {$ mysqli-> use_result(); } while ($ mysqli-> next_result()) ' – ZoFreX

9

Esto me ayudó a eliminar 'Comandos fuera de sincronía' error:

do { 
    $mysqli_conn_obj->use_result(); 
}while($mysqli_conn_obj->more_results() && $mysqli_conn_obj->next_result()); 

añadir este código justo después de llamar a consulta múltiple, utilizará los conjuntos de resultados y resolver el error.

-1

código de Seva más probable es que solucionará el problema, si está utilizando el estilo de procedimiento como yo, utilizar este

do { 
    if ($result = mysqli_store_result($connect)) { 
    mysqli_free_result($result); 
    } 
} while (mysqli_next_result($connect)); 
Cuestiones relacionadas