Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Paginação usando MySQL LIMIT, OFFSET


Primeiro, não tenha um script de servidor separado para cada página, isso é loucura. A maioria dos aplicativos implementa a paginação por meio do uso de um parâmetro de paginação na URL. Algo como:
http://yoursite.com/itempage.php?page=2

Você pode acessar o número da página solicitada através de $_GET['page'] .

Isso torna sua formulação SQL muito 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;

Por exemplo, se a entrada aqui foi page=2 , com 4 linhas por página, sua consulta seria"
SELECT * FROM menuitem LIMIT 4,4

Então esse é o problema básico da paginação. Agora, você tem o requisito adicional de entender o número total de páginas (para poder determinar se "NEXT PAGE" deve ser exibido ou se você deseja permitir acesso direto à página X por meio de um link).

Para fazer isso, você deve entender o número de linhas na tabela.

Você pode simplesmente fazer isso com uma chamada de banco de dados antes de tentar retornar seu conjunto de registros limitado real (eu digo ANTES, pois você obviamente deseja validar que a página solicitada existe).

Na verdade, isso é bem simples:
$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>';
   }
}