2012-02-07 12 views
5

Okay, la mia sintassi può probabilmente essere descritta senza il codice. Fondamentalmente dovrebbe essere facile ... ma non lo è mai.

Ho 2 cicli consecutivi ... fondamentalmente la stessa cosa. SELEZIONA * ogni variabile dal mio database, e quindi ho bisogno di creare un javascript di 2 livelli basato su due sep. variabili.

Così

ho:

while ($row = mysql_fetch_array($myVariable)) { 

// do events 

} 

poi, dopo che

while ($row2 = mysql_fetch_array($myVariable)) { 

// do events 

} 

Per qualche motivo è completamente rinviare nulla sul secondo ... c'è qualche dove ho bisogno di resettare il mio array, è possibile che termini e quindi non posso solo riavviare. Tale domanda di base, ma non riesco a capire cos'altro potrebbe essere sbagliato per la vita di me. Quindi questa è la domanda, è un problema generale da fare solo due volte di seguito e aspettarsi che PHP ricomincia ogni volta all'inizio di $ myVariable che contiene la mia istruzione SELECT?

Grazie ... controllerà tutto il giorno e aggiornerà secondo necessità. Primo timer per Stack Overflow mi piacerebbe vedere l'aiuto.

+2

inserire prima tutti i record in un array un poi fare un foreach – ZiTAL

+0

http://uk.php.net/mysql-fetch-array mysql_fetch_array sposta il puntatore di dati interni, qualcuno più intelligente di me spiegherà questo più , ma fondamentalmente nel secondo ciclo sei già arrivato alla fine! – TommyBs

+0

Possibile domanda duplicata: [Secondo mentre il ciclo non è in esecuzione. Perché?] (Http://stackoverflow.com/questions/8333145/second-while-loop-not-running-why) – Wiseguy

risposta

4

Prima del secondo ciclo, provare a utilizzare mysql_data_seek():

mysql_data_seek($myVariable, 0); 

Il puntatore nel recordset deve essere ripristinato, in caso contrario sarà ancora indicare che è alla fine.

Potrebbe essere un'opzione migliore, come indicato da ZiTAL, per archiviare i record in un array e solo scorrere l'array.

+1

Preferisco questa opzione. Non è necessario inserire i dati in un array quando è possibile ripristinare il puntatore all'inizio.Fondamentalmente stai creando due array quando ne hai bisogno solo uno e quindi usando più memoria! –

+0

@AngusWalker Immagino di dover essere qualificato "migliore" in termini di potenziale leggibilità/manutenibilità. Come scritto, è ambiguo. – Wiseguy

0

Se i loop sono nidificati e assumendo $ myVariable è uguale per entrambi i loop, è sufficiente copiarlo e quindi eseguire il loop su una copia diversa ogni volta.

$myVariable = mysql_result($query); 
$myVariable2 = $myVariable; 

while ($row = mysql_fetch_array($myVariable)) { 
    while ($row = mysql_fetch_array($myVariable2)) { 
... 

Un altro +1 per "renderlo un array", tuttavia, è molto più bello lavorare con.

+0

Ho l'impressione che i loop del richiedente non siano nidificati. Ma se lo fossero, hai un buon punto. – Wiseguy

+0

Principalmente ho postato questo nel caso fossero nidificati, e poi ho completamente dimenticato di menzionare che haha. Buona pesca :) – Joe

7

Il problema è che la query restituisce un resource. Questa risorsa ha il proprio puntatore interno (contatore per ricordare quale riga restituire). mysql_fetch_array farà avanzare quel puntatore interno e restituirà ciascuna riga dalla risorsa una alla volta. una volta alla fine (non ci sono più righe), restituisce false. quindi sull'ultimo ciclo, $ row equivale a false che esce dal ciclo while. Il puntatore non viene resettato però. Quindi al prossimo ciclo while, si chiama mysql_fetch_array, il puntatore si trova alla fine e quindi restituisce false che ignora completamente il secondo ciclo while. Quello che dovresti fare è fare un ciclo attraverso i dati una volta e memorizzare ogni riga in un array. Quindi puoi copiare/eseguire il loop sull'array quanto vuoi e tutto funziona come previsto.

$data = array(); 
while ($row = mysql_fetch_array($myVariable)) { 
    $data[] = $row; 
} 
//now $data has all the rows. a simple foreach will loop over the data. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 

//and you can loop over data again and again. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
}