• User Attivo

    Paginazione con dati casuali

    Buongiorno a tutti voi del forum. Sul mio sito PHP e MYSQL ho delle pagine che estraggono dati da un database e che vengono impaginate regolarmente in righe da 10. Vorrei cambiare l'order by dei dati e sostituirlo con un estrazione casuale. Il problema è che quando cambio pagina perdo informazioni sui record letti nella pagina precedente. Qualcuno ha qualche tutorial di esempio per poter superare questo problema? Grazie in anticipo


  • User Attivo

    La selezione casuale dei dati la puoi fare direttamente da MySQL, con la clausola ORDER BY RAND()

    SELECT * FROM nome_tabella ORDER BY RAND()
    

    che va messa dopo le clausole WHERE e prima della clausola LIMIT.
    Se hai la paginazione e vuoi escludere i dati precedentemente visualizzati, puoi escludere i dati da scartare con la clausola NOT IN([array]).

    SELECT * FROM nome_tabella WHERE id NOT INT('1', '15', '76', '99')
    

    Siccome immagino tu estragga i dati con una mysql_fetch_*(), puoi assegnare ad un array php tutti gli id che hai estratto, per poi passarlo al MySQL nella query successiva.

    [php]
    $_SESSION["visualizzati"] = array();
    $sql = "SELECT * FROM ...";
    $query = mysql_query($sql);
    while ($riga = mysql_fetch_object($query)) {
    // le tue operazioni
    $_SESSION["visualizzati"][] = $riga->id;
    }
    [/php]

    è un abbozzo, sbattuto così com'è nel tuo sistema di paginazione non va bene, ma ora dovresti avere un'idea concreta sul come procedere.


  • User Attivo

    Ciao Francesco...grazie innanzitutto...effettivamente ho provato come mi hai detto tu e la cosa funzionerebbe pure
    Il problema si presenta se navigo un pochino tra le pagine...si arriverà ad un punto che la select non mi caccia nessun dato perché mettendo l'id già selezionato nell' array se ripasso sulla pagina non lo estrae più

    Es..passo sulla pagina 1 e metto nell'array id (1, 3)
    vado nella pagina 2 e metto nell'array id 2 e 4 avendo così (1,2,3,4)

    Se ripasso sulla pagina 1 non mi estrarrà più nessun dato in quando la select è fatta in questo modo:

    SELECT * FROM table where categoria = $cat and id NOT IN $Esclusi order by RAND()

    dove $Esclusi = (1,2,3,4)

    Non so se mi riesci a capire il mio problema
    Grazie ancora

    @Francesco Di Caprio said:

    La selezione casuale dei dati la puoi fare direttamente da MySQL, con la clausola ORDER BY RAND()

    >SELECT * FROM nome_tabella ORDER BY RAND()
    >```
    
    
    che va messa dopo le clausole WHERE e prima della clausola LIMIT.
    Se hai la paginazione e vuoi escludere i dati precedentemente visualizzati, puoi escludere i dati da scartare con la clausola NOT IN([array]).
    
    

    SELECT * FROM nome_tabella WHERE id NOT INT('1', '15', '76', '99')

    Siccome immagino tu estragga i dati con una mysql_fetch_*(), puoi assegnare ad un array php tutti gli id che hai estratto, per poi passarlo al MySQL nella query successiva.

    [php]
    $_SESSION["visualizzati"] = array();
    $sql = "SELECT * FROM ...";
    $query = mysql_query($sql);
    while ($riga = mysql_fetch_object($query)) {
    // le tue operazioni
    $_SESSION["visualizzati"][] = $riga->id;
    }
    [/php]

    è un abbozzo, sbattuto così com'è nel tuo sistema di paginazione non va bene, ma ora dovresti avere un'idea concreta sul come procedere.


  • User Attivo

    E' il motivo per il quale ti avevo detto che preso così com'era non sarebbe andato bene. Devi decidere tu come farlo funzionare... se navighi tra le pagine prima o poi arriverai ad un punto in cui l'array te li esclude tutti. Ora sta te decidere come procedere quando l'utente ha visualizzato tutti i dati disponibili.
    Se vuoi mantenere la casualità devi fare in modo da imporre un controllo quando il numero totale dei record in tabella, meno il numero di id presenti nell'array degli esclusi, è minore del numero di righe che vuoi presentare nella pagina. In quell'occasione devi decidere cosa fare. Azzerrare l'array? Rimuovere solo alcuni record casuali?


  • User Attivo

    Grazie Francesco...
    Ho poi risolto in un altro modo, penso più semplice

    Ho costruito una variabile di sessione. Se accedo la prima volta nella prima pagina, gli assegno un numero casuale
    $_SESSION["casuale"] = rnd();

    Poi mi costruisco la SELECT * FROM table where categoria = $cat order by RAND($_SESSION["casuale"])

    Grazie cmq