sql >> Databáze >  >> RDS >> Mysql

Stránkování pomocí MySQL LIMIT, OFFSET

Za prvé, nemít samostatný serverový skript pro každou stránku, to je prostě šílenství. Většina aplikací implementuje stránkování pomocí parametru stránkování v adrese URL. Něco jako:

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

K požadovanému číslu stránky se dostanete přes $_GET['page'] .

Díky tomu je vaše formulace SQL opravdu snadná:

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

Například pokud zde vstup byl page=2 , se 4 řádky na stránku by váš dotaz byl"

SELECT * FROM menuitem LIMIT 4,4

To je tedy základní problém stránkování. Nyní máte přidaný požadavek, že chcete porozumět celkovému počtu stránek (abyste mohli určit, zda se má zobrazit „DALŠÍ STRÁNKA“ nebo zda chcete povolit přímý přístup na stránku X prostřednictvím odkazu).

Chcete-li to provést, musíte pochopit počet řádků v tabulce.

Můžete to jednoduše udělat pomocí DB volání, než se pokusíte vrátit vaši skutečnou omezenou sadu záznamů (říkám PŘED, protože zjevně chcete ověřit, že požadovaná stránka existuje).

To je vlastně docela jednoduché:

$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. Homebrew postgres zlomený

  2. MySQL NAČTE DATOVÝ VSTUPNÍ SOUBOR pomocí ON DUPLICATE KEY UPDATE

  3. Co je skenování bitmapové haldy v plánu dotazů?

  4. Agregáty a dělení