Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
PHP - problema paginazione dati
Forum - PHP - problema paginazione dati

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
luigi7 (Normal User)
Pro


Messaggi: 83
Iscritto: 28/06/2011

Segnala al moderatore
Postato alle 21:56
Venerdì, 14/09/2012
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

  1. <?php
  2.     class Paginazione
  3.     {
  4.         private $xpage = 0;
  5.         private $tot = 0;
  6.         private $varq = "";
  7.         private $totpag = 0;
  8.         private $cpage = 0;
  9.         private $query = "";
  10.         private $record = array();
  11.    
  12.         public function Paginazione($query, $xpage, $varq)
  13.         {
  14.             // le rendo globali
  15.             $this->xpage = $xpage;
  16.             $this->varq = $varq;
  17.             $this->query = trim($query);
  18.            
  19.             // pagina corrente sia get che post
  20.             $this->cpage = (isset($_REQUEST[$varq])) ? (int)$_REQUEST[$varq] : 1;
  21.            
  22.             // inizio record
  23.             $inizio = $xpage * ($this->cpage - 1);
  24.            
  25.             // eseguo la query per contare i record
  26.             $ct = mysql_query($this->query) or die(mysql_error());
  27.            
  28.             // record totali
  29.             $this->tot = mysql_num_rows($ct);
  30.            
  31.             // se ci sono record
  32.             if($this->tot > 0)
  33.             {
  34.                 // pagine totali
  35.                 $this->totpag = ceil($this->tot / $xpage);
  36.                
  37.                 //Pagina di inizio
  38.            
  39.                
  40.                
  41.                
  42.                 // scrivo ed eseguo la query mirata
  43.                 $target = " LIMIT " . $inizio . ", " . $xpage;
  44.                 $ex = mysql_query($this->query . $target) or die(mysql_error());
  45.                
  46.                 while($ft = mysql_fetch_array($ex, MYSQL_ASSOC))
  47.                 {
  48.                     $record[] = $ft;
  49.                 }
  50.                
  51.                 $this->record = $record;
  52.             }
  53.             else
  54.             {
  55.                 $this->record = array();
  56.             }
  57.         }
  58.        
  59.         public function Show()
  60.         {
  61.             if(count($this->record) > 0)
  62.             {
  63.                 return $this->record;
  64.             }
  65.             else
  66.             {
  67.                 return false;
  68.             }
  69.            
  70.         }
  71.        
  72.         public function Link($nlink = 4)
  73.         {
  74.             $before = array();
  75.             $after = array();
  76.            
  77.             if($this->cpage < $nlink)
  78.             {
  79.                 $nlink *= 2;
  80.                 $nlink -= ($this->cpage - 1);
  81.             }
  82.             elseif($this->cpage > ($this->totpag - $nlink))
  83.             {
  84.                 $nlink *= 2;
  85.                 $nlink -= ($this->totpag - $this->cpage);
  86.             }
  87.            
  88.            
  89.            
  90.             for($i = $nlink; $i>=1; $i--)
  91.             {
  92.                 if(($this->cpage - $i) >= 1)
  93.                 {
  94.                     $before[] = $this->cpage - $i;
  95.                 }
  96.             }
  97.            
  98.             for($i = 1; $i<=$nlink; $i++)
  99.             {
  100.                 if(($this->cpage + $i) <= $this->totpag)
  101.                 {
  102.                     $after[] = $this->cpage + $i;
  103.                 }
  104.                
  105.                 if($this->cpage == $nlink)
  106.                     $nlink += 1;
  107.             }
  108.            
  109.             $link["first"] = 1;
  110.             $link["before"] = $before;
  111.             $link["current"] = $this->cpage;
  112.             $link["after"] = $after;
  113.             $link["last"] = $this->totpag;
  114.            
  115.             if($this->cpage <= $this->totpag && $this->totpag > 1)
  116.             {
  117.                 return $link;
  118.             }
  119.             else
  120.             {
  121.                 return false;
  122.             }
  123.         }
  124.     }
  125. ?>



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

  1. $strSQL = "SELECT  news_sezioni.strNome as strNomeSezione , news.* FROM news INNER JOIN news_sezioni ON news_sezioni.intSezioneID = news.intSezioneID";
  2.     $pag = new Paginazione($strSQL,$cfg_news_per_page_admin, "pagina");



