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'>></a>"; else echo "<a href='".$pagina."in".$suff."=".($x-$values)."' class='prev'><</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'><</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'>></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 }?> |
Salve, io dovrei integrare la paginazione nel seguente script. Ho utilizzato il suo ezsempio ma senza successo. Non ho un’ottima conoscenza php. Potrebbe aiutarmi?
Grazie e complimenti per i suoi articoli molto interessanti:
Ecco lo script:
<?php
session_start();
//COLLEGO IL DATABASE
include 'connessione/connessione.php';
//RECUPERO LA VARIABILE GET
$pagina = htmlspecialchars(addslashes($_GET["prezzo"]));
//INCLUDO HEADER DELLA PAGINA
include 'header.php';
//QUERY PER CONTARE LE RIGHE
$sql_cerca = mysql_query("SELECT *, MATCH(title, description) AGAINST('+$pagina' IN BOOLEAN MODE) AS attinenza FROM prodotti WHERE MATCH(title, description) AGAINST('+$pagina' IN BOOLEAN MODE) ORDER BY attinenza");
//trovati
$trovati = mysql_num_rows($sql_cerca);
//STAMPO I RISULTATI OTTENUTI IN NUMERO
echo "Risultati della tua ricerca $trovati risultati per $pagina”;
//QUERY PER ESTRARRE I RISULTATI CON LIMIT
$sql_cerca = mysql_query(“SELECT *, MATCH(title, description) AGAINST(‘+$pagina’ IN BOOLEAN MODE) AS attinenza FROM prodotti WHERE MATCH(title, description) AGAINST(‘+$pagina’ IN BOOLEAN MODE) ORDER BY attinenza DESC LIMIT 50″);
$trovati = mysql_num_rows($sql_cerca);
//SE CI SONO RISULTATI STAMPA A VIDEO
if($trovati > 0)
{
while($row = mysql_fetch_array($sql_cerca)) {
$id = $row[‘id’];
$title = $row[‘title’];
$image = $row[‘image’];
$link = $row[‘link’];
$prezzo = $row[‘prezzo’];
$logo = $row[‘logo’];
echo ”
$title $id
Euro $prezzo
In vendita su
Accedi ai dettagli
“;
} //fine LOOP valori trovati
} //fine risultati if
else{ //se non ci sono risultati
// notifica in caso di mancanza di risultati
echo “Al momento non ci sono risultati corrispondenti.”;
}//fine else
?>
Salve Max,
questo articolo si occupa di due paginazioni per pagina ed è leggermente complesso.
Provi a dare un’occhiata a questo articolo.
Il concetto è che, dopo aver recuperato il numero totale dei prodotti (nel suo caso la variabile $trovati), si deve rifare la query limitandola al numero di prodotti per pagina.
Seguendo l’esempio, comunque, non dovrebbe incontrare grossi problemi.
Grazie mille per la dritta e ancora omplimenti per i suoi articoli 🙂
Di niente, piacere di essere stato utile 🙂