Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536

    paginazione dati complessa

    Ciao a tutti.

    Mi sono accorto che c'è un problema nella ricerca dei documenti relativa a un progetto che avevo sviluppato tempo fa

    In pratica la prima pagina risulta esatta, ma se voglio visualizzare il resto dei risultati della stessa query mi ritrovo con tutti i dati del db.

    Per capirci, in un altra pagina (quella con il modulo di selezione) seleziono un cliente (posso scegliere i documenti anche in base ad un certo intervallo di tempo..ma non è importante adesso) e visualizzo inviando le variabili al codice della pagina sotto i risultati che interessano; ad esempio per il cliente Tal dei tali ci sono 6 fatture, la pagina dovrebbe visualizzare un elenco con i dati dei primi 5 (ho impostato l'intervallo così per prova) e nella successiva seconda pagina (pag2) il rimanente documento. Ok?

    Ecco se clicco su pagina 2 mi ritrovo con parte di tutti gli altri documenti di tutti i clienti ( come si avessi fatto una query che dovrebbe restituirmi tutto quello che c'è nel db).

    Codice PHP:
    ....

    else {

    include("dati.php");
    $link=mysql_connect("$db_host","$db_login","$db_pass")
    or die ("Non riesco a connettermi a [b]$db_host");

    mysql_select_db ($database, $link)
    or die ("Non riesco a selezionare il db $database
    ");

    if (($_REQUEST['clie']=="")&&($_REQUEST['firstinput']=="")&&($_REQUEST['secondinput']==""))
       {
    $tutto = "SELECT * FROM fatture ORDER BY data";
         }
         
          elseif (($_REQUEST['clie']!="")&&($_REQUEST['firstinput']=="")&&($_REQUEST['secondinput']==""))
         {
        $tutto = "SELECT * FROM fatture where id_cliente = '".$_REQUEST['clie']."' ORDER BY data";
         }
        
         elseif (($_REQUEST['clie']!="")&&($_REQUEST['firstinput']!="")&&($_REQUEST['secondinput']==""))
         {
         list($giorno,$mese,$anno) = split("/",$_REQUEST['firstinput']);
         $datain = mktime(0,0,0,$mese,$giorno,$anno);
         $tutto = "SELECT * FROM fatture where id_cliente = '".$_REQUEST['clie']."' and data >= '".$datain."' ORDER BY data";
         }
        
          
      .........//ci sono altre condizioni qui               

    $righe_per_pagina = 5;
    if (!isset($_REQUEST['pagina'])) $pagina = 1;
    else {
        if ($_REQUEST['pagina'] <= 0) $pagina = 1;
        else $pagina = $_REQUEST['pagina'];
        }
        
    global $pagina, $righe_per_pagina;
        
    $query = mysql_query ($tutto,$link)
    or die ("Non riesco ad eseguire la richiesta $tutto");
    $totr=mysql_num_rows($query);

    // arrotonda al numero intero + alto
        $numero_pagine = ceil($totr/$righe_per_pagina);
        
    // calcola il numero della pagina corrente
        $pagina_corrente= ceil($pagina-1/$righe_per_pagina);          

    echo " <div align=center>[b]Pagina $pagina_corrente di $numero_pagine[/b]</div>

    [b]Numero fatture trovate: <font color=\"#FF0000\" size=\"5\"> ".$totr." </font>[/b] <a href=\"ricerca.php\">Ritorna al modulo</a>



    <table border=1 width=\"600\" cellspacing=\"0\" cellpadding=\"5\"><tr>
      <td width='80' align='center'>[b]Fattura N°[/b]</td>
      <td width='150' align='center'>[b]Data[/b]</td>
      <td width='250' align='center'>[b]Cliente[/b]</td>
      <td width='120'align='center'>[b]Dettagli[/b]</td></tr></table>
    ";

    $tutto.=" LIMIT ".(($pagina-1)*$righe_per_pagina).", ".$righe_per_pagina;
    $querylim = mysql_query ($tutto,$link)
    or die ("Non riesco ad eseguire la richiesta $tutto");    
    if (mysql_num_rows($querylim) > 0) {
    while( $row = mysql_fetch_array($querylim) )
       {
       $cust = $row["id_fattura"];
       
       $querycust = mysql_query("SELECT * FROM clientidb JOIN fatture ON clientidb.id_user=fatture.id_cliente
       WHERE fatture.id_fattura = $cust",$link);
       
       while( $rowcust = mysql_fetch_array($querycust) )
    {
       $cognome_cliente = $rowcust["cognome"];
       $nome_cliente    = $rowcust["nome"];
      }
    ?>
    <html>
    <script type="text/javascript">
    function PopupCentrata(dest_url) {
        var w = 600;
        var h = 800;
        var l = Math.floor((screen.width-w)/2);
        var t = Math.floor((screen.height-h)/2);
        window.open(dest_url, "nome_finestra", "width=" + w + ",height=" + h + ",top=" + t + ",left=" + l);
    }
    </script>  
    </html>
    <?   
    echo "
    <table border=0 width=\"600\" cellspacing=\"3\"><tr>
      <td width='80' align='right'>[b]
    $row[numero_fatt][/b]</td>
      <td width='150' align='center'>[b]"
    .date("d/m/y"$row['data'])."[/b]</td>
      <td width='125' align='left'>[b] 
    $cognome_cliente[/b]</td>
      <td width='125' align='left'>[b] 
    $nome_cliente[/b]</td>
      <td width='120'align='center'>[b]<a href=\"#\" onClick=\"PopupCentrata('filmato.php?variabile=
    $cust')\">Visualizza</a>[/b]</td>
      </tr>
      </table>"
    ;
    }

    echo 
    $_REQUEST['id_user'];
      
    echo 
    "<center>
    "
    ;
    if (
    $numero_pagine 1) {
    //inizio della condizione per creare l'elenco delle pagine
    for ($pag 1$pag <= $numero_pagine$pag++) {
    echo 
    "[&nbsp<a href=?";
    echo 
    "pagina=".($pag).
    " title=\"Vai a pagina $pag\">".$pag."</a>&nbsp]&nbsp";
    }
    // fine "elenco"

    echo "</center>";

    }
      }
    ?>
    Penso di aver individuato il problema.
    Richiamando le restanti pagine della paginazione dei dati in pratica perdo le variabili dei request e viene eseguita la prima query (cioè la prima quella che richiama l'elenco completo)....credo.
    Come devo risolvere la cosa?
    Ho provato, ma il problema è più ostico del previsto.
    Potete almeno darmi un'idea?
    Grazie

  2. #2
    Guarda, senza che leggo tutto ti posso comunque dare dei consigli.

    Hai due strade se vuoi fare la paginazione e contemporaneamente eseguire delle raffinazioni.

    La prima strada è portarti dietro tutte le variabili di raffinazione, scegli tu se tramite querystring o input hidden.

    La seconda strada è salvarti la query in una sessione.

    La prima volta che carichi la pagina crei la sessione.

    Ogni volta che aggiungi una raffinazione aggiorni la sessione.

    Quando cambi pagina richiami la query dalla sessione invece che dalla variabile, in questo modo ti ripeschi la query già bella e raffinata.

    Questo metodo lo usiamo in asp per siti molto importanti e ti assicuro che funziona bene

  3. #3
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    Butta un occhio alle pillole in rilievo, ci sono delle utili guide sulle paginazioni.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    Originariamente inviato da Debiru
    Guarda, senza che leggo tutto ti posso comunque dare dei consigli.

    Hai due strade se vuoi fare la paginazione e contemporaneamente eseguire delle raffinazioni.

    La prima strada è portarti dietro tutte le variabili di raffinazione, scegli tu se tramite querystring o input hidden.

    La seconda strada è salvarti la query in una sessione.

    La prima volta che carichi la pagina crei la sessione.

    Ogni volta che aggiungi una raffinazione aggiorni la sessione.

    Quando cambi pagina richiami la query dalla sessione invece che dalla variabile, in questo modo ti ripeschi la query già bella e raffinata.

    Questo metodo lo usiamo in asp per siti molto importanti e ti assicuro che funziona bene
    quella delle sessioni mi sembra un'idea "professionale"

    con querystring e input hidden cosa intendi?

    Se dici che è migliore il secondo metodo (o il primo) per me va bene, l'importante è che funzioni.
    Mi dovresti aiutare con le sessioni.
    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    scusami, dovresti però dare un'occhiata al codice sopra, Debiru.
    Com'è strutturato si possono utilizzare le sessioni?

    No perchè quando cambio pagina, è proprio il primo if "della raffinazione" come dici tu che crea il problema.
    Magari non ho capito bene io.
    Ciao

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.