Paginazione PHP? Super semplice!

Preoccupati per impaginare i risultati del vostro sito? Oggi vi farò capire in poche frasi come funziona!

Come ben sapete (oppure no) le query al database hanno anche un LIMIT. E’ quello che useremo.

$query = mysql_query("SELECT * FROM annunci LIMIT 5,3);

Questa è una query base, dove estraiamo 3 annunci partendo dall’annuncio dopo il quinto (il sesto). Più semplice a farsi che a dirsi.

Situazione ipotetica:

Avete un sito di annunci e dovete dividere 10 annunci per ogni pagina e creare una numerazione automatica, quindi senza preoccuparvi di quanti annunci ci saranno o quante pagine avere… volete tutto automatico.

Ci serviranno poche variabili. Quella più importante è quella nell’url:

www.sito.it/pagina.php?p=1

dove “p” rappresenta la nostra pagina.

Poi ci servirà una variabile che indicherà quanti risultati vogliamo per pagina

$risperpag = 10; // I nostri 10 risultati per pagina che potrete cambiare

Siamo già a buon punto.
Ora mettiamo anche una parola inviata magari da un campo testo per la ricerca tra gli annunci:

www.sito.it/pagina.php?p=1&r=macbook

dove “r” sta per ricerca, quindi la parola che andremo a ricercare.

Ora che abbiamo tutti i valori necessari possiamo andare a calcolare il nostro LIMIT in un modo molto semplice (a volte ci si perde, come capitava a me, dietro questi numeri ma come vedrete è molto semplice).
Sappiamo il numero della pagina a cui siamo, il numero di annunci che vogliamo per ogni pagina. Quello che manca è il numero da cui visualizzare l’annuncio. Basterà moltiplicare la pagina attuale per il numero di risultati e poi togliere il numero dei risultati dal totale (e usarlo poi nella query):

// Numero LIMIT da inserire in query
$limit = $risperpag * $_GET['p'] - $risperpag;

// Mostrami i risultati dal $limit in poi per un massimo di $risperpag annunci
$query = mysql_query("SELECT * FROM annunci LIMIT ".$limit.",".$risperpag);

Vi siete persi? Abbiamo semplicemente riempito il limit con quello che ci serviva e il commento sopra la query spiega bene il tutto.

Che ci manca? Mettere la parola nella query e poi la paginazione. Partiamo dalla query:

// Mostrami i risultati dal $limit in poi per un massimo di $risperpag annunci dove
// il campo titolo contiene la parola nella URL, nel nostro caso macbook
$query = mysql_query("SELECT * FROM annunci WHERE titolo LIKE '%".$_GET['r']."%' LIMIT ".$limit.",".$risperpag);

E ora rapidamente la paginazione. E’ molto semplice da intuire cosa fare: un ciclo con i numeri dove il minimo di pagina è 1 e il massimo è numero di valori estratti tramite la query. Per questo però sarà necessario creare una query IDENTICA a quella appena mostrata, tuttavia andrà eliminato il LIMIT in quanto usando questo sistema i risultati saranno limitati mentre noi abbiamo bisogno di sapere il numero totale dei risultati.
Quello che faremo sarà creare una seconda query per sapere il numero totale di risultati:

// Mostrami i risultati totali per la paginazione (cambiamo nome alla variabile!)
$querytotale = mysql_query("SELECT * FROM annunci WHERE titolo LIKE '%".$_GET['r']."%'");

// Contiamo i risultati
$ristot = mysql_num_rows($querytotale);

// Creiamo il numero delle pagine necessarie
$npag = ceil($ristot / $risperpag);

Ora abbiamo “$ristot” che contiene il numero totale degli annunci trovati e il più importante “$npag” che, arrotondato in eccesso, ci dice di quante pagine abbiamo bisogno.
Dobbiamo impaginare il tutto ora ed è davvero semplice. Basterà fare dei semplici controlli:

<?
// Mettiamo per comodità la variabile GET p in una variabile
$p = $_GET['p'];
?>

<ul>
<?=($p!=1?'<li><a href="pagina.php?p='.($p-1).'&r='.urlencode($_GET['r']).'">← Indietro</a></li>':'')?>
<? for($i=1;$i<=$npag;$i++){

  if($p==$i){
    echo '<li class="pagina_attuale">'.$i.'</li>';
  }else{
    echo '<li><a href="pagina.php?p='.$p.'&r='.urlencode($_GET['r']).'">'.$i.'</a></li>';
  }

}
?>
<?=($p!=$npag?'<li><a href="pagina.php?p='.($p+1).'&r='.urlencode($_GET['r']).'">Avanti →</a></li>':'')?>
</ul>

Questo dovrebbe essere semplice: creiamo un loop di numeri, tanti quanti sono le pagine totali, e selezioniamo la pagina corrente con la classe “pagina_attuale”.
Quello che trovate sopra e sotto tale codice sono semplicemente il testo “Indietro” e “Avanti” che compare solo se ci sono pagine prima e/o dopo quella attuale (esempio alla pagina 1 non ci sarà il testo “indietro”).

In questo esempio ho messo una lista puntata. Non vi spiego come renderla orizzontale con CSS e potete sostituirla con semplice testo separato da spazi, sta a voi.

Per maggiore chiarezza generale vi posto tutto il codice:

<?
$risperpag = 10; // I nostri 10 risultati per pagina che potrete cambiare

// Numero LIMIT da inserire in query
$limit = $risperpag * $_GET['p'] - $risperpag;

// Mostrami i risultati dal $limit in poi per un massimo di $risperpag annunci dove
// il campo titolo contiene la parola nella URL, nel nostro caso macbook
$query = mysql_query("SELECT * FROM annunci WHERE titolo LIKE '%".$_GET['r']."%' LIMIT ".$limit.",".$risperpag);

// QUI ANDRANNO MOSTRATI I RISULTATI CON CICLO WHILE o quello che preferite
// ..
// ...

// Mostrami i risultati totali per la paginazione (cambiamo nome alla variabile!)
$querytotale = mysql_query("SELECT * FROM annunci WHERE titolo LIKE '%".$_GET['r']."%'");

// Contiamo i risultati
$ristot = mysql_num_rows($querytotale);

// Creiamo il numero delle pagine necessarie
$npag = ceil($ristot / $risperpag);

// Mettiamo per comodità la variabile GET p in una variabile
$p = $_GET['p'];
?>

<ul>
<?=($p!=1?'<li><a href="pagina.php?p='.($p-1).'&r='.urlencode($_GET['r']).'">← Indietro</a></li>':'')?>
<? for($i=1;$i<=$npag;$i++){

  if($p==$i){
    echo '<li class="pagina_attuale">'.$i.'</li>';
  }else{
    echo '<li><a href="pagina.php?p='.$p.'&r='.urlencode($_GET['r']).'">'.$i.'</a></li>';
  }

}
?>
<?=($p!=$npag?'<li><a href="pagina.php?p='.($p+1).'&r='.urlencode($_GET['r']).'">Avanti →</a></li>':'')?>
</ul>

Se avete dubbi chiedete pure. Mi sembra, se letto bene l’articolo, sia tutto abbastanza intuitivo. Se capite il procedimento capite tutto 🙂

Annunci

, , , , , , , ,

  1. #1 di Marco il 12/08/2013 - 14:11

    Cosa sarebbe $npag situata dentro il ciclo for?

    • #2 di portapipe il 12/08/2013 - 14:22

      Eh faccio questi articoli durante complessi progetti e a volte dimentico qualche pezzo. Ho aggiunto la variabile $npag, vedi se funziona così 🙂

      • #3 di Marco il 12/08/2013 - 15:39

        Grazie 😀 Comunque bisogna modificare “<? for($i=1;$i<=$npag;$i++){" in "<?php for($i=1;$i<=$npag;$i++){". Una domanda: se io ho solo 2 risultati da mostrare (quindi solo una pagina per vedere essi) visualizzo anche la scritta Avanti, mandandomi nella pagina 2 e non ottenendo nessun risultato da visualizzare

    • #4 di portapipe il 12/08/2013 - 15:44

      va modificata l’ultima linea:

      <?=($p!=$ristot?'...

      in:

      <?=($p!=$npag?'...

      Per quanto riguarda il "<?php" è una questione di compatibilità ma è uguale al "<?" e viceversa. Mi trovo meglio con "<?" ma ti consiglio di usare "<?php" così stai tranquillo 🙂

      • #5 di Marco il 12/08/2013 - 15:53

        Grazie mille. Funziona perfettamente 😉 Io se scrivo <? non lo riconosce come codice PHP. Sarà qualche impostazione di php.ini 😛

    • #6 di portapipe il 12/08/2013 - 15:56

      Come ti dicevo: compatibilità! 🙂 Occhio che lo short-tag è attivo da parecchie versioni di php. Ti conviene aggiornare la versione installata perché ti perdi molte cose e molti script e framework non ti funzioneranno!

      Se posso aiutarti in altro scrivi 🙂

      • #7 di Marco il 13/08/2013 - 23:18

        Ho fatto una modifica :P. Il codice è questo:

        <?=($p!=1?'«':'')?>
        <?php
        for($i=1;$i<=$npag;$i++){
        if($p==$i){
        echo ''.$i.'';
        }else{
        echo ''.$i.'';
        }
        }
        ?>
        <?=($p!=$npag?'»':'')?>

        Se visito la pagina utenti.php (quindi p=1), il link di ciascun è 1 perciò ho cambiato il codice in:
        <a href="utenti.php?p='.$i.'" rel="nofollow">'.$i.'</a>
        Al posto di Avanti → e ← Indietro però volevo la pagina che mi mostrasse i primi e ultimi risultati perciò ho modificato così:
        <?=($p!=1?'«':'')?>
        <?=($p!=$npag?'»':'')?>

    • #8 di portapipe il 14/08/2013 - 06:36

      Ottimo! Mi sembra tu sia sul pezzo. Una volta capito il meccanismo diventa quasi logica come cosa e puoi modificarla in ogni modo, aggiungendo immagini, mostrandoli a gruppi di 10.. insomma è un codice riutilizzabile in ogni occasione! 🙂
      I codici ti consiglio di postarli su http://www.pastebin.com (sono più leggibili e non devi nemmeno registrarti! 😉 )

  2. #9 di Angelo il 05/10/2014 - 08:52

    Ciao grazie x il codice.
    Ti volevo chiedere un consiglio, sul mio sito la paginazione arriva a 457, e mi ritrovo con 457 pulsantini sulla pagina! Come faccio a dirgli che se le pagine sono più di 10 di mettermi dei puntini (…)

    Esempio:
    INDIETRO – 1 – 2 – 3 – 4 – …. – 12 – 13 – 14 – 15 – AVANTI

    Grazie

    • #10 di portapipe il 05/10/2014 - 09:02

      Ciao 🙂
      In realtà non c’è un modo unico, pensa in modo logico e ci arriverai senza troppi problemi! Ad esempio:
      fai un controllo dalla pagina in cui sei rispetto a quelle totali, se sono più di 10, raggiunto il limite, stoppa il loop e metti una freccia per andare alla pagina finale. Puoi inoltre aggiungere un campo testo dove l’utente può inserire la pagina a cui andare senza dover cliccare decine di volte prima di arrivarci.
      Puoi creare anche un menu a tendina se sono effettivamente così tante, o una piccola finestra che scorre (con jQuery) e che contiene tutte le numerazioni ma in un piccolo spazio…
      Come vedi ce ne sono molte di soluzioni, pensa a quella più adatta al tuo caso 🙂 Buon lavoro!

      • #11 di Angelo il 05/10/2014 - 10:03

        L’ho modificato così ma ora mi vengono tanti pulsanti con i puntini:

        <?
        for($i=1;$i<=$npag;$i++){

        if($p$i+3){
        echo ‘…’;
        }elseif($p==$i){
        echo ”.$i.”;
        }else{
        echo ‘‘.$i.’‘;
        }

        }
        ?>

  3. #12 di Angelo il 05/10/2014 - 10:05

    postando il codice si sono cancellate delle parti, non’è quello che volevo farti vedere

  1. Ma dove vai se la paginazione non ce l’hai chiede web agency Umbertide – umbriawayamplifica

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: