Saltar al contenido

Paginación usando MySQL LIMIT, OFFSET

No olvides que en las ciencias un error suele tener varias soluciones, de igual modo nosotros aquí te enseñamos lo más óptimo y mejor.

Solución:

En primer lugar, no tenga un script de servidor separado para cada página, eso es una locura. La mayoría de las aplicaciones implementan la paginación mediante el uso de un parámetro de paginación en la URL. Algo como:

http://yoursite.com/itempage.php?page=2

Puede acceder al número de página solicitado a través de $_GET['page'].

Esto hace que su formulación SQL sea realmente fácil:

// determine page number from $_GET
$page = 1;
if(!empty($_GET['page'])) 
    $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
    if(false === $page) 
        $page = 1;
    


// set the number of items to display per page
$items_per_page = 4;

// build query
$offset = ($page - 1) * $items_per_page;
$sql = "SELECT * FROM menuitem LIMIT " . $offset . "," . $items_per_page;

Entonces, por ejemplo, si la entrada aquí fue page=2, con 4 filas por página, su consulta sería”

SELECT * FROM menuitem LIMIT 4,4

Ese es el problema básico de la paginación. Ahora, tiene el requisito adicional de que desea comprender el número total de páginas (para que pueda determinar si se debe mostrar “PÁGINA SIGUIENTE” o si desea permitir el acceso directo a la página X a través de un enlace).

Para hacer esto, debe comprender el número de filas en la tabla.

Simplemente puede hacer esto con una llamada DB antes de intentar devolver su conjunto de registros limitado real (digo ANTES ya que obviamente desea validar que existe la página solicitada).

Esto es realmente bastante simple:

$sql = "SELECT your_primary_key_field FROM menuitem";
$result = mysqli_query($con, $sql);
if(false === $result) 
   throw new Exception('Query failed with: ' . mysqli_error());
 else 
   $row_count = mysqli_num_rows($result);
   // free the result set as you don't need it anymore
   mysqli_free_result($result);


$page_count = 0;
if (0 === $row_count)   
    // maybe show some error since there is nothing in your table
 else 
   // determine page_count
   $page_count = (int)ceil($row_count / $items_per_page);
   // double check that request page is in range
   if($page > $page_count) 
        // error to user, maybe set page to 1
        $page = 1;
   


// make your LIMIT query here as shown above


// later when outputting page, you can simply work with $page and $page_count to output links
// for example
for ($i = 1; $i <= $page_count; $i++) 
   if ($i === $page)  // this is current page
       echo 'Page ' . $i . '
'; else // show link to other page echo 'Page ' . $i . '
';

Una docena de páginas no es gran cosa cuando se usa OFFSET. Pero cuando tienes cientos de páginas, encontrarás que OFFSET es malo para el rendimiento. Esto se debe a que todas las filas omitidas deben leerse cada vez.

Es mejor recuerda donde lo dejaste.

Usar .. LIMIT :pageSize OFFSET :pageStart

Donde :pageStart está vinculado a the_page_index (es decir, 0 para la primera página) * number_of_items_per_pages (por ejemplo, 4) y :pageSize está vinculado a número_de_elementos_por_páginas.

Para detectar “tiene más páginas”, use SQL_CALC_FOUND_ROWS o use .. LIMIT :pageSize OFFSET :pageStart + 1 y detectar un último registro faltante (pageSize+1). No hace falta decir que para las páginas con un índice > 0, existe una página anterior.

Si el valor del índice de la página está incrustado en la URL (por ejemplo, en los enlaces “página anterior” y “página siguiente”), entonces se puede obtener a través de la correspondiente $_GET ít.

Agradecemos que desees añadir valor a nuestra información dando tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *