- Home
- Categorie
- Coding e Sistemistica
- Coding
- Domanda impaginazione PHP
-
Domanda impaginazione PHP
Salve,
sto lavorando a uno script di impaginazione in PHP. Il suo scopo è dividere gli elementi in un database MySQL in modo che ne vengano visualizzati solo un certo numero per pagine (definito dalla variabile $limit). Per fare questo si basa sugli ID degli elementi. Ovvero partendo da ID 1 farà vedere ID 1,2,3 (ipotizzando un limite di 3 a pagina). Cliccando su avanti passerà a 3,4,5 e indietro di nuovo a 1,2,3.Il codice:
[php]
if(!$_GET["lasid"])
{
$_GET["lasid"]=0;
}
$fid=$_GET["lasid"];
//state == 1 vuol dire che deve tornare indietro
if($_GET["state"] == 1)
{
for($fids=0; $fids < $limit; $fids++, $fid-1)
{
$ids = "id='" . $fid . "' or <br />" ;
print $ids;}
}
//state==2 vuol dire che deve andare avanti
if($_GET["state"] == 2)
{
for($fids=0; $fids < $limit; $fids++, $fid++)
{
if($fid == 0)
{
$fid++;
}
$ids = "id='" . $fid . "' or " ;
print $ids;}[/php]appena caricata la pagina $ids ha il valore: "id='1' or id='2' or id='3' or"
cliccando su avanti:
id='4' or id='5' or id='6' or
ma cliccando poi su indietro invece di tornare a 1,2,3 diventa:
id='7' or id='8' or id='9' or
continua a salire nonostante gli abbia detto di scendere!
Qualcuno sa aiutarmi?
Se vi servono altre parti del codice non esitate a chiedere
-
Ciao,
intanto qui
[PHP]
for($fids=0; $fids < $limit; $fids++, $fid-1)
[/PHP]
non fai alcun decremento della variabile $fid
dovrebbe essere
[PHP]
for($fids=0; $fids < $limit; $fids++, $fid--)
[/PHP]Questo errore però non spiega il fatto che la variabile continui ad incrementare... sei sicuro che quando fai "indietro" gli passi
state=1?
-
Ho modificato un po' il codice...:
[php]
$fid=$_GET["lasid"];
if(!$fid)
{
$fid=1;
}
$state=$_GET["state"];
if(!$state)
{
$state = 2;
}if($state == 1)
{
for($fids=0; $fids < $limit; $fids++, $fid--)
{
$ids = "id='" . $fid . "' or" ;
print $ids;}
}
elseif($state == 2)
{
for($fids=0; $fids < $limit; $fids++, $fid++)
{
if($fid == 0)
{
$fid++;
}
$ids = "id='" . $fid . "' or " ;
print $ids;}
}[/php]$fid parte da avere valore:id='1' or id='2' or id='3' or
cliccando su next ha valore
id='4' or id='5' or id='6' or
cliccando poi suo previous:
id='7' orid='6' orid='5' or
oltre che facendo impazzire tutto lo script
-
Forse è meglio che posti il resto del codice...
-
[php]
<?php
session_start();
require('config.php');
require('title.php');
include('header.php');
?>
<body bgcolor="<?php print $background; ?>"><?php
//defines number of pages needed
$limit=3;
$query=mysql_query("SELECT * FROM news") or die ("Query error: " . mysql_error());
$num=mysql_num_rows($query);
$nump=$num/$limit;if(isset($_GET["p"]))
{
$p=$_GET["p"];
}
else
{
$p=1;
}
if($p <= 0)
{
$p=1;
}if($p == ceil($nump) and $p == 1)
{
print "One page for all articles?";
}
//end of defining
$fid=$_GET["lasid"];
if(!$fid)
{
$fid=1;
}
$state=$_GET["state"];
if(!$state)
{
$state = 2;
}if($state == 1)
{
for($fids=0; $fids < $limit; $fids++, $fid--)
{
$ids = "id='" . $fid . "' or" ;
print $ids;}
}
elseif($state == 2)
{
for($fids=0; $fids < $limit; $fids++, $fid++)
{
if($fid == 0)
{
$fid++;
}
$ids = "id='" . $fid . "' or " ;
print $ids;}
}
//prima di tutto aggiustare questa query!
$sql=mysql_query("SELECT * FROM news WHERE " . $ids . " id='' ORDER BY time Desc LIMIT " . $limit . " ") or die ("Query error: " . mysql_error());print'
<center>
<table border="1">
<tr>
<td width="300">
<center>
<b>Title</b>
</center>
</td>
<td width="300">
<center>
<b>Author</b>
</center>
</td>
<td width="300">
<center>
<b>Date</b>
</center>
</td>
</tr>
</table>
<table border="1">
';
while($fetch=mysql_fetch_array($sql))
{
$id=$fetch['id'];
$time=$fetch['time'];
print '
<tr>
<td width="300">';
print"<center><a href='comment.php?com=com&id=$id' STYLE='text-decoration: none'>" . $fetch['title'] . "</a></center>";
print'</td>
<td width="300">
<center>' . $fetch['puser'] . '</center>
</rd>
<td width="300">
<center>' . $fetch['time'] . '</center>
</td>
</tr>
';
}
print '</table>';
$lasid=$fid;
$np = $p+1;
$op = $p-1;
?>
<br />
<a href="<?php $php_self ?>?p=<?php print $op; ?>&lasid=<?php print $lasid; ?>&state=1"><< Previous</a><?php
for($s=1; $s <= $nump; $s++)
{
if($s == $p)
{
print "<b>[</b>" . $s . "<b>]</b>";
}
else
{
print $s;
}
}
?><a href="<?php $php_self ?>?p=<?php print $np; ?>&lasid=<?php print $lasid; ?>&state=2">Next >></a>
<br />
<br />
<?
include('footer.php');
?>[/php]
-
Ciao,
credo questa sia una delle peggiori paginazione che si possano realizzare e ti consiglio di cabiare decisamente strada perchè, oltre a dover far funzionare questo script che presenta alcuni problemi nei due cicli for che usi per andare "avanti" e "indietro", ti creerà problemi ben maggiori quando, per un qualsiasi motivo, dovrai cancellare un record dal database e non avrai più ID sequenziali, ma ti ritroverai uno o più "buchi".Riguardo al tuo script, come ho scritto prima, il problema è causato dalla gestione dei cicli for.
Questo ad esempio
[PHP]
for($fids=0; $fids < $limit; $fids++, $fid++)
[/PHP]
il ciclo termina quando $fids sarà uguale a $limit, ma quando ciò avverrà, $fid sarà stato anc'esso incrementato di un ulteriore valore.
Lo stesso discorso vale per l'altro ciclo for in cui $fid viene decrementata.Oltre a questo, non vedo alcun controllo su $fid che gli impedisca di assumere valori negativi o di superare il numero massimo di elementi.
Rinnovo il consiglio di abbandonare questa via e di seguirne un altra:
MySql ti mette a disposizione una comoda opzione:
LIMITAd esempio
SELECT * FROM tabella LIMITI 10,3
ti fornirà i risultati 10,11,12... che non significa qeulli di ID 10,11 o 12, ma esattamente il decimo, l'undicesimo e il dodicesimo. In questo modo non dovrai preoccuparti di avere "buchi" di ID dovuti a cancellazioni di record
Alessandro
-
Ciao, effettivamente è stato il mio primo tentativo di riuscire a fare qualcosa... conosci mica dei siti dove posso trovare dei tutorial?
-
Cercando con google "tutorial paginazione php" ne puoi trovare diversi.
Ti posto il codice che solitamente utilizzo io.
[PHP]
<?php ### Funzione javascript per salto pagina ### ?>
<script type="text/javascript">
function vaiPag()
{
n=document.getElementById("pagN").value;
window.location="nome_pagina.php?p="+parseInt(n);
}
</script><?php
Numero di elementi per pagina
define("N_DATI_PAG",20);
$query="SELECT count(*) FROM tabella";
$num=mysql_fetch_row(mysql_query($query));Calcolo numero massimo pagine
$maxPag=max(1,ceil($num[0]/N_DATI_PAG));
Calcolo pagina corrente
$pag=isset($_GET['p'])?intval($_GET['p']):1;
$pag=max(1,min($pag,$maxPag));Pulsanti navigazione
?>
<?php ### Vai alla prima pagina ### ?> <a href="nome_pagina.php?p=1">|<</a> <?php ### Pagina precedente ### ?> <a href="nome_pagina.php?p=<?php echo max(1,$pag-1) ?>"><<</a> <?php ### Pagina corrente ### ?> Pag <?php echo $pag ?>/<?php echo $maxPag ?> <?php ### Pagina successiva ### ?> <a href="nome_pagina.php?p=<?php echo min($maxPag,$pag+1) ?>">>></a> <?php ### Vai all'ultima pagina ### ?> <a href="nome_pagina.php?p=<?php echo $maxPag ?>">>|</a> <?php ### Vai a pagina N ### ?> <input type="text" id="pagN" style="width:30px" /> <a href="javascript:vaiPag();">Vai a pag</a>
<?php
Selezione elementi della pagina
$query="SELECT * FROM tabella LIMIT ".(($pag-1)*N_DATI_PAG).",".N_DATI_PAG;
$result=mysql_query($query);
while ($res=mysql_fetch_array($result))
{
### Visualizzazione dati ###
}
?>
[/PHP]Alessandro
-
OK proverò a fare qualcosa di simile
Grazie per l'aiuto