[PHP] Dubbio "Pagina Seguente >"
[PHP] Dubbio "Pagina Seguente >" postato il 16/07/2011 21:49:13 nel forum programmazione, open source e hosting e modificato da wolfkiba94 il 16/07/2011 21:49:43
Hey ragazzi ciao a tutti ^^
Come al solito quando ho problemi mi rivolgo sempre a voi!
Come da titolo, ho bisogno di una mano con le pagine della bacheca, mi spiego.
Io ho un codice del genere:
<table width="50%" border="1" align="center">
<?php
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID";
$Result = mysql_query($MySql) or die (mysql_error());
while ($rs = mysql_fetch_array($Result)) {
echo "<tr><td><a href=Forum_Topic.php?ID=".$rs['ID']." target='_self'>".$rs['Titolo']."</a></td></tr>";
}
?>
</table>
Molto semplice, infatti è per fare alcune prove, ora vi spiego cosa vorrei. Vorrei che una volta che il ciclo mi ha stampato i primi 10 risultati, compaia una scritta che dice " Seguenti > " e che mi mostra poi i restanti Thread.
Se non sono stato chiaro sono pronto a ripetere tutto tutto. Grazie in anticipo ^^
Pagine → 1
16/07/2011 22:23:50
In pratica vuoi fare la paginazione dei thread. Ogni pagina con 10 thread.
è abbastanza semplice. Per prima cosa devi sapere che le query possono essere limitate a unu certo numero di risultati con la direttiva LIMIT. Per esempio:
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID LIMIT 10";
oppure
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID LIMIT 10,10";
Il primo esempio dice alla query di restituire solo i primi dieci risultati. Il secondo dice sempre di restituire 10 risultati, ma partendo dal numero 10, quindi ti mostrerà i thread da 10 a 19.
Come farlo in modo automatizzato per la tua pagina? è abbastanza semplice:
1_definisci una variabile che la pagina otterrà tramite richiesta GET, per esempio così:
$start=(int)$_GET['start'];
Fondamentale l'int davanti alla variabile, così se non è settata $start varrà automaticamente 0. $start può indicare o il numero di pagina oppure il thread da cui cominciare a visualizzare; io in genere la interpreto come il numero di pagina da visualizzare perciò la query viene modificata così
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID LIMIT ".($start*10).",10";
nella prima pagina start varrà 0, quindi si visualizzano i primi 10 elementi, nella seconda pagina $start vale 1 quindi vengono visualizzati i messaggi da 10 a 19, ecc.
E con la limitazione siamo a posto. Ci manca però l'indice delle pagine, altrimenti non riuscamo a navigare tra le pagine. L'indice si può fare in due modi:
_mettere solo un link che dice "Pagina successiva" e "Pagina precedente"
Farlo è semplice, ma ti manca 1 dato: il numero di thread totali. Quindi facciamo una query per trovarlo:
$MySql = "SELECT count(*) AS N FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID";
Adesso che hai tutti i dati che ti servono ti basterà ragionare un po' su come costruire i link, la pagina successiva avrà un link del tipo:
<a href="<?php echo $_SERVER['PHP_SELF']?>?start=<?php echo $start+1?>">Successiva</a>
mentre la precedente avrà lo stesso link ma con $start-1.
Stai solo attento a non andare oltre il range reale delle pagine. Non vogliamo che gli utenti possano linkare alla pagina -1 o alla pagina 3 quando i thread sono solo 4 XD
_oppure mettere proprio la lista della pagine per una navigazione più veloce se c'è bisogno di fare salti grandi. "1 | 2 | 3 | 4"
L'approccio è molto simile a quello spiegato sopra, ma dovrai fare un ciclo che stampa i link alle varie pagine partendo dalla 1 e arrivando alla pagina "$totale_thread/10" (assicurati di far eun cast a float per $totale_thread e approssimare correttamente per eccesso il risultato della divisione).
17/07/2011 01:37:12
Innanzitutto grazie mille leo per avermi risposto :-)
Mi è ancora un pò difficile entrare nella logica del tuo ragionamento anche se credo di poterci arrivare piano piano
Io ho elaborato questo con i tuoi codici, ma di sicuro sbaglio qualcosa per quanto riguarda il count(*) mh... 😖
Ti metto solo la parte interessata...
<body bgcolor="#000000">
<table width="50%" border="1" align="center">
<?php
$start=(int)$_GET['start'];
$MySql = "SELECT count(*) AS N FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID";
mysql_query($MySql) or die (mysql_error());
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID LIMIT ".($start*10).",10";
$Result = mysql_query($MySql) or die (mysql_error());
while ($rs = mysql_fetch_array($Result)) {
echo "<tr><td><a href=Forum_Topic.php?ID=".$rs['ID']." target='_self'>".$rs['Titolo']."</a></td></tr>";
}
?>
</table>
<a href="Forum_Thread.php?start=<?php echo $start+1; ?>" target="_self">Successiva</a>
</body>
</html>
Scusa per eventuali errori "raccapriccianti" 😊
P.s: Grazie ancora!!! 😄
17/07/2011 02:56:30
eheh, ok.
Allora immagino che il risultato che vedi sulla tua pagina sia corretto. Se tu avessi 12 thread nel tuo forum probabilmente ne vedresti solo 10.
Ora, la query con il conteggio va eseguita dopo, dopo che hai chiuso la table. Perchè quella serve solo per aiutarci a navigare tra le pagine del forum. E soprattutto dopo che la esegui...devi anche andare a prenderlo il risultato che restituisce XD altrimenti è inutile.
Diciamo che non ho molta voglia di scrivere il codice per la versione che stampa i numeri della pagine. Quindi ti scrivo quella con i link "Pagina Successiva" e "Pagina precedente".
<body bgcolor="#000000">
<table width="50%" border="1" align="center">
<?php
$start=(int)$_GET['start'];
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID LIMIT ".($start*10).",10";
$Result = mysql_query($MySql) or die (mysql_error());
while ($rs = mysql_fetch_array($Result)) {
echo "<tr><td><a href=Forum_Topic.php?ID=".$rs['ID']." target='_self'>".$rs['Titolo']."</a></td></tr>";
}
?>
</table>
<?php
$MySql = "SELECT count(*) AS N FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID";
$result=mysql_query($MySql) or die (mysql_error());
$rs=mysql_fetch_array($result);
//Calcoliamo il numero di pagine totali:
$tot=ceil((float)$rs['N']/10);
if($start>0)
echo '<a href="Forum_Thread.php?start='.($start-1).'" target="_self">Pagina Precedente</a>';
if($start<$tot)
echo ' <a href="Forum_Thread.php?start='.($start+1).'" target="_self">Pagina Successiva</a>';
?>
</body>
</html>
Prova così
17/07/2011 13:08:07 e modificato da wolfkiba94 il 17/07/2011 14:00:21
Stranamente mi restituisce questo errore:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY ID LIMIT 10,10' at line 1
E' strano cosa vuol dire? Insomma non accetta l'ORDER BY ID LIMIT? Ma se prima andava benissimo!
😖
EDIT: se ti può essere utile, L'URL che mi restituisce quando clicco su "Pagina Successiva" è questo: /Forum_Thread.php?start=1
Inoltre ti dico già da ora, che nel database ho creato 13 Thread e nella prima pagina ne vedo correttamente 10 come da codice ^^
Il problema vien fuori quando clicco sul link che mi stampa quel Sql error!
EDIT 2 : Non è che per caso lui non avendo piu l?ID del thread non sa da dove prendere i Risultati??
Se vedi io per prendere i risultati dal database utilizzo una variabile Get chiamta ID e nel link di pagina successiva quest'ultima non c'è ....mh
EDIT 3: xD credo di aver risolto infatti funge, devo però fare altri test u.u ho aggiunto un "&" dopo la variabile ID ovvero "Forum_Thread?ID=$IDThread&star+1 ecc.." insomma due variabili get!
Ora però ho un problema o.o, il primo Pagina successivo mi fà vedere i thread restanti che sono 3 ( 10 li o visti nella prima pagina poi clicco su pagina successiva e vedo gli ultimi tre) e mi compare anche correttamente il link Pagina precedente, il problema è che mi resta anche il bottone Pagina successiva che mi porta ad una pagina senza Thread dove si visualizza solo il link "Pagina Precedente" xD che casinO!
17/07/2011 15:21:58 e modificato da leoblacksoul il 17/07/2011 15:22:47
esatto, il problema era che non avendo incluso nel codice iniziale la tua variabile GET IDThread io non sapevo cosa fosse e non l'ho messa.
L'errore dei link è il tipico errore di offset di 1 XD Colpa del fatto che si inizia a contare da 0.
basta cambiare la condizione dell'ultimo if:
if($start<$tot-1)
17/07/2011 16:21:09 e modificato da wolfkiba94 il 17/07/2011 16:21:35
Benissimo leo! Funziona alla perfezione. Ti ringrazio di cuore per la tua solita pazienza 😊
Ti faccio solo un ultimissima domanda, nel caso io volessi che invece di 10 Thread me ne visualizzasse 20, dove devo modificare il numero? Nel $tot o nell order by ID ecc..?
Qui:
$MySql = "SELECT * FROM Forum_Thread WHERE ID =".$IDThread." ORDER BY ID LIMIT ".($start*10).",10";
Oppure qui?
$tot=ceil((float)$rs['N']/10);
17/07/2011 20:27:22
Entrambi. Tutti i 10 devono diventare il numero di thread che vuoi che venga visualizzato.
Volendo puoi inserire questo numero in una variabile a parte, così non devi stare a modificare tutti i punti ma solo il valore di una variabile
17/07/2011 20:30:45
D'accordo! Grazie tante, tante, tante taaante Leo. PROBLEMA RISOLTO!
😅
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Project Entropy ↗
AlterEgo ↗
RAID Shadow Legends ↗
Cafuné ↗
Neverness to Everness ↗
War Thunder ↗
World of Warship ↗
The Coven ↗