Pregunta PHP: no puede pasar por las filas de mysql más de una vez


Estoy trabajando en la paginación, y por alguna razón no puedo usar mysql_fetch_array para recorrer un resultado más de una vez.

//both $page and $imagesPerPage != 0
$offset = $page * $imagesPerPage
while ($row = mysql_fetch_array($result)) {
   $total_images++;
}
echo $total_images;
//echos correct amount
$row = null;


$images_to_offset = 0;
while ($row = mysql_fetch_array($result) && $images_to_offset < $offset) {
   $images_to_offset++;
}
echo $images_to_offset;
//echos 0... which is wrong

¿Debo usar una función php diferente para obtener datos de fila en una base de datos?

¡Gracias!


5
2017-10-02 13:32


origen


Respuestas:


Este es el error

while ($row = mysql_fetch_array($result)) {
   $total_images++;
}

una vez que haya obtenido la matriz, el puntero de la matriz se establece en el final.

utilizar esta

 $total_images=mysql_num_rows($result);

y

$images_to_offset=mysql_num_rows($result);

O

Para restablecer la posición del puntero Uso mysql_data_seek(). Mueve el puntero interno del resultado.


8
2017-10-02 13:33



Si desea comenzar a buscar desde el principio después de que ya ha buscado, necesitará que use mysql_data_seek().

Además, tenga en cuenta que la mysql línea de funciones han sido obsoleto, y la comunidad está fomentando el uso en lugar de MySQLi o PDO_MySQL Líneas de funciones.


4
2017-10-02 13:35



Podría apuntar el puntero de nuevo a la primera fila con mysql_data_seek.

mysql_data_seek($result, 0); 

Ver también: http://ca2.php.net/manual/en/function.mysql-data-seek.php


1
2017-10-02 13:36



Tienes que 'rebobinar' la matriz, usando el mysql_data_seek función:

$offset = $page * $imagesPerPage
while ($row = mysql_fetch_array($result)) {
   $total_images++;
}
echo $total_images;
//echos correct amount
$row = null;

mysql_data_seek(); // <-- rewind to the beginning

$images_to_offset = 0;
while ($row = mysql_fetch_array($result) && $images_to_offset < $offset) {
   $images_to_offset++;
}
echo $images_to_offset;

1
2017-10-02 13:36



mysql_fetch_array no solo devuelve una matriz que corresponde a la fila recuperada, sino que también mueve el puntero interno de datos hacia adelante.

Hay más de una forma de lidiar con esto, lo más obvio es "aparcar" el resultado en una matriz en sí y luego trabajar desde allí. O consulta 2 veces. O usar mysql_data_seek. En tu caso, tal vez mysql_num_rows es más apropiado, ya que su código indica que solo quiere saber cuántas filas tiene que recorrer, y para qué sirve esta función.

Decida lo que decida, tenga en cuenta que se desaconseja el uso de la extensión mysql. En su lugar, se debe usar la extensión MySQLi o PDO_MySQL.


1
2017-10-02 13:37



Intenta usar mysql_num_rows() , de esa manera no tienes que iterar la $result dos veces, lo que le da un error en el segundo bucle, ya que debe restablecer el puntero del resultado. Hazlo así, que solo se repite una vez:

//both $page and $imagesPerPage != 0
$offset = $page * $imagesPerPage
$total_images = mysql_num_rows($result);
echo $total_images;
//echos correct amount
$row = null;


$images_to_offset = 0;
while ($row = mysql_fetch_array($result) && $images_to_offset < $offset) {
   $images_to_offset++;
}
echo $images_to_offset;

Como nota al margen, debe intentar migrar a MySQLi o PDO_MySQL para acceder a mysql, ya que la interfaz que está usando ahora está en desuso, consulte el cuadro rojo en http://es.php.net/manual/en/function.mysql-num-rows.php


1
2017-10-02 13:35



Solo puede recorrer la matriz de resultados una vez, luego de eso efectivamente 'desaparecen'. la forma de recorrer los resultados varias veces es almacenarlos en una nueva matriz durante el primer ciclo, y luego recorrer la nueva matriz tantas veces como desee ...


1
2017-10-02 13:36