Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    paginare un ciclo while

    ancora qui
    sto cercando di capire come fare a paginare i risultati di un ciclo while.
    ho provato ad usare il metodo descritto quì
    è un ottimo metodo che ho usato più volte ma ora non posso usarlo perchè non devo paginare i risultati con la query LIMIT ma le volte che viene visualizzato il ciclo while per ogni pagina.

    ho provato in vari modi con il for() ma credo di non aver capito bene come funzioni se qualcuno può darmi qualche dritta gliene sarei eternamente grato
    il codice è questo
    codice:
    <?php 
    $sql="SELECT * FROM `provolo`";
    $result=mysql_query($sql, $connetti) or die(mysql_error());
    $i=0;
    $loop="";
    while ($line=mysql_fetch_array($result, MYSQL_ASSOC)) {
    $uhu=strpos($line[Supported], $cell);
    if ($uhu===false){
    } else {
    $i++;
    $loop.="<a href=/$line[File]>$line[Name]</a>
    ";
    }
    }
    $loop.="";
    $quanti= $i;
    $tot_records = $quanti;
    // risultati per pagina(secondo parametro di LIMIT)
    $per_page = 20;
    // numero totale di pagine
    $tot_pages= ceil($i / $per_page);
    // pagina corrente
    $current_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];
    
    
    include("paginazione_2.php");
    echo $quanti;
    echo $paginazione;
    echo $loop;
    ?>
    il codice sopra è basato sul tutorial quì e il file paginazione_2.php è quello usato nell'esempio.
    ho provato inserendo il ciclo while in un altro ma mi da un loop infinito.
    credo che bisogni utilizzare un for() ma non ho idea di come fare a stento ho capito il ciclo while, un'anima buona che possa illustrare il funzionamento della funzione for() grazie in anticipo per l'aiuto

  2. #2
    Ma tu praticamente devi dividere i risultati su più pagine?

    Cmq il ciclo while e il ciclo for eseguono la stessa funzione in modo diverso. While funziona così:

    mettiamo che noi vogliamo stampare i numeri da 1 a 10 con while faremo così

    $i = '0'; //questo è il contatore che verrà incrementato

    while ($i < 10)
    {
    echo "$i";
    $i++;
    }

    in pratica succede questo:
    Io ho dato un valore iniziale a $i pari a 0. Nel ciclo while ho specificato che finche $i è minore (<) di 0 deve eseguire le operazioni nelle parentesi graffe. Nelle parentesi graffe io ho detto allo script "stampa il valore di $i e poi incrementalo di 1 (aggiungi 1 al valore attuale cioè se $i = 3 con la sintassi $i++ viene aggiunto 1 e quindi $i assume il valore $i = 4)

    Dopo aver stampato ed incrementato lo script torna in cima al while e confronta nuovamente la situazione. Si accorge quindi che $i è ancora minore di 10 e quindi riesegue le operazioni ($i adesso, infatti, è = 4)
    Quindi stamperà nuovamente il valore di $i (4) e lo incrementerà ancora di 1 ($i diventa = 5) e ritorna in cima rieseguendo le operazioni precedenti. Tutto questo finchè $i non diventa > (maggiore) di 10.


    Per il ciclo for è la stessa cosa solo che i parametri vanno aggiunti tutti nelle parentesi tonde. La sintassi sarà quindi:

    for ($i = 0; $i < 10; $i++)
    {
    echo "$i";
    }

    Praticamente nel primo campo io ho dato un valore iniziale ad $i (come nel ciclo while solo che nel while l'ho messo all'inizio cioè $i = 0; while (condizioni) )
    nel secondo parametro ho indicato allo script quale condizione si deve verificare affinchè lo script esca dal ciclo (cioè che $i sia >= 10 [maggiore o uguale] ) nel terzo parametro ho specificato di incrementare il contatore. Nelle parentesi graffe dico allo script che deve fare ogni volta che esegue il ciclo (stampare il valore di $i.

    Spero di essere stato chiaro! Ciao ciao.
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  3. #3
    grazie per la tua spiegazione, teoricamente ho più o meno capito le differenze tra le due funzioni.
    il mio problema ora è che devo paginare i risultati.
    come si può dedurre dal codice il ciclo while mi serve sopratutto per ricavare il numero di record che devo mostrare.
    codice:
    $loop="";
    while ($line=mysql_fetch_array($result, MYSQL_ASSOC)) {
    $uhu=strpos($line[Supported], $cell);
    if ($uhu===false){
    } else {
    $i++;
    $loop.="<a href=/$line[File]>$line[Name]</a>
    ";
    }
    }
    $loop.="";
    ora cosa dovrei fare per mostrare la variabile $loop su più pagine?
    ho bisogno praticamente di paginare i risultati.

  4. #4
    nessuno può darmi una dritta su come procedere?
    eppure deve esserci un modo per visualizzare i risultati.
    grazie in anticipo a chi può darmi qualche suggerimento

  5. #5
    Il codice che hai postato è indentato coi piedi, o meglio, non è indentato per nulla e quindi si fa una fatica boia a capirlo, non mi ci metto nemmeno.

    codice bello bello indentato:

    Codice PHP:
    for($i 0$i 5; $++)
    {
         echo(
    "La variabile i è: ".$i);
         if(......)
         {
                ......
         }
         else
         {
                ......
         }

    Ok il TAB non funziona se lo premi mentre scrivi un post ma se fai copia/incolla dal tuo editor di testo è tutto ok.

    Per quanto riguarda la paginazione tu in pratica vuoi estrarre un range di dati e stamparli giusto? Allora io faccio finta che hai un vettore ($dati) di numeri e non MySQL così facciamo prima. Che ogni pagina contenga 5 numeri e tu sia alla 2° pagina.

    Il vettore ha il primo elemento sull'indice 0, i seguenti in posizioni a crescere. Se tu, come abbiamo ipotizzato, sei alla 2° pagina ed ogni pagina ne contiene 5, quelli che dorvai stamapre sono quelli contrassegnati dalla 'x':

    $dati = array(34,54,56,.....);

    34 ( <--- indice 0 del vettore, primo elemento)
    54
    56
    34
    12
    67 x ( <--- indice 5 del vettore)
    87 x ( <--- indice 6 del vettore)
    67 x ( <--- indice 7 del vettore)
    56 x ( <--- indice 8 del vettore)
    44 x ( <--- indice 9 del vettore)
    57
    89
    67
    66
    45
    34
    12
    34

    Arriva qui il FOR. Con il FOR riesci a scandire esattamente il numero di elementi compresi tra l'indice 5 e il 9, così:

    for($i = 5; $i <= 9; $i++)
    {
    echo( $dati[$i] );
    }

    Questo ciclo viene eseguito 5 volte, in genere si mette $i < 10 piuttosto che $i <= 9 ma era per farti capire.

    Nella tua query MySQL se non vuoi usare LIMIT puoi caricare tutti gli elementi in un vettore e poi usi quel FOR.
    Concentrate on what cannot lie... The evidence. -- Gil Grissom

  6. #6
    mi scuso per l'indentazione, anzi la non indentazione.
    avevo immaginato una cosa del genere ma sono entrato da poco nel mondo della programmazione

    grazie ancora.

  7. #7
    [CODE]
    $i=0;
    $loop="";
    while ($line=mysql_fetch_array($result, MYSQL_ASSOC)) {
    $uhu=strpos($line[Supported], $cell);
    if ($uhu===false){
    } else {
    $i++;
    $loop.=" [$i]=>$line
    codice:
    ,";
      
            }
    }
    $loop.="";
    $codici=array($loop);
    
    $quanti= $i;
    $tot_records = $quanti;
    // risultati per pagina(secondo parametro di LIMIT)
    $per_page = 20;
    // numero totale di pagine
    //$tot_pages = ceil($tot_records / $per_page);
    $tot_pages= ceil($quanti / $per_page);
    // pagina corrente
    $current_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];
    // primo parametro di LIMIT
    $primo = ($current_page - 1) * $per_page;
    include("paginazione_2.php");
    echo $paginazione."
    ";
    /*
    da qui come faccio con il ciclo for a rendere dinamica la paginazione???????? 
    */
    allora spero che l'indentazione vada bene
    ho messo il risulato del ciclo while in un array
    codice:
    $codici=array($loop);
    il mio problema e che ottengo risultati variabili dal ciclo while ed ho la necessita di paginare on the fly
    spero davvero che qualcuno di buona volontà perda 2 minuti a leggersi lo script ed a darmi un idea di come procedere.

    grazie

  8. #8
    sto elaborando una classe per la paginazione
    vedi se ti è utile

    paging.inc.php
    codice:
    <?
    #-----------------------#
    #   made in bb69 world  #
    #   version 1.0         #
    #   don't remove        #
    #-----------------------#
    <?
    class paging {
          var $_max_links;
          var $_per_page;
          var $_page_field = "page";
          var $_tot_records_field = "total_records";
          var $_page = 1;
          var $_tot_records = false;
          var $_num_pages;
          var $_url;
          var $_url_sep = "?";
          var $_flds_sep = "&";
          var $_flds_eq = "=";
          var $_my_menu;
          var $_my_limit;
          var $_get_values = array();
    
          function paging($tot_records = false, $per_page = 10, $max_links = 5) {
                   $this->_per_page = $per_page;
                   $this->_max_links = $max_links;
                   $this->set_get_fields();
                   $this->_tot_records = $tot_records !== false ? $tot_records : ($this->_tot_records === false || $this->_tot_records <= 0 ? 1 : $this->_tot_records);
                   $this->_get_values[] = $this->_tot_records_field.$this->_flds_eq.$this->_tot_records;
                   $this->_num_pages = ceil($this->_tot_records/($this->_per_page > 0 ? $this->_per_page : 1));
                   $this->_page = $this->_page > $this->_num_pages ? $this->_num_pages : $this->_page;
                   $this->_my_limit = "LIMIT ".($this->_page-1)*$this->_per_page.",".$this->_per_page;
                   $this->_url .= $this->_url_sep.implode($this->flds_sep, $this->_get_values);
                   $this->build_menu();
          }
    
          function set_get_fields() {
                   list($this->_url, $querystring) = explode($this->_url_sep, $_SERVER['REQUEST_URI']);
                   $_get_values = explode($this->_flds_sep, $querystring);
                   foreach($_get_values as $_get_value) {
                           list($key, $val) = explode($this->_flds_eq, $_get_value);
                           if($key == $this->_tot_records_field) {
                              $this->_tot_records = intval($val) > 0 && $this->_tot_records === false ? intval($val) : $this->_tot_records;
                           } else if($key == $this->_page_field) {
                              $this->_page = intval($val) > 0 ? intval($val) : $this->_page;
                           } else {
                              if($key != $this->_page_field && $key != $this->_tot_records_field && trim($key) != '') {
                                 $this->_get_values[] = $key.$this->_flds_eq.$val;
                              }
                           }
                   }
          }
    
          function build_menu() {
                   $this->_my_menu = "Pagina:";
                   $this->_my_menu .= " ".($this->_page > 1 ? "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=1"."\" title=\"Vai alla prima pagina\">||&lt;</a>" : "||&lt;");
                   $this->_my_menu .= " ".($this->_page > $this->_max_links ? "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=".($this->_page-$this->_max_links)."\" title=\"Vai alle {$this->_max_links} pagine precedenti\">|&lt;</a>" : "|&lt;");
                   $this->_my_menu .= " ".($this->_page > 1 ? "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=".($this->_page-1)."\" title=\"Vai alla pagina precedente\">&lt;</a>" : "&lt;");
    
                   $start = 1 + floor(($this->_page-1)/$this->_per_page)*$this->_per_page;
                   $end   = $start + $this->_max_links;
                   for($page_val = $start; $page_val < $end; ++$page_val) {
                       if($page_val > $this->_num_pages) {
                          break;
                       }
                       $this->_my_menu .= " "."[ ".($page_val == $this->_page ? "" : "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=".$page_val."\" title=\"Vai a pagina $page_val\">");
                       $this->_my_menu .= $page_val;
                       $this->_my_menu .= ($page_val == $this->_page ? "" : "</a>")." ]";
                   }
    
                   $this->_my_menu .= " ".($this->_page < $this->_num_pages ? "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=".($this->_page+1)."\" title=\"Vai alla pagina successiva\">&gt;</a>" : "&gt;");
                   $this->_my_menu .= " ".($this->_page <= ($this->_num_pages-$this->_max_links) ? "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=".($this->_page+$this->_max_links)."\" title=\"Vai alle {$this->_max_links} pagine successive\">&gt;|</a>" : "&gt;|");
                   $this->_my_menu .= " ".($this->_page < $this->_num_pages ? "<a href=\"".$this->_url.$this->_flds_sep.$this->_page_field."=".$this->_num_pages."\" title=\"Vai all'ultima pagina\">&gt;||</a>" : "&gt;||");
          }
     }
    ?>
    codice:
    include "paging.inc.php";
    // connessione db
    // selezione db
    
    if(isset($_GET['total_records'])) {
          $tot = intval($_GET['total_records']);
    } else {
          $result = mysql_query("SELECT COUNT(1) FROM $tabella"); 
          list($tot) = mysql_fetch_row($result);
    }
    $p = new paging($tot);
    $result = mysql_query("SELECT campo1, campo2 FROM $tabella {$p->_my_limit}") or die(mysql_error());
    echo $p->_my_menu."
    ";
    while(list($campo1, $campo2) = mysql_fetch_row($result)) {
          echo $campo1." ".$campo2."
    \n";
    }
    mysql_close();
    total_records e page sono parametri $_GET riservati
    E' la mia opinione ed io la condivido
    Non condivido la tua idea ma darei la vita perché tu la possa esprimere (Voltaire)
    Scrivi sul muro

  9. #9
    grazie boomboom69
    la classe che hai scritto è davvero ben fatta (per quello che ne posso capire io)
    ma nel mio caso specifico non posso paginare usando il paramtro "LIMIT" nella query sql.
    devo paginare i risultati del ciclo while che ho messo in un array.
    codice:
    $loop="";
    while ($line=mysql_fetch_array($result, MYSQL_ASSOC)) {
    $uhu=strpos($line[Supported], $cell);
    if ($uhu===false){
    } else {
    $i++;
    $loop.="<a href=/$line[File]>$line[Name]</a>
    ";
    }
    }
    $loop.="";
    $codici=array($loop);
    il suggerimento di frankek di usare un for() mi sembra il modo migliore per paginare ma non riesco a trovare il modo.
    ci sto sbattando la testa da 3 giorni ma non so sarà il caldo ma non ho proprio idea di come fare

    help

  10. #10
    C'è un errore quando crei l'array... in pratica vai a creare un array che contiene UN SOLO elemento, una stringa lunghissima.

    codice:
    $loop="";
    while ($line=mysql_fetch_array($result, MYSQL_ASSOC))
    {
        $uhu=strpos($line[Supported], $cell);
        if ($uhu===false)
        {
        }
        else
        {
            $i++;
            $loop.="<a href=/$line[File]>$line[Name]</a>
    ";
        }
    }
    $loop.="";
    $codici=array($loop); // <---------- qui crei un array con 1 solo elemento
    Dovresti fare più o meno così:

    Codice PHP:
    $codici = array(); // lo inizializzi vuoto
    while ($line=mysql_fetch_array($resultMYSQL_ASSOC))
    {
        
    $uhu strpos($line[Supported], $cell);
        if (
    $uhu === false)
        {
        }
        else
        {
            
    $i++;

            
    // si fa così per accodare un elemento in fondo ad un vettore
            // e incrementare quindi la sua lunghezza, oppure usi 
            // array_push() che è uguale
            
    $codici[] = "<a href=/$line[File]>$line[Name]</a>
    "
    ;
        }

    Concentrate on what cannot lie... The evidence. -- Gil Grissom

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.