[PHP-MySQL]: Paginazione dati


Salve a tutti,

Quest’oggi volevo proporvi una classe PHP/MySQL che ho appena creato, ovvero una classe che permette la paginazione dei dati estratti dal database…

La particolarità di questa classe è l’estrema semplicità di utilizzo, e la piena compatibilità che permette d essere adattata a qualsiasi skin!

Iniziamo col creare un file php e copiamo al suo interno il seguente codice:


	class Paginazione
	{
		private $xpage = 0;
		private $tot = 0;
		private $varq = "";
		private $totpag = 0;
		private $cpage = 0;
		private $query = "";
		private $record = array();

		public function Paginazione($query, $xpage, $varq)
		{
			// le rendo globali
			$this->xpage = $xpage;
			$this->varq = $varq;
			$this->query = trim($query);

			// pagina corrente sia get che post
			$this->cpage = (isset($_REQUEST[$varq])) ? (int)$_REQUEST[$varq] : 1;

			// inizio record
			$inizio = $xpage * ($this->cpage - 1);

			// eseguo la query per contare i record
			$ct = mysql_query($this->query) or die(mysql_error());

			// record totali
			$this->tot = mysql_num_rows($ct);

			// se ci sono record
			if($this->tot > 0)
			{
				// pagine totali
				$this->totpag = ceil($this->tot / $xpage);

				// scrivo ed eseguo la query mirata
				$target = " LIMIT " . $inizio . ", " . $xpage;
				$ex = mysql_query($this->query . $target) or die(mysql_error());

				while($ft = mysql_fetch_array($ex, MYSQL_ASSOC))
				{
					$record[] = $ft;
				}

				$this->record = $record;
			}
			else
			{
				$this->record = array();
			}
		}

		public function Show()
		{
			if(count($this->record) > 0)
			{
				return $this->record;
			}
			else
			{
				return false;
			}

		}

		public function Link($nlink = 4)
		{
			$before = array();
			$after = array();

			if($this->cpage < $nlink)
			{
				$nlink *= 2;
				$nlink -= ($this->cpage - 1);
			}
			elseif($this->cpage > ($this->totpag - $nlink))
			{
				$nlink *= 2;
				$nlink -= ($this->totpag - $this->cpage);
			}

			for($i = $nlink; $i>=1; $i--)
			{
				if(($this->cpage - $i) >= 1)
				{
					$before[] = $this->cpage - $i;
				}
			}

			for($i = 1; $i< =$nlink; $i++)
			{
				if(($this->cpage + $i) < = $this->totpag)
				{
					$after[] = $this->cpage + $i;
				}

				if($this->cpage == $nlink)
					$nlink += 1;
			}

			$link["first"] = 1;
			$link["before"] = $before;
			$link["current"] = $this->cpage;
			$link["after"] = $after;
			$link["last"] = $this->totpag;

			if($this->cpage < = $this->totpag && $this->totpag > 1)
			{
				return $link;
			}
			else
			{
				return false;
			}
		}
	}

Salviamo il file, e creiamo un file di esempio in cui utilizzeremo la classe.

Inizieremo con l’includere la classe appena salvata, ed istanziarla:

	require_once("libs/paginazione.inc.php");

	// classe di paginazione (query, numero di record per pagina, nome variabile di pagina da leggere)
	$pag = new Paginazione("SELECT * FROM wp_posts", 10, "pagina");

Spieghiamo il codice:

Abbiamo incluso la classe con un require_once e la abbiamo istanziata nella variabile $pag tramite la funzione “Paginazione” passando come parametri:

La query da eseguire nel db (facendo attenzione a non inserire il comando LIMIT che verrà eseguito automaticamente per la paginazione).

Il numero di record da visualizzare in ogni pagina.

Il nome della variabile dal quale leggere la pagina (ad esempio file.php?pagina=2 … nel nostro caso abbiamo usato “pagina”. Inoltre volevo precisare che la variabile viene letta sia in GET che in POST, il che ci permette di usare la classe sia con form, sia con ajax o con un normale GET)

Dopo-di-ché passiamo ad estrarre i dati appena richiesti alla classe con il codice:

// restituisce un array multi-dimensionale con i record
	if($record = $pag->Show())
	{
		foreach($record as $row)
		{
			echo $row['ID'] . "<br />";
		}
	}
	else
	{
		echo "Nessun Record Trovato!";
	}

Ecco spiegato il codice:

Mettiamo nella variabile $record, il risultato della query da noi eseguita tramite la funzione “Show()”

La funzione restituirà un valore booleano che ci permetterà di capire se esistono dei dati oppure no.

Dopo-di-ché con un foreach estraggo i vari record come una semplice “mysql_fetch_array”

Ora non ci resta che andare a creare il menu di navigazione tra le pagine.

Per fare ciò possiamo usare questo codice:

// restituisce i link alle pagine
	if($link = $pag->Link(3))
	{
		?>
		<a href="?pagina=<?=$link['first']?>">&laquo;</a> < ?php
			foreach($link['before'] as $bf)
			{
				?><a href="?pagina=<?=$bf?>">< ?=$bf?></a> < ?php
			}
			?>< ?=$link['current']?> < ?php
			foreach($link['after'] as $at)
			{
				?><a href="?pagina=<?=$at?>">< ?=$at?></a> < ?php
			}
		?><a href="?pagina=<?=$link['last']?>">&raquo;</a>
		< ?php
	}

Spieghiamo il codice:

