sql >> Database >  >> RDS >> Mysql

Paginering met MySQL LIMIT, OFFSET

Ten eerste, heb geen apart serverscript voor elke pagina, dat is gewoon waanzin. De meeste toepassingen implementeren paginering via het gebruik van een pagineringsparameter in de URL. Iets als:

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

U krijgt toegang tot het gevraagde paginanummer via $_GET['page'] .

Dit maakt uw SQL-formulering heel eenvoudig:

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

Dus als de invoer hier bijvoorbeeld page=2 . was , met 4 rijen per pagina, zou uw zoekopdracht zijn"

SELECT * FROM menuitem LIMIT 4,4

Dat is dus het fundamentele probleem van paginering. Nu heb je de toegevoegde vereiste dat je het totale aantal pagina's wilt begrijpen (zodat je kunt bepalen of "VOLGENDE PAGINA" moet worden weergegeven of dat je directe toegang tot pagina X wilt toestaan ​​via een link).

Om dit te doen, moet u het aantal rijen in de tabel begrijpen.

U kunt dit eenvoudig doen met een DB-aanroep voordat u probeert uw werkelijke beperkte recordset te retourneren (ik zeg VOORDAT, omdat u natuurlijk wilt valideren dat de gevraagde pagina bestaat).

Dit is eigenlijk heel eenvoudig:

$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. 10 Microsoft Access-tips voor het maken van selectiequery's

  2. Oracle Fusion Middleware / WebLogic Server 11g installeren

  3. SQL Server-prestatiestatistieken om de game voor te blijven

  4. ODP.NET implementeren en configureren om te werken zonder installatie met Entity Framework