2012-02-07 36 views
5

Bien, mi sintaxis probablemente se pueda describir sin el código. Básicamente debería ser fácil ... pero nunca lo es.

Tengo 2 vueltas seguidas ... básicamente lo mismo. SELECCIONO * cada variable de mi base de datos, y luego necesito crear un javascript de 2 capas basado en dos sep. variables.

Así

que tengo:

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

// do events 

} 

a continuación, después de que

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

// do events 

} 

Por alguna razón que esté completamente devolver nada en el segundo ... ¿hay alguna donde necesito restablecer mi matriz, posiblemente terminó y luego no puedo simplemente reiniciar. Una pregunta tan básica, pero no puedo entender qué otra cosa podría estar mal para mi vida. Entonces esa es la pregunta: ¿es un problema general hacer eso dos veces seguidas y esperar que PHP vuelva a empezar cada vez al comienzo de $ myVariable que contiene mi instrucción SELECT?

Gracias ... revisaremos todo el día y actualizaremos según sea necesario. Primer contador de tiempo para Stack Overflow Me encantaría ver la ayuda.

+2

primera insertar todos los registros en una matriz de una continuación, hacen un foreach – ZiTAL

+0

http://uk.php.net/mysql-fetch-array mysql_fetch_array mueve el puntero interno de datos, alguien más inteligente que yo le explicará esto más , pero básicamente en el segundo ciclo ya has llegado al final! – TommyBs

+0

Posible pregunta duplicada: [Segundo ciclo while no se está ejecutando. ¿Por qué?] (Http://stackoverflow.com/questions/8333145/second-while-loop-not-running-why) – Wiseguy

Respuesta

4

Antes de que el segundo bucle, intente utilizar mysql_data_seek():

mysql_data_seek($myVariable, 0); 

El puntero del conjunto de registros necesita ser reajustada, de lo contrario seguirá indicar que es al final.

Puede ser una mejor opción, como señala ZiTAL, almacenar sus registros en una matriz y simplemente iterar sobre la matriz.

+1

Prefiero esta opción. No es necesario colocar los datos en una matriz cuando puede restablecer el puntero al inicio.Básicamente, solo estás creando dos matrices cuando solo necesitas una, ¡y eso requiere más memoria! –

+0

@AngusWalker Creo que debería haber calificado "mejor" en términos de legibilidad/facilidad de mantenimiento. Como está escrito, es ambiguo. – Wiseguy

0

Si sus bucles están anidados, y suponiendo $ myVariable es el mismo para ambos bucles, simplemente cópielo y luego repita una copia diferente cada vez.

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

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

Otro +1 para "hacer que sea una matriz" es mucho mejor para trabajar.

+0

Me da la impresión de que los bucles del asker no están anidados. Pero si lo fueron, tienes un buen punto. – Wiseguy

+0

Principalmente publiqué esto en caso de que estuvieran anidados, y luego olvidé por completo mencionar que jaja. Buena atrapada :) – Joe

7

El problema es que la consulta devuelve resource. Este recurso tiene su propio puntero interno (contador para recordar qué fila devolver). mysql_fetch_array avanzará ese puntero interno y devolverá cada fila del recurso de a una por vez. una vez que está al final (no quedan más filas), devuelve falso. así que en el último ciclo, $ fila es igual a falso, que sale del ciclo while. Sin embargo, el puntero no se reinicia. Por lo tanto, en el siguiente ciclo while, llama a mysql_fetch_array, el puntero está al final y devuelve falso, lo que evita por completo el segundo ciclo while. Lo que debe hacer es recorrer una vez los datos y almacenar cada fila en una matriz. Luego puede copiar/repetir en la matriz todo lo que quiera y todo funciona como se espera.

$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); 
} 
Cuestiones relacionadas