sql >> Databasteknik >  >> RDS >> Mysql

Paginering med MySQL LIMIT, OFFSET

För det första, ha inte ett separat serverskript för varje sida, det är bara galenskap. De flesta applikationer implementerar paginering genom att använda en pagineringsparameter i URL:en. Något i stil med:

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

Du kan komma åt det begärda sidnumret via $_GET['page'] .

Detta gör din SQL-formulering väldigt enkel:

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

Så till exempel om inmatningen här var page=2 , med 4 rader per sida, skulle din fråga vara"

SELECT * FROM menuitem LIMIT 4,4

Så det är det grundläggande problemet med paginering. Nu har du det extra kravet att du vill förstå det totala antalet sidor (så att du kan avgöra om "NÄSTA SIDAN" ska visas eller om du vill tillåta direktåtkomst till sida X via en länk).

För att göra detta måste du förstå antalet rader i tabellen.

Du kan helt enkelt göra detta med ett DB-anrop innan du försöker returnera din faktiska begränsade rekorduppsättning (jag säger INNAN eftersom du uppenbarligen vill validera att den begärda sidan finns).

Detta är faktiskt ganska enkelt:

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


  1. Överför datatabell som parameter till lagrade procedurer

  2. Skicka flera uppsättningar eller matriser av värden till en funktion

  3. Använda ett Alias ​​i en WHERE-sats

  4. Hur Unicode() fungerar i SQLite