Inserisco in $link, i numeri delle pagine per il menu di navigazione. La funzione accetta un solo parametro numerico che indicherà il numero di pagine da visualizzare a sinistra e a destra della pagina corrente, nel menu di navigazione… esempio: in questo caso abbiamo Link(3) il risultato sarà un menu che avrà 3 pagine + la corrente + le altre 3 pagine dopo… per farvi capire meglio faccio un esempio pratico del menu che uscirà fuori:

1 2 3 4 5 6 7 (dove 4 è la pagina corrente)

Inoltre c’è una particolarità in questo sistema, che lo distingue dagli altri più comuni, ovvero:

Prendendo il caso di prima, che succederebbe se la pagina corrente fosse la N° 1? Semplicemente avremmo un menu del tipo:

1 2 3 4

quindi un menu più piccolo e non più composto da 7 pagine (corrente compresa)…

Questa classe in questo caso invece, permette di ottenere un menu di questo genere:

1 2 3 4 5 6 7

ovvero: le 3 pagine che dovrebbero stare a sinistra, siccome non esistono passano a destra in modo che il menu sia sempre formato da 7 elementi!!!

Tornando al codice prima inserito, anche questa funzione ritornerà un valore booleano che ci permetterà di mostrare il menu solo se i record sono più di quelli visualizzabili per pagina

Nella variabile $link diventato ormai array multidimensionale, troveremo i seguenti dati:

$link[‘first’] = La prima pagina

$link[‘before’] = Un array contenente tutte le pagine mostrate prima della pagina corrente

$link[‘current’] = La pagina corrente

$link[‘after’] = Un array contenente tutte le pagine mostrate dopo la pagina corrente

$link[‘last’] = L’ultima pagina

Scaricare tutti i file della classe: Paginazione



13 Commenti

  1. bing ha detto:

    I needed to create you the little observation so as to thank you very much the moment again for the pleasant pointers you’ve featured in this article. This has been really remarkably open-handed of people like you to present freely what a few individuals could possibly have supplied as an e-book in making some dough on their own, and in particular considering the fact that you could possibly have tried it in the event you wanted. These creative ideas additionally worked to provide a easy way to be aware that other individuals have the identical fervor similar to my very own to grasp much more with regard to this condition. I am sure there are some more pleasurable opportunities ahead for folks who take a look at your blog.

  2. giorgionetg ha detto:

    Ciao, volevo porre l’attenzione su l’elemento $_REQUEST.. Che richiama non solo gli array $_GET e $_POST, ma anche $_SESSION, $_SERVER ed infine $_COOKIE… Quindi se avete i nomi array similari tra Get, Post, Cookie, Session e Server si incasina tutto… Cioè, vi ritrovate un dato che magari è della sessione o di un cookie.. Quindi attenzione! 🙂

    Ciaoo ^^

  3. Matteo ha detto:

    ciao!

    una classe stupenda

    ho solo un piccolo(si fa per dire eheh) problema: quando clicco su i numeri di paginazione mi scrive"nessun record" come se non tenesse più conto della query.

    Ti scrivo il mio codice:

    // classe di paginazione (query, numero di record per pagina, nome variabile di pagina da leggere)

    $pag = new Paginazione("SELECT * FROM articoli WHERE genere = '$id_genere' AND id_classificazioni = 'p'", 2, "pagina");

    // restituisce un array multi-dimensionale con i record

    if($record = $pag->Show())

    {

    foreach($record as $row)

    {

    echo $row['genere'] . "";

    }

    }

    else

    { echo "Nessun Record Trovato!";

    }

    // restituisce i link alle pagine

    if($link = $pag->Link(3))

    {

    ?>

    « »

    <?php

    }

  4. StefanoV ha detto:

    Ciao Matteo,
    niente paura hai solo dimenticato un pezzo di codice…

    infatti dentro il blocco condizionale vanno inseriti i foreach che restituiscono il numero di pagina, nel codice ke mi hai postato mancano i riferimenti a questi numeri nei link…

    Prova a copiare direttamente il mio esempio e poi modificalo passo passo 😉

  5. StefanoV ha detto:

    Paolo puoi scrivermi la query che usi?

  6. Paolo ha detto:

    salve ho trovato il suo lavoro molto interssante…
    solo che ho un problema: il prima risultato è ok però poi quando vado a cliccare sui link per procedere in avanti o indietro ho un errore: “Errore di sintassi nella query SQL vicino a ‘-10, 10’ linea 1″… cosa puo essere??

  7. StefanoV ha detto:

    Mandami una mail a: info sv-design org

  8. luca ha detto:

    MA COME FACCIO A INVIARTI GLI ALLEGATI? DOMANI TI SPEIGO TUTTO. CUIAO

  9. StefanoV ha detto:

    Mi dovresti dire ke errore ti mostra, e il tuo codice completo… magari anke via email… la classe è testata accuratamente, e funziona perfettamente! 😉

  10. luca ha detto:

    La classe paginazione non funziona bene, in quanto non appaiono i numeri di pagina dei link, e mi dà errore alla linea 1 quando clicco su >> e <<. Ne avrei bisogno…

  11. StefanoV ha detto:

    Ciao, sono contento che ti sia piaciuta la mia classe php!! 😉

    Hi, I'm happy that you like my php class! 😉

  12. Miguel ha detto:

    Non parlo italiano ho usato Google Translate.

    Credo che questa classe è grande! Ho trovato su phpclasses.org. Ho voluto far sapere Ho modificato la tua classe e scrivere nel mio blog, è che va bene con te?

    Ho anche messo un link al vostro sito e per il tuo profilo phpclass.org.

  13. […] Il link dell’articolo è:        [PHP-MySQL]: Paginazione dati […]

Lascia un commento

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