mi dite come posso fare?.
grazie mille.

PM Quote
Avatar
luigi7 (Normal User)
Pro


Messaggi: 83
Iscritto: 28/06/2011

Segnala al moderatore
Postato alle 22:23
Venerdì, 14/09/2012
esempio della classe:

Codice sorgente - presumibilmente Php

  1. <?php
  2.         $conn = mysql_connect("localhost", "root", "");
  3.         $db = mysql_select_db("luigiamo72253");
  4.        
  5.         require_once("libs/paginazione.inc.php");
  6.        
  7.         // classe di paginazione (query, numero di record per pagina, nome variabile di pagina da leggere)
  8.         $pag = new Paginazione("SELECT * FROM news", 1, "pagina");
  9.        
  10.         // restituisce un array multi-dimensionale con i record
  11.         if($record = $pag->Show())
  12.         {
  13.                 foreach($record as $row)
  14.                 {
  15.                         echo $row['intNewsID'] . "<br />";
  16.                 }
  17.         }
  18.         else
  19.         {
  20.                 echo "Nessun Record Trovato!";
  21.         }
  22.        
  23.         // restituisce i link alle pagine
  24.         if($link = $pag->Link(3))
  25.         {
  26.                 ?>
  27.                 <a href="?pagina=<?=$link['first']?>">«</a> <?php
  28.                         foreach($link['before'] as $bf)
  29.                         {
  30.                                 ?><a href="?pagina=<?=$bf?>"><?=$bf?></a> <?php
  31.                         }
  32.                         ?><?=$link['current']?> <?php
  33.                         foreach($link['after'] as $at)
  34.                         {
  35.                                 ?><a href="?pagina=<?=$at?>"><?=$at?></a> <?php
  36.                         }
  37.                 ?><a href="?pagina=<?=$link['last']?>">»</a>
  38.                 <?php
  39.         }
  40.        
  41.  
  42. ?>



però se si fa pagina?id=% salta fuori l'errore?
come mai?

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 22:50
Venerdì, 14/09/2012
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?

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 22:54
Venerdì, 14/09/2012
Codice sorgente - presumibilmente PHP

  1. // pagina corrente sia get che post
  2. $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

  1. // inizio record
  2. $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

  1. // pagina corrente sia get che post
  2. $this->cpage = (isset($_REQUEST[$varq])) ? (int)$_REQUEST[$varq] : 1;


con
Codice sorgente - presumibilmente PHP

  1. // pagina corrente sia get che post
  2. $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'])

PM Quote
Avatar
luigi7 (Normal User)
Pro


Messaggi: 83
Iscritto: 28/06/2011

Segnala al moderatore
Postato alle 23:00
Venerdì, 14/09/2012
Testo quotato

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.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 23:05
Venerdì, 14/09/2012
Testo quotato

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 ;-)

PM Quote
Avatar
luigi7 (Normal User)
Pro


Messaggi: 83
Iscritto: 28/06/2011

Segnala al moderatore
Postato alle 23:12
Venerdì, 14/09/2012
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.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 23:17
Venerdì, 14/09/2012
eeeehhh dipende da cosa vuoi che venga stampato quando pagina non è prensente. Io farei cosi:
Codice sorgente - presumibilmente PHP

  1. [CODE]
  2. if(isset($_GET["pagina"])) {
  3. //se c'è pagina allora creo Paginazione ecc
  4. } else {
  5. //se no stampo un messaggio del tipo nessuna news selezionata
  6. }
  7. [/CODE]


ovvio che poi devi scegliere te come far comportare lo script

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 23:17
Venerdì, 14/09/2012
eeeehhh dipende da cosa vuoi che venga stampato quando pagina non è prensente. Io farei cosi:
Codice sorgente - presumibilmente PHP

  1. [CODE]
  2. if(isset($_GET["pagina"])) {
  3. //se c'è pagina allora creo Paginazione ecc
  4. } else {
  5. //se no stampo un messaggio del tipo nessuna news selezionata
  6. }
  7. [/CODE]


ovvio che poi devi scegliere te come far comportare lo script

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo