2011-01-26 3 views
8

Sto eseguendo più eliminazioni tramite mysqli :: multi_query e si sta rovinando la prossima query in linea. Il seguente errore è essere gettato."Comandi non sincronizzati, non è possibile eseguire questo comando ora" - Causato da mysqli :: multi_query

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

Devo in qualche modo cancellare la multiquery in modo che non disturbi la mia prossima query? Qual è la causa di questo errore?

E questo è come sto facendo funzionare il mio multiquery

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

Sto usando una versione recente di XAMPP su Windows 7

risposta

10

Utilizzando mysqli::multi_query si sta sparando le query, ma è necessario per gestire il risultati di quelle domande prima di andare avanti. Lo documentation page descrive i vari modi di gestire i risultati. Una volta gestito, sarete in grado di eseguire altre query bene.

Il messaggio di errore che si sta verificando viene in realtà spiegato un po 'meglio nella pagina per mysqli::query (sebbene si tenga presente che mysqli :: query non restituirà un oggetto risultato in questa istanza, poiché si sta eseguendo un'eliminazione).

Si potrebbe ovviamente modificare multiquery su più query singole, non so quali siano i pro/contro di ciascun approccio.

+3

Allora, come faccio a cancellare la domanda, dal momento che non sto ottenendo nulla tornato. In realtà non mi hai detto nulla che non sapessi già. – andrew

+8

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

9

Questo mi ha aiutato a rimuovere 'Comandi fuori sincrono' errore:

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

Aggiungi questo codice solo dopo aver chiamato multi_query, verrà utilizzato il set di risultati e risolvere l'errore.

-1

codice di Seva sarà molto probabilmente risolvere il problema, se si sta utilizzando lo stile procedurale come me, usare questa

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