php - mysql_fetch_row - ¿Por qué no deberías usar mysql_fetch_assoc más de 1 vez?
mysql_fetch_assoc mysqli (4)
Parece que lo que desea hacer es tratar el resultado de la consulta como una matriz (filas) de matrices (campos). Pero eso no es realmente lo que ofrece la biblioteca mysql. Lo que haré a menudo es, de hecho, copiar las filas en una matriz de matrices (simplemente hacer un bucle en mysql_fetch hasta que queden vacías) y luego hacer lo que quiera con mi propio conjunto de filas usando las funciones de matriz que PHP proporciona para este propósito. Esto también minimiza la cantidad de tiempo que la mesa está bloqueada.
Algunas personas dicen que no deberías usar mysql_fetch_assoc
más de una vez, ¿por qué?
Por ejemplo: quiero mostrar dos tablas una con usuarios que pagaron membresía, otra con usuarios que no lo hicieron, así que en lugar de consultar la base de datos 2 veces la consulto una vez y obtengo $result
variable de $result
con ambos tipos de usuarios luego ejecuto el bucle mysql_fetch_assoc
y mira si list[''membership''] = ''paid''
luego echo ...
Segunda vez, mysql_fetch_assoc
bucle mysql_fetch_assoc
y veo si list[''membership''] = ''free''
luego echo ...
Lo que utiliza menos recursos teniendo en cuenta que obtuve la misma cantidad de usuarios registrados y no registrados.
Piense en el resultado de su consulta configurado como una salchicha, y mysql_fetch_assoc () como un cuchillo que corta una porción de esa salchicha. Cada vez que traes una fila, se corta otra pieza de salchicha, y siempre es una NUEVA pieza de salchicha. No puedes ir y cortar una pieza previamente cortada, porque ya se ha comido.
Cuando alguien dice que no puede llamar a mysql_fetch_assoc()
dos veces, se mysql_fetch_assoc()
al mismo recurso. El resultado del recurso que pasa a mysql_fetch_assoc()
se realiza por referencia. Tendrá que restablecer la posición del puntero antes de poder usar mysql_fetch_assoc()
por segunda vez.
EDITAR: Y para hacerlo, intente usar mysql_data_seek()
.
Cita de Typer85 ( enlace ):
Tenga en cuenta que se puede pensar que el resultado del recurso que pasa a esta función se pasa por referencia porque un recurso es simplemente un puntero a una ubicación de memoria.
Debido a esto, no puede recorrer un resultado de recurso dos veces en la misma secuencia de comandos antes de restablecer el puntero a la posición de inicio.
Por ejemplo:
<?php
// Assume We Already Queried Our Database.
// Loop Through Result Set.
while( $queryContent = mysql_fetch_row( $queryResult ) {
// Display.
echo $queryContent[ 0 ];
}
// We looped through the resource result already so the
// the pointer is no longer pointing at any rows.
// If we decide to loop through the same resource result
// again, the function will always return false because it
// will assume there are no more rows.
// So the following code, if executed after the previous code
// segment will not work.
while( $queryContent = mysql_fetch_row( $queryResult ) {
// Display.
echo $queryContent[ 0 ];
}
// Because $queryContent is now equal to FALSE, the loop
// will not be entered.
?>
La única solución para esto es restablecer el puntero para que apunte a la primera fila antes del segundo segmento de código, de modo que ahora el código completo se verá de la siguiente manera:
<?php
// Assume We Already Queried Our Database.
// Loop Through Result Set.
while( $queryContent = mysql_fetch_row( $queryResult ) {
// Display.
echo $queryContent[ 0 ];
}
// Reset Our Pointer.
mysql_data_seek( $queryResult );
// Loop Again.
while( $queryContent = mysql_fetch_row( $queryResult ) {
// Display.
echo $queryContent[ 0 ];
}
?>
Por supuesto, tendría que hacer comprobaciones adicionales para asegurarse de que el número de filas en el resultado no sea
0
o, de lo contrario,mysql_data_seek
devolveráfalse
y se generará un error.También tenga en cuenta que esto se aplica a todas las funciones que obtienen conjuntos de resultados, incluidos
mysql_fetch_row
,mysql_fetch_assos
ymysql_fetch_array
.