Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Paginacja za pomocą MySQL LIMIT, OFFSET

Po pierwsze, nie miej osobnego skryptu serwera dla każdej strony, to po prostu szaleństwo. Większość aplikacji implementuje paginację za pomocą parametru paginacji w adresie URL. Coś takiego:

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

Możesz uzyskać dostęp do żądanego numeru strony poprzez $_GET['page'] .

To sprawia, że ​​formułowanie SQL jest naprawdę proste:

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

Na przykład, jeśli dane wejściowe to page=2 , przy 4 wierszach na stronę, Twoje zapytanie będzie wyglądało tak:„

SELECT * FROM menuitem LIMIT 4,4

To jest podstawowy problem paginacji. Teraz masz dodatkowy wymóg, że chcesz poznać całkowitą liczbę stron (abyś mógł określić, czy ma być wyświetlana „NASTĘPNA STRONA”, czy chcesz zezwolić na bezpośredni dostęp do strony X za pomocą linku).

Aby to zrobić, musisz zrozumieć liczbę wierszy w tabeli.

Możesz po prostu zrobić to za pomocą wywołania DB, zanim spróbujesz zwrócić swój rzeczywisty ograniczony zestaw rekordów (mówię PRZED, ponieważ oczywiście chcesz sprawdzić, czy żądana strona istnieje).

To całkiem proste:

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Navicat dla MySQL

  2. MySQL:Kod błędu:1118 Zbyt duży rozmiar wiersza (> 8126). Zmiana niektórych kolumn na TEKST lub BLOB

  3. Status pokazu MySQL - połączenia aktywne czy całkowite?

  4. Python:użyć mysqldb do zaimportowania tabeli MySQL jako słownika?

  5. Zapytanie MySQL, MAX() + GROUP BY