Paginazione dei dati

Lettura paginata dei dati

Di seguito viene riportato il listato di index.php, il principale script PHP dell'applicazione di esempio, responsabile tra l'altro dell'estrazione dei record dal database. Le prime righe servono a specificare tutti i settaggi del programma necessari alla connessione con il database, alla creazione delle pagine web e dei link di navigazione (modificateli per adattarli alla vostra configurazione). Si noti in particolare la variabile $url_base con la quale viene impostato l'URL necessario a richiamare lo script corrente. Nel nostro esempio viene settato a "index.php" ma potremmo trovarci in situazioni più generiche, con un URL contenente parametri, ad esempio "index.php?nazione=italia". $url_base quindi è l'URL che utilizzeremo per costruire i link di navigazione, al quale pertanto dovremo poi aggiungere un ulteriore parametro "pag" necessario a specificare la pagina richiesta (es.: . index.php?nazione=italia&pag=2). La creazione di questi URL con l'indicazione della pagina richiesta sarà effettuata dalla funzione crea_url() descritta in seguito.

Specificati i parametri dell'applicazione si prosegue poi con la connessione a MySQL e la selezione del DB.

Il calcolo del numero totale di pagine viene fatto attraverso la SELECT COUNT(*) che nel nostro esempio non richiede una clausola WHERE poiché mostreremo tutti i dati contenuti nella tabella. Si noti che per calcolare tale numero viene arrotondato per eccesso con la funzione ceil() il risultato della divisione tra $tot_righe e $righe_per_pagina.

Dall'URL recuperiamo il numero della pagina richiesta dall'utente ($_GET['pag']) e se questo assume un valore illecito, minore di uno o maggiore del numero dell'ultima pagina, eseguiamo un redirect rispettivamente alla prima o all'ultima pagina. Per effettuare il redirect viene utilizzata la funzione crea_url() che, come anticipato, serve a confezionare l'URL di destinazione contenente l'indicazione sulla pagina da mostrare.

Si procede infine con l'esecuzione della query di estrazione dei record e con la fetch dei risultati. La creazione dei link di navigazione viene affidata alla funzione paginazione(), che verrà illustrata nella prossima pagina.

<?php
include 'paginazione.php';

$DB_host     = 'localhost';
$DB_user     = 'root';
$DB_password = 'secret';
$DB_name     = 'test';

$righe_per_pagina = 1;
$url_base = "index.php";
$pagine_vicine = 1;

// ----------------------------------------------------------------
//         C O N N E S S I O N E   A L   D A T A B A S E

$link = mysql_connect($DB_host, $DB_user, $DB_password);
if (!$link) {
    die ('Non riesco a connettermi: ' . mysql_error());
}

$db_selected = mysql_select_db($DB_name, $link);
if (!$db_selected) {
    die ("Errore nella selezione del database: " . mysql_error());
}

// ----------------------------------------------------------------
//    C A L C O L O   D E L   N U M E R O   D I   P A G I N E

// ricavo il numero totale di record
$query = "SELECT COUNT(*) FROM comuni";
$result = mysql_query($query);
// record complessivi
$tot_righe = mysql_result($result,0);
// totale pagine
$tot_pagine = ceil($tot_righe / $righe_per_pagina);

// ----------------------------------------------------------------
//                 P A G I N A   C O R R E N T E

$pagina_corrente = isset($_GET['pag']) ? (int)$_GET['pag'] : 1;

// se la pagina corrente è minore di 1
if($pagina_corrente < 1)  {
    header('location: ' . $url_base);
    exit();
}

// se la pagina corrente è maggiore dell'ultima pagina
if($pagina_corrente > $tot_pagine) {
    header('location: ' . crea_url($url_base, $tot_pagine));
    exit();
}

// ----------------------------------------------------------------
//            E S T R A Z I O N E   D E I   R E C O R D

// calcolo la prima riga da estrarre con la query
$prima_riga = ($pagina_corrente - 1) * $righe_per_pagina;

$query = "SELECT *
          FROM comuni
          ORDER BY comune, cod_istat
          LIMIT $prima_riga, $righe_per_pagina";

$result = mysql_query($query);
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}

$elenco_comuni = array();
while ($row = mysql_fetch_assoc($result)) {
    $elenco_comuni[] = $row;
}

// creazione dei link di paginazione
$link_paginazione = paginazione($tot_pagine, $url_base, $pagina_corrente, $pagine_vicine);

// carico il template HTML
include 'index.html';
?>

3 commenti

1 Roberta Roberta mercoledì 12 maggio 2010, ore 08:27
Ciao sto usando il tuo codice per fare la paginazione in un mio sito però ho dei problemi, non segnala nessun errore ma non compaiono i numeri linkabili di conseguenza non posso navigare tra le vaie pagine è come se non funzionasse la funzione paginazione eppure io ho fatto copia incolla del codice e l'ho adattato al mio sito cosa sbaglio?
2 Roberta Roberta mercoledì 12 maggio 2010, ore 09:47
nn metevo l'echo alla fine scusa tutto ok il codice è perfetto
3 stefana stefana sabato 15 gennaio 2011, ore 20:13
magnifico...funziona...solo una questione....se voglio limitare la paginazione solo a 30 records su 60 per esempio e che quindi nella visualizzazione vengono conteggiati solo i 30 ( a partire dal primo records...o anche nel caso si debba partire dal 10...a seconda dei dati che ho bisogno di visualizzare nella pagina) come devo fare???? quali parametri sono da correggere?????
Effettua l'accesso o registrati per inserire un commento