2013-05-03 19 views
6

Voglio capire che cosa mysqli_store_result In realtà funziona? Quando ho visitato il PHP Manual di mysqli_store_result, ho trovato la definitonCosa fa mysqli_store_result() Effettivamente?

mysqli_store_result — Transfers a result set from the last query 

La domanda è dove si trasferisce impostato il risultato? In realtà ricevevo l'errore "Commands out of sync; you can't run this command now" dopo l'esecuzione di mysqli_multi_query Ma quando ho usato il seguente metodo, l'errore è scomparso.

mysqli_multi_query($connection,$query); 

do 
{ 
    mysqli_store_result($connection); 
} 
while(mysqli_next_result($connection)); 

Ora, si usa questo mysqli_store_result($connection) e mysqli_next_result($connection) dopo ogni mysqli_query o subito dopo mysqli_multi_query perché ho letto in PHP Manaul che

"Anche se è sempre buona pratica per liberare la memoria utilizzata da il risultato di di una query che utilizza la funzione mysqli_free_result(), quando trasferisce set di risultati di grandi dimensioni utilizzando mysqli_store_result() questo diventa particolarmente importante. "

Fonte: PHP: mysqli_store_result

un'altra domanda sorge quando ho eseguito i suddetti mysqli_multi_query($connection,$query); ho messo una dichiarazione echo 'storing result <br />' come qui di seguito

do 
{ 
    echo 'storing result <br /> 
    mysqli_store_result($connection); 
} 
while(mysqli_next_result($connection)); 

anche se c'erano solo due query INSERISCI nella query $, ma Ha dato il seguente output

storing result 
storing result 
storing result 
storing result 

Significa che sono stati trasferiti quattro set di risultati. Non riesco a capire questa situazione. Un'ultima domanda. Il processo do while sopra indicato influirà sulle prestazioni?

+0

Si prega di inviare il vostro 'stringa $ query' che produce il risultato inaspettato. – mickmackusa

risposta

0

In realtà recupererà l'intero set di risultati da MySQL. È quindi possibile mysqli_data_seek() per spostarsi su una particolare riga all'interno del set. Ciò significa che tutti i risultati verranno archiviati sul lato php dopo la prima chiamata e le chiamate successive richiederanno solo i risultati da php

+0

Ma quale gruppo di risultati potrebbe essere dopo un'istruzione INSERT INTO. Un'altra domanda, è efficace dal punto di vista delle prestazioni? – Munib

+0

Se si hanno diverse query da eseguire con un numero sconosciuto di righe, si verificherà un deciso e importante aumento di efficienza, nonché una riduzione del carico di lavoro totale sul server, in particolare se si sta facendo tutto questo su un singolo scatola. –

+0

Per l'inserimento non penso che sia necessario archiviare. È possibile memorizzare risultati molto costanti come nel caso di un semplice elenco di implementazione dei Paesi che si desidera da db, questo risultato è possibile memorizzare nella variabile store_result e quindi utilizzarlo in modo che non sia necessario effettuare chiamate –

5

I commenti precedenti hanno dichiarato che mysqli_store_result non deve essere utilizzato con le istruzioni INSERT, ma nessuno ha menzionato la funzione propriamente appropriata: mysqli_affected_rows(). Se la tua dichiarazione restituisce un set di record e vuoi controllarlo numericamente, usa mysqli_num_rows().

Se si tratta di una miscela, questo potrebbe iniziare:

$queries[]="INSERT INTO TestTable (Column1) VALUES ('TEST1')"; 
$queries[]="SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'"; 
$queries[]="INSERT INTO TestTable (Column1) VALUES ('TEST2')"; 
$queries[]="SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'"; 
$queries[]="DELETE FROM TestTable WHERE Column1 LIKE 'TEST%'"; 

if(mysqli_multi_query($con,implode(';', $queries))){ 
    do{ 
     if($result=mysqli_store_result($con)){ 
      echo "Selected rows = ".mysqli_num_rows($result)."<br><br>"; 
      mysqli_free_result($result); 
     }else{ 
      $cumulative_rows+=$aff_rows=mysqli_affected_rows($con); 
      echo "Current Query's Affected Rows = $aff_rows, Cumulative Rows = $cumulative_rows<br><br>"; 
     } 
    } while(mysqli_more_results($con) && mysqli_next_result($con)); 
} 

Uscite: Affected Righe

attuali query = 1, righe interessate cumulativo = 1

righe selezionate = 1

Righe interessate della query corrente = 1, righe interessate cumulative = 2

righe selezionate = 2

righe interessate di corrente query = 2, cumulativi righe interessate = 4

+0

@Munib se la mia risposta soddisfa la tua domanda per favore assegnagli il segno di spunta verde. Se qualcosa non è ancora chiaro, lasciatemi un commento e cercherò di sistemare la mia risposta. Otteniamo una risoluzione su questa domanda. – mickmackusa

Problemi correlati