sql >> Database teknologi >  >> RDS >> Mysql

Sideinddeling ved hjælp af MySQL LIMIT, OFFSET

For det første skal du ikke have et separat serverscript for hver side, det er bare vanvid. De fleste applikationer implementerer paginering via brug af en pagineringsparameter i URL'en. Noget som:

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

Du kan få adgang til det anmodede sidenummer via $_GET['page'] .

Dette gør din SQL-formulering virkelig nem:

// 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å for eksempel hvis input her var page=2 , med 4 rækker pr. side, ville din forespørgsel være"

SELECT * FROM menuitem LIMIT 4,4

Så det er det grundlæggende problem med paginering. Nu har du det ekstra krav, at du vil forstå det samlede antal sider (så du kan bestemme, om "NÆSTE SIDE" skal vises, eller om du vil tillade direkte adgang til side X via et link).

For at gøre dette skal du forstå antallet af rækker i tabellen.

Du kan simpelthen gøre dette med et DB-kald, før du forsøger at returnere dit faktiske begrænsede rekordsæt (jeg siger FØR, da du åbenbart ønsker at validere, at den anmodede side eksisterer).

Dette er faktisk ret simpelt:

$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. Laravel Eloquent vælg alle rækker med max created_at

  2. Opret en sammenkædet server mellem to Docker-containere, der kører SQL Server (T-SQL-eksempel)

  3. MySQL-fejl 1264:værdi uden for rækkevidde for kolonne

  4. Dynamisk pivotering af et bord Oracle