sql >> Base de Datos >  >> RDS >> Mysql

Paginación usando MySQL LIMIT, OFFSET

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í fuera 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 la página solicitada existe).

En realidad, esto es bastante simple:

$sql = "SELECT your_primary_key_field FROM menuitem";
$result = mysqli_query($con, $sql);
$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 . '<br>';
   } else { // show link to other page   
       echo '<a href="/menuitem.php?page=' . $i . '">Page ' . $i . '</a><br>';
   }
}