Mysql
 sql >> база данни >  >> RDS >> Mysql

Пагинация с използване на MySQL LIMIT, OFFSET

Първо, не разполагайте с отделен сървърен скрипт за всяка страница, това е просто лудост. Повечето приложения прилагат пагинация чрез използване на параметър за пагинация в URL адреса. Нещо като:

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

Можете да получите достъп до искания номер на страница чрез $_GET['page'] .

Това прави вашата SQL формулировка наистина лесна:

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

Така например, ако въвеждането тук е page=2 , с 4 реда на страница, вашата заявка ще бъде"

SELECT * FROM menuitem LIMIT 4,4

Така че това е основният проблем на пагинацията. Сега имате допълнителното изискване, че искате да разберете общия брой страници (за да можете да определите дали „СЛЕДВАЩА СТРАНИЦА“ трябва да се показва или искате да разрешите директен достъп до страница X чрез връзка).

За да направите това, трябва да разберете броя на редовете в таблицата.

Можете просто да направите това с DB повикване, преди да се опитате да върнете действителния си ограничен набор от записи (казвам ПРЕДИ, тъй като очевидно искате да потвърдите, че исканата страница съществува).

Това всъщност е доста просто:

$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. Задаване на паролата за root на MySQL на OS X

  2. АКТУАЛИЗИРАНЕ на множество таблици в MySQL с помощта на LEFT JOIN

  3. Как да изчислим ранга в MySQL

  4. Как ефективно да използвам MySQLDB SScursor?

  5. Как да предоставим всички привилегии на root потребител в MySQL 8.0