Tutorial PHP

Home | Tutorial PHP | Art. # 83

Paginazione con PHP e MySQL

Corso online PHP
Corso online per imparare il PHP da zero ed creare siti Web dinamici. Assistenza del docente ed attestato di partecipazione finale.

Il sistema della paginazione consiste nel mostrare un certo numero di risultati di una query per pagina a partire da "pagina 1", muovendosi poi verso "pagina 2", "pagina 3" e cosi via; il suo scopo è sia quello di risparmiare risorse del database (essendo una query su centinaia o migliaia di record molto dispendiosa da gestire), sia per diminuire i tempi di caricamento di una pagina, sia per generare un numero superiore di pagine viste.

Affrontiamo dunque la paginazione con PHP e MySQL.

Si crei un database con le seguenti caratteristiche:

Server:   nome_server
Username: username
Password: password
Database: nome_database
Tabella:  nome_tabella
Campo:    nome_campo (Varchar 50)
Naturalmente è possibile creare il database sul proprio server MySQL, sfruttando le proprie credenziali per l'accesso; si popoli poi la tabella con una serie di dati di prove, generando almeno una ventina di record in modo che, effettuando una paginazione per 5 record, compaiano almeno 4 o 5 pagine d navigare.

Appena tutto pronto, creare il file paginazione.php e corredarlo del seguente codice PHP:

<?
    $cn = mysql_connect("nome_server", "username", "password");
    mysql_select_db("nome_database", $cn);

    $pag = $_GET["pag"];
    if (isset($pag) == false || is_numeric($pag) == false || $pag < 1)
    {
        $pag = 1;
    }

    $fine = 5;
    $inizio = ($pag - 1) * $fine;

    $sql = "SELECT * FROM nome_tabella LIMIT " . $inizio . ", " . $fine;

    $query = mysql_query($sql, $cn);
    $quanti = mysql_num_rows($query);

    if ($quanti == 0)
    {
        echo "Nessun record!";
    }
    else
    {
        for($x=0; $x<$quanti; $x++)
        {
            $rs = mysql_fetch_row($query);
            $nome_campo = $rs[0];
?>

<p><?echo $nome_campo;?></p>

<?
        }
    }

    $query = mysql_query("SELECT * FROM nome_tabella", $cn);
    $quanti = mysql_num_rows($query);

    $intero = $quanti / $fine;
?>

<p>Pagina <?echo $pag;?> di <?echo $intero;?></p>

<p>

<?
    for($x=1; $x<$intero+1; $x++)
    {
        if ($x == $pag)
        {
?>

<b><?echo $x;?></b> |

<?
        }
        else
        {
?>

<a href="paginazione.php?pag=<?echo $x;?>"><?echo $x;?></a> |

<?
        }
    }

?>

</p>

<?
    mysql_close($cn);
?>

Il codice è apparentemente complesso ma in realtà è davvero semplice.

Il cuore dello script nasce dall'utilizzo dell'istruzione LIMIT di MySQL, il cui scopo è quello di limitare il numero di record estratti dalla query, solo che, pagina per pagina, i valori da passare a LIMIT come inizio e fine della limitazione dobbiamo calcolarli dinamicamente.

La prima cosa da fare è recuperare in querystring il numero di pagina e lo facciamo memorizzandolo in una variabile e controllando che sia numerico o comunque valorizzato, altrimenti lo valorizziamo per default come "pagina 1":

$pag = $_GET["pag"];
if (isset($pag) == false || is_numeric($pag) == false || $pag < 1)
{
    $pag = 1;
}

A questo punto impostiamo l'inizio e la fine della limitazione della query:

$fine = 5; // Numero di record da mostrare per pagina
$inizio = ($pag - 1) * $fine;

Non ci resta che scrivere la query:

$sql = "SELECT * FROM nome_tabella LIMIT " . $inizio . ", " . $fine;

La paginazione è fatta ma non finisce qui: dobbiamo creare il menu di navigazione tra le pagine, in modo da consentire all'utente di spostarsi tra le varie pagine e visualizzare gli altri record.

Dopo aver rieseguito la query ed aver ricontato il numero totale di record, stavolta per intero senza il LIMIT, eseguiamo un semplice calcolo per individuare il numero totale di pagine entro cui navigare i record e lo facciamo con un semplicissimo calcolo:

$intero = $quanti / $fine;

A questo punto eseguiamo un ciclo e, sulla scorta del contatore del ciclo stesso, creiamo dinamicamente i link verso tutte le pagine, controllando il numero di pagina corrente onde non linkarla.

 

Scritto in data 22/04/2008

Segnalalo ad un Amico | Aggiungilo ai Preferiti


© 2008 Appunti PHP - A cura di Luca Ruggiero - Partita IVA 05564851219 - Pubblicità | Contatti