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

Impaginazione tramite MySQL LIMIT, OFFSET

Prima di tutto, non avere uno script del server separato per ogni pagina, è solo follia. La maggior parte delle applicazioni implementa l'impaginazione tramite l'uso di un parametro di impaginazione nell'URL. Qualcosa come:

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

Puoi accedere al numero di pagina richiesto tramite $_GET['page'] .

Questo rende la tua formulazione SQL davvero semplice:

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

Quindi, ad esempio, se l'input qui fosse page=2 , con 4 righe per pagina, la tua query sarebbe"

SELECT * FROM menuitem LIMIT 4,4

Quindi questo è il problema di base dell'impaginazione. Ora hai il requisito aggiuntivo di voler comprendere il numero totale di pagine (in modo da poter determinare se "PAGINA SUCCESSIVA" deve essere mostrata o se vuoi consentire l'accesso diretto alla pagina X tramite un collegamento).

Per fare ciò, devi conoscere il numero di righe nella tabella.

Puoi semplicemente farlo con una chiamata DB prima di provare a restituire il tuo set di record limitato effettivo (dico PRIMA poiché ovviamente vuoi convalidare l'esistenza della pagina richiesta).

Questo è in realtà abbastanza semplice:

$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>';
   }
}