L'ultimo articolo scritto su Sir Bit risale a marzo 2014. La versione che state visitando è un archivio: le pagine sono accessibili come sempre e gli autori potrebbero rispondere ai commenti, ma non saranno inseriti dei nuovi articoli. Visita questa pagina per i dettagli.

Paginazione – Suddividere i record di due query in una stessa pagina

Abbiamo visto, in un altro articolo, come fare a suddividere i risultati di una query su più pagine: in pratica la classica numerazione di pagina che permette, cliccando su un numero, di “cambiare pagina” e di caricare quindi i successivi tot record.
Il procedimento è abbastanza semplice e si tratta di lavorare sul parametro limit delle query mysql. In ogni caso, alla pagina linkata troverete uno script già pronto da scaricare.

Può capitare, però, di dover fare i conti con due query diverse, i cui record di entrambe devono essere suddivisi nella stessa pagina.
Facciamo un esempio. Nella pagina abbiamo due riquadri da gestire. Il riquadro superiore contiene l’elenco degli utenti, il riquadro inferiore contiene l’elenco di prodotti. Come vedete si tratta di due riquadri completamente distinti, ma se l’utente per esempio si trova alla terza pagina degli utenti e preme sulla quinta pagina dei prodotti, si dovrebbero aggiornare unicamente i prodotti, mentre la stampa degli utenti dovrebbe rimanere intoccata alla seconda pagina.

Qui sotto trovate uno script per gestire situazioni simili, che potete scaricare liberamente. Il codice è pensato per gestire un numero imprecisato di query, affiancandovi semplicemente un suffisso con numerazione progressiva.
I commenti dovrebbero spiegare con chiarezza ogni passaggio; per le basi, comunque, fate riferimento all’articolo linkato sopra.

Download script

Prima di tutto diamo un’occhiata alla funzione che si occuperà di stampare i numeri di pagina.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
/*** Funzione per dividere le pagine in base al record $cont = conteggio dei valori da inserire $pagina = indirizzo base della pagina (comprensivo di get, ma non quelli della paginazione) $inizio = primo record estratto della query $values = record stampati per pagina $suff = suffisso da applicare alla chiave get (utile in caso di richiami multipli della funzione nella stessa pagina) ***/
function LinkCreator($cont, $pagina, $inizio=0, $values=10, $suff=""){

	for($x=0, $y=0; $x<$cont; $x+=$values, $y++){
		if($inizio<$pag){
			if($x<($inizio+$pag))
				if($x!=$inizio)
					echo "<a href='".$pagina."in".$suff."=".$x."'>".($y+1)."</a>";
				else
					echo "<a class='link_sel'>".($y+1)."</a>";
			else{
				if( $x < $cont )
					echo "<a href='".$pagina."in".$suff."=".($x)."' class='next'>&gt;</a>";
				else
					echo "<a href='".$pagina."in".$suff."=".($x-$values)."' class='prev'>&lt;</a>";
				break;
			}	

		}else{
			if($x==($inizio-$pag)){
				echo "<a href='".$pagina."in".$suff."=";
				if(($x-($pag-$values)) <0 ) echo 0;
				else echo ($x-($pag-$values));
				echo "' class='prev'>&lt;</a>"; }
			if($x==($inizio+$pag)){
				echo "<a href='".$pagina."in".$suff."=";
				if(($x+($pag-$values))>$cont)	echo $cont-($cont%10);
				else	echo $x+($pag-$values);
				echo "' class='next'>&gt;</a>"; }
			if($x>($inizio-$pag) && $x<($inizio+$pag)){
				if($x!=$inizio)
					if($x>$cont)
						echo "<a href='".$pagina."in".$suff."=".($cont%$values)."'>".($y+1)."</a>";
					else
						echo "<a href='".$pagina."in".$suff."=".$x."'>".($y+1)."</a>";
				else
					echo "<a class='link_sel'>".($y+1)."</a>";
			} // chiusura if($x>($inizio-$pag) && $x<($inizio+$pag)){
		} // else prima di if($x==($inizio-$pag)){
	}

}

Ecco invece la stampa dei record delle due query (in pratica i due “riquadri” dell’esempio):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
//link di base per la pagina: comprende tutti i get, ma non quelli della paginazione
$link_get="http://www.sito.it?id=1";

//parametri base per la paginazione della prima query
$per_pagina=1;
if(isset($_GET['in']))
	$inizio=$_GET['in'];
else
	$inizio=0;

//parametri base per la paginazione della seconda query
$per_pagina2=1;
if(isset($_GET['in2']))
	$inizio2=$_GET['in2'];
else
	$inizio2=0;

/*** PRIMA QUERY ***/

$query="SELECT * FROM tabella";
$result=mysql_query($query, DB);
$num=mysql_num_rows($result);

if($num>0){

	//ripetizione della query con il limit
	$query.=" LIMIT $inizio, $per_pagina";
	$result=mysql_query($query, DB);

	while($row=mysql_fetch_array($result)){

		//Stampa dei record

	}?>

	<!-- Stampa link di paginazione per la prima query -->
	<div class="paginazione">
	<?php
	//aggiungo il get della paginazione della seconda query
	$pagina_con_get=$link_get;
	if(isset($_GET['in2']))
		$pagina_con_get.="in2=".$_GET['in2']."&";

	LinkCreator($num, $pagina_con_get, $inizio, $per_pagina);?>
	</div>
	<div class="clear"></div>

<?php }?>

<?php
/*** SECONDA QUERY ***/

$query2="SELECT * FROM tabella2";
$result2=mysql_query($query2, DB);
$num2=mysql_num_rows($result2);

if($num2>0){

	//ripetizione della query con il limit
	$query2.=" LIMIT $inizio2, $per_pagina2";
	$result2=mysql_query($query2, DB);

	while($row_utente=mysql_fetch_array($result_utente)){

		//Stampa dei record

	}?>

	<!-- Stampa link di paginazione per la prima query -->
	<div class="paginazione">
	<?php
	//aggiungo il get della paginazione della prima query
	$pagina_con_get=$link_get;
	if(isset($_GET['in']))
		$pagina_con_get.="in=".$_GET['in']."&";
	LinkCreator($num2, $pagina_con_get, $inizio2, $per_pagina2, "2");?>
	</div>
	<div class="clear"></div>

<?php }?>
Etichette
Etichette:, ,
Ultimi Commenti
  1. Max
  2. Max

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.