2011-06-22 7 views
50

Por alguna razón, necesito pasar por un resultado mysql establecido dos veces. ¿Hay una manera de hacerlo? No quiero ejecutar la consulta dos veces y no quiero tener que reescribir el script para que almacene las filas en algún lugar y luego las reutilice más adelante.¿Cómo pasar por mysql resultado dos veces?

+1

Pruebe esta función que restablece el puntero. http://php.net/manual/en/function.mysql-data-seek.php – afarazit

+0

¿Usando qué biblioteca MySQL? Por lo general, puede rebobinar el puntero interno en el conjunto de resultados. –

Respuesta

79

Ésta es la forma en que puede hacerlo:

$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... 
} 

Sin embargo, tendría que decir, esto no parece la manera correcta de manejar esto. ¿Por qué no hacer el procesamiento dentro del primer ciclo?

+1

por qué mysql_fetch_assoc()? puedo usar mysql_fetch_array() –

+0

A-OK: sí, lo que prefiera. – phant0m

+0

Sí, puedes. Es lo mismo, solo formas diferentes de buscarlo (nombre de columna/número de columna). –

7

Pruebe si mysql_data_seek() hace lo que necesita.

mysql_data_seek() mueve el puntero interno fila del resultado MySQL asociado con el identificador de resultado especificado para que apunte al número de fila especificada . La siguiente llamada a una función de búsqueda MySQL , como mysql_fetch_assoc(), devolvería esa fila .

row_number comienza en 0. El row_number debería ser un valor en el intervalo de 0 a mysql_num_rows() - 1. Sin embargo, si el conjunto de resultados está vacía (mysql_num_rows() == 0), un buscará 0 fallará con un E_WARNING y mysql_data_seek() devolverá FALSE

2

Puede usar mysql_data_seek para mover el puntero interno al comienzo del conjunto de datos. Luego, puede iterar nuevamente a través de él.

2

Confieso que no he probado esto, pero ¿ha intentado después de su primera iteración

mysql_data_seek($queryresult,0); 

para ir al primer registro?

0

Bueno, siempre podía contar el número de filas que lee, y luego hacer algo como esto:

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

No sabe por qué tendría que hacerlo, pero no lo es.

3

alternativa a los datos buscan es almacenar los valores en una matriz:

$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

Escribí una función auxiliar que llamo multiRow() que hace todo eso y solo devuelve un array de filas de matriz. –

1

Para mysqli que debe hacer lo siguiente;

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