Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Paginazione dinamica dei dati estratti dal db

    Da tempo utilizzo la paginazione creata da guidoz ma ultimamente non sapendo che fare mi sono cimentato anche io nello sviluppo di una classe che svolge la stessa funzione, in modo un po' diverso però..non ho avuto modo di fare molti test, può darsi che sfruttandola come si deve esce fuori qualche limitazione, se avete tempo dategli un'occhiata

    Allo stato attuale la libreria può funzionare con guestbook, gestione news e simili, non può suddividere, ad esempio, un articolo in più pagine.

    A differenza delle paginazioni più comuni viene eseguita soltanto una query, senza l'utilizzo di LIMIT, successivamente i dati vengono racchiusi in un array multidimensionale e con un ciclo for ordinati e suddivisi in pagine.

    La limitazione potrebbe stare proprio qui, nel caso in cui la query comporti l'estrazione di una grande quantità di dati penso che lo script potrebbe essere più lento rispetto agli altri, non so dirvi però se questa differenza di velocità si noterebbe oppure no, che dite?

    Un altro dubbio che ho riguarda la dimensione che può avere un array, ci sono limitazioni? perchè i dati estratti dal db sono racchiusi tutti li!

    Vi riporto il codice:

    Codice PHP:
    <?php

    class paginazione {
     
     var 
    $query;
     var 
    $exeQuery;
     var 
    $records;
     var 
    $eachChgPag;
     var 
    $getData = array();
     var 
    $allData;
     var 
    $pagine;
     var 
    $getVar;
     var 
    $showPag;
     var 
    $keepPag = array();
     var 
    $startPage;
     var 
    $numLinkstoPag//Numero di links alle pagine
        
        
    function paginazione($query$eachChgPag$getVar$startPage$numLinkstoPag) {
            
        
    $this->query $query
        
    $this->exeQuery $exeQuery;
        
    $this->records $records;
        
    $this->eachChgPag $eachChgPag;
        
    $this->getData $getData;
        
    $this->allData $allData;
        
    $this->pagine $pagine;
        
    $this->getVar $getVar;
        
    $this->showPag $showPag;
        
    $this->kepPag $keepPag;
        
    $this->numLinkstoPag $numLinkstoPag;
        
    ##Se non è settata la variabile della pagina $_GET[pagina] visualizzo i risultati della pagina 1
        
    if(($this->getVar[pagina] == "") || $this->getVar[pagina] <= "1") {
            
        
    $this->getVar $startPage;    
            
        }
            
        }

        function 
    contaRecords() {
        
        
    ##Eseguo la query che mi viene passata tramite la funzione paginazione    
        
    $this->exeQuery mysql_query($this->query);
        
    ##Conto i records restituiti
        
    $this->records mysql_num_rows($this->exeQuery);
        
        return 
    $this->records;     
            
        }

        function 
    dataMatrix() {
        
        
    ##Scorro con un ciclo i records e li associo ad un array    
        
    while($this->allData mysql_fetch_assoc($this->exeQuery)) {
        
        
    ##Racchiudo gli array con i dati di ogni record dentro ad un altro array
        
    $this->getData[] = $this->allData;    
        
        }

        return 
    $this->getData;

        }

        
    ##Funzione per disabilitare le freccette destre quando si arriva all'ultima pagina
        
    function dxDisabled($pagLeft) {
         
         
    $this->pagLeft $pagLeft;
            
         
    $this->leftArrow "<a href=\"$_SERVER[PHP_SELF]?pagina=1\">&lt;&lt;</a> 
                              <a href=\"
    $_SERVER[PHP_SELF]?pagina=$this->pagLeft\">&lt;</a>";
    ##Frecce destre disabilitate (senza link)    
         
    $this->rightArrow "&gt;&gt;&gt;";    
            
        }
        
        
    ##Funzione per disabilitare le freccette sinistre quando si arriva alla prima pagina
        
    function sxDisabled($pagRight) {
         
         
    $this->pagRight $pagRight;
        
    ##Frecce sinistre disabilitate (senza link)    
         
    $this->leftArrow "&lt;&lt;&lt;";    
         
    $this->rightArrow "<a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagRight\">&gt;</a>
                               <a href=\"
    $_SERVER[PHP_SELF]?pagina=$this->pagine\">&gt;&gt;</a>";    
            
        }
        
        
    ##Nessuna freccia disabilitata
        
    function unDisabled($pagRight$pagLeft) {
         
         
    $this->pagRight $pagRight;
         
    $this->pagLeft $pagLeft;
            
         
    $this->leftArrow "<a href=\"$_SERVER[PHP_SELF]?pagina=1\">&lt;&lt;</a> 
                              <a href=\"
    $_SERVER[PHP_SELF]?pagina=$this->pagLeft\">&lt;</a>";    
         
    $this->rightArrow "<a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagRight\">&gt;</a>
                               <a href=\"
    $_SERVER[PHP_SELF]?pagina=$this->pagine\">&gt;&gt;</a>";    
            
        }

        function 
    linkToPag() {
        
        
    ##Calcolo il numero di pagine in base ai records totali e al numero di records che         
        ##voglio visualizzare, valore passatomi dalla funzione paginazione
        
    $this->pagine ceil($this->records $this->eachChgPag);
        
        
    ##Inizio un ciclo che durerà tanto quante son le pagine
        
    for($i=1;$i<=$this->pagine;$i++) {
        
                  
    ##Se $i è minore o uguale al numero di pagine continuo il ciclo
         
    if($i <= $this->numLinkstoPag) {
         
           
    ##Controllo la pagina selezionata che dovrà essere senza link
           
    if($i == $this->getVar[pagina]) {
            
            
    ##Associo il numero pagina senza link e la racchiudo in un array
            
    $this->keepPag[] = "$i";
            
           } else {
         
            
    ##Associo un link al numero pagina e la racchiudo in un array
            
    $this->keepPag[] = "<a href=\"$_SERVER[PHP_SELF]?pagina=$i\">$i</a>";
         
           }
        
         } 
         
         
    ##Calcolo la pagina precedente (per freccetta)    
         
    $this->pagLeft $this->getVar[pagina] - 1;
         
    ##Calcolo la pagina successiva (per freccetta)
         
    $this->pagRight $this->getVar[pagina] + 1;
         
         
    ##Controllo se è necessario disabilitare le freccette destre
         
    if($this->getVar[pagina] == $this->pagine) {
         
         
    ##Disabilito le freccette destre
         
    $this->dxDisabled($this->pagLeft);        
        
         
    ##Controllo se è necessario disabilitare le freccette sinistre        
         
    } elseif($this->getVar[pagina] <= "1") {
        
         
    ##Disabilito le freccette sinistre
         
    $this->sxDisabled($this->pagRight);     
        
         } else {
         
         
    ##Non disabilito alcuna freccetta    
         
    $this->unDisabled($this->pagRight$this->pagLeft);
                 
         }
         
        }

        
    ##Utilizzo la funzione implode per mostrare i link in modo ordinato con un separatore -
        ##Tutto questo per non ottenere una cosa tipo (1 - 2 - 3 -) ma per avere (1 - 2 - 3)
        
    $this->showPag "".$this->leftArrow." ".implode(" - "$this->keepPag)." ".$this->rightArrow." Pagina corrente: ".$this->getVar[pagina]."";
        
        return 
    $this->showPag;    
            
        }
    ?>

    Questa è la "mente" della libreria, il codice è commentato se qualcosa non si capisce fatemi sapere.
    Salvo questo codice in una pagina chiamata ad ex.: paginazione.class.inc.php

    Adesso vi spiego come utilizzare la libreria, prima di tutto includete il file della paginazione nel vostro script:

    Codice PHP:
    include("paginazione.class.inc.php"); 
    Specificate il percorso corretto se salvate il file libreria in una cartella diversa da quella in cui è salvato il vostro script.

    Adesso create una variabile chiamata $query contenente appunto la query per la selezione dei dati, ad esempio:

    Codice PHP:
    $query "SELECT * FROM tabella ORDER BY id DESC; 
    Poi è necessario creare un oggetto e richiamare le funzioni della libreria:

    Codice PHP:
    $pg = new paginazione($query'1'$_GET[pagina], '1''10');

    $pg->contaRecords();
    $pg->dataMatrix();
    $pg->linkToPag(); 
    I valori tra parentesi in ordine da sinistra verso destra corrispondono a:

    1 - La query.
    2 - Il numero di records da visualizzare in ogni pagina.
    3 - Numero pagina corrente / cliccata.
    4 - Pagina di partenza (impostare a 1).
    5 - Numero di link alle pagine.

    Nel momento in cui utilizzate la libreria vi verranno visualizzati i link alle pagine in questo modo:

    << < 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 > >>

    10 numeri perchè nell'esempio è utilizzato il numero 10, se inserissimo 5 avremmo:

    << < 1 - 2 - 3 - 4 - 5 > >>

    E sarà possibile selezionale le pagine superiori a quelle visualizzate semplicemente cliccando sulle freccine. La freccina singola aumenta o diminuisce la pagina corrente di 1, la freccina doppia porta alla prima o all'ultima pagina.

    Ora all'interno del vostro script createvi una funzione con un nome a piacimento, io la chiamerò showResults e inseriteci il codice seguente:

    Codice PHP:
    function showResults($tabella) {

    ##$pg varia in base al nome che avete assegnato all'oggetto - vale anche per le righe sottostanti

    global $pg;
        
        
    ##Le due righe seguenti mi servono per calcolare qual è il record di partenza da 
        ##visualizzare in ogni singola pagina    
        
    $pg->refArray $pg->getVar[pagina] * $pg->eachChgPag;
        
    $pg->refArray $pg->refArray $pg->eachChgPag;
        
        
    $j $pg->refArray;
        
                 
    ##inizio un ciclio per mostrare i records
        
    for($i=1;$i<=$pg->eachChgPag;$i++) {
        
            if(
    $pg->getData[$j] != "") {
         
            
    ##Qui dobbiamo inserire la riga della nostra tabella (con i dati del database) che verrà generata dal ciclo for
                             
    $tabella;
              
              
    $j++;
        
            }    
         
        }    
        return 
    $tabella;

    Di seguito inserirò il codice completo con un esempio al posto del commento.

    Arrivati a questo punto vi create una tabella html per organizzare i dati estratti dal db, ad esempio:

    Codice PHP:

    $tabella 
    "<table border=\"1\"  cellspacing=\"0\" cellpadding=\"3\">";
    $tabella .= "<tr>";
    $tabella .= "<td>Icona:</td>";
    $tabella .= "<td>News:</td>";
    $tabella .= "<td>Data:</td>";
    $tabella .= "<td>Autore:</td>";
    $tabella .= "</tr>"
    Subito dopo richiamate la funzione showResults e gli passate la tabella che avete creato:

    Codice PHP:
    showResults($tabella); 
    Infine visualizzate i link alle pagine:

    Codice PHP:
    echo $pg->showPag
    Di seguito il codice completo, per rendere tutto più chiaro:

    Codice PHP:
    <?php

    include("paginazione.class.inc.php");

    $query "SELECT * FROM news ORDER BY news_id DESC";

    $pg = new paginazione($query'3'$_GET[pagina], '1''3');

    $pg->contaRecords();
    $pg->dataMatrix();
    $pg->linkToPag();


    function 
    showResults($tabella) {

    ##$pg varia in base al nome che avete assegnato all'oggetto - vale anche per le righe sottostanti

    global $pg;
            
        
    $pg->refArray $pg->getVar[pagina] * $pg->eachChgPag;
        
    $pg->refArray $pg->refArray $pg->eachChgPag;
        
        
    $j $pg->refArray;
        
        for(
    $i=1;$i<=$pg->eachChgPag;$i++) {
        
            if(
    $pg->getData[$j] != "") {
         
            
    $tabella .= "<tr>";
            
    $tabella .= "<td> ".$pg->getData[$j][icona]." </td>";
            
    $tabella .= "<td> ".$pg->getData[$j][news]." </td>";
            
    $tabella .= "<td> ".$pg->getData[$j][data]." </td>";
            
    $tabella .= "<td> ".$pg->getData[$j][autore]." </td>";
            
    $tabella .= "</tr>";
              
              
    $j++;
        
            }    
         
        } 
     
             
    $tabella .= "</table>
    "
    ;

             return 
    $tabella;
        
    }


    $tabella "<table border=\"1\"  cellspacing=\"0\" cellpadding=\"3\">";
    $tabella .= "<tr>";
    $tabella .= "<td>Icona:</td>";
    $tabella .= "<td>News:</td>";
    $tabella .= "<td>Data:</td>";
    $tabella .= "<td>Autore:</td>";
    $tabella .= "</tr>";

    echo 
    showResults($tabella);
    echo 
    $pg->showPag;

    ?>
    Sarà possibile richiamare i dati del db utilizzando l'array $pg->getData.
    Tale array dovrà avere la seguente forma: $pg->getData[$j][nome_campo_tabella]

    In questo esempio infatti aggiungiamo una riga di tabella con i dati del db inserendo questo codice nel ciclo for:


    Codice PHP:

    $tabella 
    .= "<tr>";
    $tabella .= "<td> ".$pg->getData[$j][icona]." </td>";
    $tabella .= "<td> ".$pg->getData[$j][news]." </td>";
    $tabella .= "<td> ".$pg->getData[$j][data]." </td>";
    $tabella .= "<td> ".$pg->getData[$j][autore]." </td>";
    $tabella .= "</tr>"

    icona, news, data, autore corrispndono ai campi della tabella presente nel db.

    Che ne pensate? osservazioni, suggerimenti, critiche?

    Spero di non aver fatto errori riadattandola ad esempio, fatemi sapere se avete problemi o non vi è chiaro qualcosa.


  2. #2

  3. #3
    Spero di non aver fatto errori riadattandola ad esempio, fatemi sapere se avete problemi o non vi è chiaro qualcosa.
    ciao, non sono certo il più adatto a segnalare cose che non vanno, visto che sono un neofita di PHP... ma secondo me le variabili $pageLeft e $pageRight sono un po' ballerine come le "bocce" del tuo simpatico avatar...


    ...infatti ho provato il tuo script e a me non funzia... a me sembra che quelle variabili, così, non sono definite... magari (anzi senz'altro) sono io che ho fatto pasticci...

    comunque lo trovo interessante e molto semplice... se mi funzionasse sarebbe ancora meglio...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.