Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Paginierung mit MySQL LIMIT, OFFSET

Zunächst einmal, haben Sie kein separates Serverskript für jede Seite, das ist einfach Wahnsinn. Die meisten Anwendungen implementieren die Paginierung über die Verwendung eines Paginierungsparameters in der URL. Etwas wie:

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

Die angeforderte Seitenzahl erreichen Sie über $_GET['page'] .

Das macht Ihre SQL-Formulierung wirklich einfach:

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

Also zum Beispiel, wenn die Eingabe hier page=2 war , mit 4 Zeilen pro Seite, wäre Ihre Abfrage"

SELECT * FROM menuitem LIMIT 4,4

Das ist also das grundlegende Problem der Paginierung. Jetzt haben Sie die zusätzliche Anforderung, dass Sie die Gesamtzahl der Seiten verstehen möchten (damit Sie bestimmen können, ob "NÄCHSTE SEITE" angezeigt werden soll oder ob Sie den direkten Zugriff auf Seite X über einen Link ermöglichen möchten).

Dazu müssen Sie die Anzahl der Zeilen in der Tabelle kennen.

Sie können dies einfach mit einem DB-Aufruf tun, bevor Sie versuchen, Ihren tatsächlichen begrenzten Datensatz zurückzugeben (ich sage VORHER, da Sie offensichtlich bestätigen möchten, dass die angeforderte Seite existiert).

Das ist eigentlich ganz einfach:

$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>';
   }
}