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

    query random e paginazione

    Ho una query che preleva una serie di dati dal db in maniera casuale:

    Codice PHP:
    $query mysql_query("select * from table order by RAND()"); 
    siccome i dati estrapolati sono molti, vorrei suddividerli per pagina.
    Naturalmente la query casuale deve essere eseguita una sola volta e i dati che si trovano all'interno delle pagine suddivise devono avere sempre gli stessi valori per una sessione.

    Cioe' la prima volta che entro in una pagina mi visualizza n tuple random e sulla pagina ci sono le m sottopagine con le restanti tuple della query casuale fatta in precedenza.

    Spero di essere stato chiaro.

    Come si puo' fare???
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  2. #2
    Bhe, di certo non eseguendo ogni volta la stessa query. Io credo non si possa fare! Almeno non nel modo in cui ai progettato tu la query. Nè saprei cme risolvere il probema. Bho!

    Potresti, magari creare un'altra tabella che si chiami come l'id di sessione e lì inserire i valori estratti con la query random. però se i valori sono molti e gli utenti pure succede un bel macello!

  3. #3
    avevo pensato a generare la query la prima volta e poi salvarla in una variabile di sessione.
    Una cosa del tipo

    Codice PHP:
    if (! isset($_SESSION['result']))
       
    $_SESSION['result'] = mysql_query("select * from tabella order by RAND()"); 
    La prima volta la esegue correttamente, ma nelle successive il valore $_SESSION['result'] viene posto a 0.
    Ho pensato si dovesse portare l'indice a zero mediante data_seek ma niente da fare...


    Qaulcuno ha un'idea brillante?
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  4. #4
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Io farei le seguenti cose:

    - esecuzione della query una sola volta nella prima pagina senza randomizzaione e selezionando solo gli id
    - inserimento degli id in un array
    - randomizzazione dell'array (è molto meglio randomizzare in php, la funzione rand() di mysql fa schifo)
    - creazione di una variabile da passare alle pagine successive via get: la varaibile dev'essere del tipo $variabile=(id1,id2,...,idn).

    La query per la selezione dei dati a questo punto sara:

    SELECT * FROM TABELLA WHERE ID IN $variabile LIMIT ...

  5. #5
    Mi sembra una buona idea ... ma puoi essere piu' chiaro in questo punto?

    [supersaibal]Originariamente inviato da Teuzzo
    - creazione di una variabile da passare alle pagine successive via get: la varaibile dev'essere del tipo $variabile=(id1,id2,...,idn).

    La query per la selezione dei dati a questo punto sara:

    SELECT * FROM TABELLA WHERE ID IN $variabile LIMIT ... [/supersaibal]
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  6. #6
    Ottima! Mi sembra un ottima idea! In pratica selezioni gli id che ti servono estraendoli dall'array. veramente bella come cosa!

  7. #7
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Se $array_id è l'array con gli id e $get_id è la variabile con gli id da passare via get:

    Codice PHP:
    $get_id="(";
    $n=0;
    foreach( 
    $array_id as $t ){
    if(
    $n>0$get_id.=",";
    $get_id.=$t;
    }
    $get_id.=")";
    // a questo punto la variabile $get_id sarà una cosa del tipo: (123,456,789) 
    Nella query basterà mettere WHERE ID IN ".$_GET['get_id']." LIMIT ...


    P.S.: per randomizzare l'array c'è la funzione shuffle di php, però non mi piace molto (anche se va molto meglio del RAND() di mysql).
    Per questo io mi sono creato una funzione simile che usa però mt_rand(). Questa è la funzione:

    Codice PHP:
    // funzione per randomizzare un array usando mt_rand al posto di shuffle
    function random_array($a){
        
    $n=count($a); // numero di elementi nell'array $a
        // creo un array $c di numeri casuali lungo quanto l'array a
        
    $c=array();
        for(
    $i=0;$i<$n;$i++) $c[]=mt_rand(1,$n+1);
        
    $na=array(); // nuovo array che uscirà dalla funzione
        
    for($i=0;$i<$n;$i++){
            
    // trovo il massimo elemento dell'array di numeri casuali $c
            
    $max=max($c);
            
    // trovo la posizione dell'elemento max
            
    $position=array_search($max,$c);
            
    // aggiungo l'elemento nella posizione dell'array originale
            
    $na[$i]=$a[$position];
            
    // azzero l'elemento dall'array $c
            
    $c[$position]=0;        
            }    
        return 
    $na;
        } 
    Se qualcuno vuole metterci le mani per migliorarla ben venga.

  8. #8
    ok provo questa soluzione ... speriamo bene...
    Vi terrò informati.
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  9. #9
    Questa e' la soluzione

    Codice PHP:
    if (! isset($_GET['page']))
                
    $_GET['page']=0;
            
    $per_page 10;
            
    $_POST['idcasa']        =    mysql_query('select idcasa from casa') or die('non riesco a selezionare gli id della cassa');
            
    $tot_records             =     mysql_num_rows($_POST['idcasa']);
            
    $tot_pages                 =    ceil($tot_records $per_page);
            
    $current_page             =     (! isset ($_GET['page'])) ? : (int)$_GET['page'];
            
    $primo                     =     ($current_page 1) * $per_page;
            
            if (!isset(
    $_SESSION['array_page'])){
                
                
    $array_id                 =     array();
                
    $output                 =    array();
                
    $_SESSION['array_page'] =     array();
                
    //inserisco tutti gli id della query in un array
                
    while($row_idcasa    =    mysql_fetch_array($_POST['idcasa']))
                    
    array_push($array_id,$row_idcasa['idcasa']);
                
                
    $array_id                =    random_array($array_id);                    //randomizzo l'array
                //suddivido l'array in gruppi
                
    for($i=0$i<$tot_pages$i++){
                    
    $output             =     array_slice($array_id0$per_page);        //prelevo i primi $Per_page elementi dalll' array
                    
    $array_id            =    array_slice($array_id,$per_page);            //elimino i primi $Per_page elementi dall'array
                    
    $str                 =     implode($output,',');                        //trasformo in stringa l'array in modo che sia compatibile con il formato della query sql
                    
    array_push($_SESSION['array_page'],$str);                            //ricreo un array con i gruppi di id randomizzati
                
    }
            }
            
            
    $ok $_SESSION['array_page'][$_GET['page']]; 

    PICCOLO PROBLEMA
    in locale funziona egregiamente,
    quando lo carico sul serve non funziona piu' e al reload di ogni pagina mi da valori casuali
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

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.