luigi7 (Normal User)
Pro
Messaggi: 83
Iscritto: 28/06/2011
|
Salve, ho un problema che non mi riesce ad risolvere di una classe che crea la paginazione..
il problema che se io manualmente metto:
http://localhost/nomesito/index.php?m=news&pagina=%
il simbolo %
mi salta fuori:
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 '-1, 1' at line 1
Questa è la classe:
Codice sorgente - presumibilmente Delphi |
<?php 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); //Pagina di inizio // 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; } } } ?>
|
non riesco ad mettere il controllo alla paginazione che ho trovato su internet..
il controllo per far che non venga passato altri dati testuali che non siano numeri.
ha scordavo la paginazione si usa cosi:
Codice sorgente - presumibilmente Php |
$strSQL = "SELECT news_sezioni.strNome as strNomeSezione , news.* FROM news INNER JOIN news_sezioni ON news_sezioni.intSezioneID = news.intSezioneID"; $pag = new Paginazione($strSQL,$cfg_news_per_page_admin, "pagina");
|
mi dite come posso fare?.
grazie mille. |
|
luigi7 (Normal User)
Pro
Messaggi: 83
Iscritto: 28/06/2011
|
esempio della classe:
Codice sorgente - presumibilmente Php |
<?php 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 news", 1, "pagina"); // restituisce un array multi-dimensionale con i record if($record = $pag->Show()) { foreach($record as $row) { echo $row['intNewsID'] . "<br />"; } } else { echo "Nessun Record Trovato!"; } // restituisce i link alle pagine if($link = $pag->Link(3)) { ?> <a href="?pagina=<?=$link['first']?>">«</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']?>">»</a> <?php } ?>
|
però se si fa pagina?id=% salta fuori l'errore?
come mai?
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
uhm la classe non è di tua creazione e a prima vista sembra fatta piuttosto malino, comunque se non vuoi tornare a crearla da 0 di tuo pugno come controllo puoi aggiungere un semplice controllo con esperessioni regolari preg_match("/^[0-9]+$/", $pagina) se non conosci il funzionamento di preg_match è molto semplice, se il pattern viene rispettato da $pagina restituisce true se no false
Ti puo andare?
|
|
Qwertj (Dev Team)
Guru
Messaggi: 678
Iscritto: 30/05/2011
|
Codice sorgente - presumibilmente PHP |
// pagina corrente sia get che post $this->cpage = (isset($_REQUEST[$varq])) ? (int )$_REQUEST[$varq] : 1;
|
Questo restituisce zero, perchè se casti una stringa che non è numerica a un tipo numerico, PHP restituisce zero
Codice sorgente - presumibilmente PHP |
// inizio record $inizio = $xpage * ($this->cpage - 1);
|
E questo setta $inizio a -1
Insieme al fatto che MySQL non vuole numeri negativi nelle clausole LIMIT, ta-dah, syntax error
Basta che cambi
Codice sorgente - presumibilmente PHP |
// pagina corrente sia get che post $this->cpage = (isset($_REQUEST[$varq])) ? (int )$_REQUEST[$varq] : 1;
|
con
Codice sorgente - presumibilmente PHP |
// pagina corrente sia get che post $this->cpage = (int)$_REQUEST[$varq] > 0 ? (int)$_REQUEST[$varq] : 1;
|
P.S.: Invece che passare il nome del campo, non sarebbe più furbo passargli direttamente il valore? (invece di "pagina", $_GET['pagina']) |
|
luigi7 (Normal User)
Pro
Messaggi: 83
Iscritto: 28/06/2011
|
Postato originariamente da Roby94:
uhm la classe non è di tua creazione e a prima vista sembra fatta piuttosto malino, comunque se non vuoi tornare a crearla da 0 di tuo pugno come controllo puoi aggiungere un semplice controllo con esperessioni regolari preg_match("/^[0-9]+$/", $pagina) se non conosci il funzionamento di preg_match è molto semplice, se il pattern viene rispettato da $pagina restituisce true se no false
Ti puo andare? |
si hai ragione non è mia ma lo presa da qui:
www.sv-design.org/blog/php-mysql-paginazione-dati/
e non mi sono mai accorto di questo problema..
ora ho provato la soluzione di Qwertj e sembra funzionare..
però quando entro nella pagina mi da:
Undefined index: pagina in D:\xampp\htdocs\cms\classes\paginazione.inc.php on line 20
dove lui ha fatto la modifica..
mi dite come risolvere il problema?
grazie mille .. vi ringrazio moltissimo..
saluti,
buona notte. |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Postato originariamente da luigi7:
però quando entro nella pagina mi da:
Undefined index: pagina in D:\xampp\htdocs\cms\classes\paginazione.inc.php on line 20
|
Questo errore si presenta perche la variabile request non presenta la chiave pagina, quandi quando l'url è senza ?pagina=X, fai un piccolo controllo prima sulla variabile GET e puoi evitare quasto errore.
Pero come dice Qwertj dovresti rivedere un po quella classe perche ha molti non sensi o codice inutile, lavoraci un po ;-) |
|
luigi7 (Normal User)
Pro
Messaggi: 83
Iscritto: 28/06/2011
|
hai ragione .. ma non ho mai lavorato con le classi..
e non so come fare il controllo su "pagina" ...essendo che non esiste il $_GET["pagina"];
mi dici come fare?
ti ringrazio moltissimo.
buona notte.
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
eeeehhh dipende da cosa vuoi che venga stampato quando pagina non è prensente. Io farei cosi:
Codice sorgente - presumibilmente PHP |
[CODE] if(isset($_GET["pagina"])) { //se c'è pagina allora creo Paginazione ecc } else { //se no stampo un messaggio del tipo nessuna news selezionata } [/CODE]
|
ovvio che poi devi scegliere te come far comportare lo script
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
eeeehhh dipende da cosa vuoi che venga stampato quando pagina non è prensente. Io farei cosi:
Codice sorgente - presumibilmente PHP |
[CODE] if(isset($_GET["pagina"])) { //se c'è pagina allora creo Paginazione ecc } else { //se no stampo un messaggio del tipo nessuna news selezionata } [/CODE]
|
ovvio che poi devi scegliere te come far comportare lo script
|
|