Mysql
 sql >> Database >  >> RDS >> Mysql

Perché mysqli dà un errore di sincronizzazione dei comandi?

Il client MySQL non consente di eseguire una nuova query in cui sono ancora presenti righe da recuperare da una query in corso. Vedi Comandi non sincronizzati nel documento MySQL sugli errori comuni.

Puoi utilizzare mysqli_store_result() per precaricare tutte le righe dalla query esterna. Ciò li buffererà nel client MySQL, quindi dal punto di vista del server la tua app ha recuperato l'intero set di risultati. Quindi puoi eseguire più query anche in un ciclo di recupero delle righe dal set di risultati esterno ora memorizzato nel buffer.

Oppure mysqli_result::fetch_all() che restituisce l'intero set di risultati come un array PHP, e quindi puoi eseguire il loop su quell'array.

La chiamata di stored procedure è un caso speciale, poiché una stored procedure ha il potenziale per restituire più set di risultati, ognuno dei quali può avere il proprio set di righe. Ecco perché la risposta di @a1ex07 menziona l'utilizzo di mysqli_multi_query() e scorrendo fino a mysqli_next_result() non ha più set di risultati. Questo è necessario per soddisfare il protocollo MySQL, anche se nel tuo caso la tua procedura memorizzata ha un unico set di risultati.

PS:A proposito, vedo che stai facendo le query nidificate perché hai dati che rappresentano una gerarchia. Potresti considerare di archiviare i dati in modo diverso, in modo da poterli interrogare più facilmente. Ho fatto una presentazione su questo Modelli per dati gerarchici con SQL e PHP . Tratto questo argomento anche in un capitolo del mio libro SQL Antipatterns:Evitare le insidie ​​del database Programmazione .

Ecco come implementare mysqli_next_result() in CodeIgnitor 3.0.3:

Alla riga 262 di system/database/drivers/mysqli/mysqli_driver.php cambia

protected function _execute($sql)
{
    return $this->conn_id->query($this->_prep_query($sql));
}

a questo

protected function _execute($sql)
{
    $results = $this->conn_id->query($this->_prep_query($sql));
    @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
    return $results;
}

Questo è stato un problema dalla 2.x. Ho appena aggiornato alla 3.x e ho dovuto copiare questo hack sulla nuova versione.