Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pagination avec MySQL LIMIT, OFFSET

Tout d'abord, n'ayez pas de script de serveur séparé pour chaque page, c'est juste de la folie. La plupart des applications implémentent la pagination via l'utilisation d'un paramètre de pagination dans l'URL. Quelque chose comme :

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

Vous pouvez accéder au numéro de page demandé via $_GET['page'] .

Cela rend votre formulation SQL vraiment facile :

// 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;

Ainsi, par exemple, si l'entrée ici était page=2 , avec 4 lignes par page, votre requête serait"

SELECT * FROM menuitem LIMIT 4,4

Voilà donc le problème de base de la pagination. Maintenant, vous avez la condition supplémentaire que vous voulez comprendre le nombre total de pages (afin que vous puissiez déterminer si "NEXT PAGE" doit être affiché ou si vous souhaitez autoriser l'accès direct à la page X via un lien).

Pour ce faire, vous devez comprendre le nombre de lignes dans le tableau.

Vous pouvez simplement le faire avec un appel DB avant d'essayer de renvoyer votre jeu d'enregistrements limité réel (je dis AVANT puisque vous voulez évidemment valider que la page demandée existe).

C'est en fait assez 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>';
   }
}