2011-06-22 9 views
50

Per qualsiasi motivo ho bisogno di passare attraverso un risultato mysql impostato due volte. C'è un modo per farlo? Non voglio eseguire la query due volte e non voglio dover riscrivere lo script in modo che memorizzi le righe da qualche parte e riutilizzarle successivamente.Come passare attraverso il risultato mysql due volte?

+1

Provare questa funzione che ripristina il puntatore. http://php.net/manual/en/function.mysql-data-seek.php – afarazit

+0

Usando quale libreria MySQL? Di solito è possibile riavvolgere il puntatore interno nel set di risultati. –

risposta

79

Ecco come si può fare:

$result = mysql_query(/* Your query */); 
while($row = mysql_fetch_assoc($result)){ 
// do whatever here... 
} 

// set the pointer back to the beginning 
mysql_data_seek($result, 0); 
while($row = mysql_fetch_assoc($result)){ 
// do whatever here... 
} 

Tuttavia, avrei dovuto diciamo, questo non sembra il modo giusto per gestire questo. Perché non eseguire l'elaborazione all'interno del primo ciclo?

+1

perché mysql_fetch_assoc()? posso usare mysql_fetch_array() –

+0

A-OK: Sì, qualunque cosa tu preferisca. – phant0m

+0

Sì, è possibile. È la stessa cosa, solo modi diversi di scaricarlo (nome colonna/numero colonna). –

7

Provate se lo mysql_data_seek() fa quello che vi serve.

mysql_data_seek() sposta il puntatore fila interna del risultato MySQL associato al risultato identificatore indicato per puntare al specificato numero di riga. La prossima chiamata a una funzione di recupero MySQL , come ad esempio mysql_fetch_assoc(), restituirebbe quella riga .

row_number inizia da 0. Il row_number dovrebbe essere un valore nell'intervallo da 0 a mysql_num_rows() - 1. Tuttavia, se il set di risultati è vuoto (mysql_num_rows() == 0), un cercare di 0 non riuscirà con un E_WARNING e mysql_data_seek() restituirà FALSE

2

È possibile utilizzare mysql_data_seek per spostare il puntatore interno all'inizio del set di dati. Quindi, puoi semplicemente ripetere di nuovo.

2

Confesso che non ho provato questo, ma hai provato dopo la tua prima iterazione

mysql_data_seek($queryresult,0); 

di andare al primo record?

0

Beh, si può sempre contare il numero di righe che si leggono, e poi fare qualcosa di simile:

if (rownumber == mysql_num_rows($result)) { mysql_data_seek($result, 0); } 

Non so perché si avrebbe bisogno di, ma è proprio così.

3

alternativa ai dati cercare è quello di memorizzare i valori in un array:

$arrayVals = array(); 
$result = mysql_query(/* Your query */); 
while($row = mysql_fetch_assoc($result)){ 
    $arrayVals[] = $row; 
} 

// Now loop over the array twice instead 

$len = count($arrayVals); 
for($x = 0; $x < $len; $x++) { 
    $row = $arrayVals[$x]; 

    // Do something here  
} 

$len = count($arrayVals); 
for($x = 0; $x < $len; $x++) { 
    $row = $arrayVals[$x]; 

    // Do something else here 
} 
+0

Ho scritto una funzione di aiuto che chiamo multiRow() che fa tutto ciò e restituisce solo una serie di righe di array. –

1

Per mysqli si dovrebbe effettuare le seguenti operazioni;

$result= $con->query($sql); // $con is the connection object 
$result->data_seek(0); 
Problemi correlati