• User Attivo

    Query SELECT limit result

    Faccio un esempio pratico per discutere di tecniche progettuali inerenti query di questo tipo

    SELECT * FROM TABELLA LIMIT 10;
    

    Ovviamente il risultato è limitato ai primi 10 record della tabella citata.

    Se vogliamo vedere i successivi 10 record basta semplicemente dare un comando di questo genere

    SELECT * FROM TABELLA LIMIT 10,10;
    

    In questo caso verranno visualizzati sempre 10 record; però verranno omessi i primi 10 risultati.

    Andando avanti sempre con lo stesso criterio, e cioè

    SELECT * FROM TABELLA LIMIT 20,10;
    

    Visualizzeremo altri 10 record omettendo i primi 20... E così facendo noi riusciamo a visualizzare l'intera tabella MySQL esaminando 10 record per volta.

    Spero che questo esempio banale possa essere chiaro e possa in qualche modo far comprendere l'utile funzionalita che si riesce a ottenere in un modo abbastanza semplice.

    Magari tanti di voi avranno gia capito cosa voglio chiedere, ma forse no per cui procediamo piano.

    Abbiamo visto che ho dovuto lanciare 3 query per esaminare la mia tabella contenente non più di 30 record, il tutto realizzato in ambiante shell (da riga di comando tanto per intenderci).

    Ora il PHP è famoso per essere un linguaggio di programmazione orientato allo sviluppo web e in particolare adatto alla realizzazione di siti dimanici che interagiscono con il database MySQL; ma come posso realizzare uno script (un solo script) che mi limiti il risultato a 10 record e allo stesso tempo mi dia la possibilità di visualizzare i successivi risultati poco per volta?

    Io personalmente ho cercato di realizzare qualcosa che potesse fare questo, ma amici miei non ci sono riuscito, non sono proprio in grado al momento di dare risposte concrete.
    Inizialmente pensavo un percorso del genere :

    Conto il numero dei record
    Divido il numero dei record per 10
    Arrotondo il risultato all'intero superiore ottenendo un numero X (Queso lo faccio con la funzione ceil() suggeritami in questo forum)
    Creo X file copiandoli da un file di riferimento
    Ogni file copiato gli viene assegnato un nome numerico
    Creo un collegamento url reale a tutti i file copiati
    Però qui casca l'asino. Quando ci clicco sopra il risultato è sempre lo stesso; d'altronde c'è sempre la stessa query. Il risultato è più che scontato: se sono tutti uguali i file copiati è normale 😉

    Forse non sono lontano dalla soluzione, perchè mi resterebbe soltanto capire come posso dinamicamente cambiare in ognuno di quei file un numero nella query.

    file riferimento1.php in esso la query

    SELECT * FROM TABELLA LIMIT 10;
    

    file riferimento2.php in esso la query

    SELECT * FROM TABELLA LIMIT 10,10;
    

    file riferimento3.php in esso la query

    SELECT * FROM TABELLA LIMIT 20,10;
    

    e così via........

    Ma vorrei capire se posso continuare su questa linea oppure cambiare totalmente strategia
    :mmm:


  • Super User

    pagina: miapagina.php

    prima chiamata: miapagina.php?start=0
    $start = $_GET['start']
    query: select * form tabella limit $start,10

    seconda chiamata: miapagina.php?start=10
    $start = $_GET['start']
    query: come sopra

    etc etc etc

    per fare il fighetto puoi passare anche il parametro offeset e definire quanti record pescare e quindi diventerà:

    terza chiamata: miapagina.php?start=10&offset=20
    $start = $_GET['start']
    $offset = $_GET['offset']
    query: select * form tabella limit $start,$offset

    :ciauz:


  • User Attivo

    esatto, basta usare il primo valore di limit come variabile

    per ragioni di sicurezza userei anche un intval per prendere i dati dalla get
    😎


  • User Attivo

    Ho copiato un codice php riguardante la paginazione il cui link era postato proprio da riky78. Si tratta di una spiegazione su 2 metodi per raggiungere l'obiettivo prefissato.

    In realtà è inutile e anche poco sicuro creare tutti file differenti dove in oguno di essi c'è una query differente, basta averne solo una di pagina (quindi di file) all'interno della quale c'è impostato un comando MySQL con un valore variabile:

    
    <?php
    $count = mysql_query&#40;"SELECT COUNT&#40;*&#41; FROM utenti"&#41;;
    $res_count = mysql_fetch_row&#40;$count&#41;;
    $tot_records = $res_count&#91;0&#93;;
    $per_page = 10;
    $tot_pages = ceil&#40;$tot_records / $per_page&#41;;
    $current_page = &#40;!$_GET&#91;'page'&#93;&#41; ? 1 : &#40;int&#41;$_GET&#91;'page'&#93;;
    $primo = &#40;$current_page - 1&#41; * $per_page;
    $query_limit = mysql_query&#40;"select user_name,citta from utenti LIMIT $primo, $per_page"&#41;;
    print&#40;"<div align=\"center\"><table border=\"0\" cellpadding=\"2\" cellspacing=\"2\" width=\"420\">\n"&#41;;
    print&#40;"<tr><td height=\"30\"  bgcolor=\"#FFFFC8\"><font size=\"1\">**User-name**</font></td>
    		<td height=\"30\"  bgcolor=\"#FFFFC8\"><font size=\"1\">**località**</font></td></tr>\n"&#41;;
    
    while&#40;$results = mysql_fetch_array&#40;$query_limit&#41;&#41;
    &#123;
    print&#40;"<tr>\n"&#41;;
    print&#40;"<td height=\"30\"  bgcolor=\"#B9DCDC\"><font size=\"1\">$results&#91;user_name&#93;</font></td>
    		<td height=\"30\"  bgcolor=\"#B9DCDC\"><font size=\"1\">$results&#91;citta&#93;</font></td>\n"&#41;;
    include&#40;"pag.php"&#41;;
    print&#40;" </tr>\n </table><tr><td height=\"50\" align=\"center\">$pag</td></tr></table><td height=\"50\" valign=\"bottom\" align=\"center\"></td>\n"&#41;;
    
    print&#40;" </tr>\n</table>\n</div>\n"&#41;;
    ?>
    
    

    E perfettamente funzionante.
    Puoi verificare tu stesso la correttezza del codice [url=http://www.linus2004.it/new.php]guardando questa pagina
    Prevede che vi sia una tabella MySQL chiamata utenti con 2 campi uno chiamato user_name l'altro citta poi prevede che nella stessa cartella dove salvate il suddetto codice ci sia un file chiamato pag.php all'interno del quale le seguenti righe

    
    <?php
     $pag = "Risultati " . $tot_pages . "
    &#91;";
     for&#40;$i = 1; $i <= $tot_pages; $i++&#41; &#123;
     if&#40;$i == $current_page&#41; &#123;
     $pag .= $i . " ";
     &#125; else &#123;
     $pag .= "<a href=\"?page=$i\" title=\"Vai alla pagina $i\">$i</a> ";
     &#125;
     &#125;
     $pag .= "&#93;";
    ?> 
    
    

    GRAZIE :ciauz:


  • User Attivo

    Il suddetto codice funziona, e funziona anche bene. Però ho un problema.
    Ho modificato la query aggiungendo

    order by $_POST[view_method]

    Nel mio caso $_POST[view_method] è semplicemente una variabile che vado a prelevare da un menù a tendina tanto per intenderci; in effetti è per scegliere il criterio di visualizzazione degli utenti. Cioè possiamo scegliere di visualizzare gli utenti in base al nome o alla città oppure in base alla data di registrazione e così via. Ma il risultato non è quello previsto perchè la query viene eseguita soltanto alla prima richiesta, nelle pagine successive la variabile

    $_POST[view_method] acquisisce un valore NULL anzichè il valore selezionato (scelto) nel menù a tendina. E per questo motivo la query non viene eseguita.

    Capisco che il tutto è un pò contorto e che probabilmente non riesco ad essere chiaro quindi chiedo se qualcuno potrebbe essere così gentile da vedere la pagina in questione cliccando sul link inserito alla fine di questo post soltanto per farsi un'idea dell'errore.

    [url=http://www.linus2004.it/ushl/link_pubblici/indb_1/informazioni_utenti.php]La pagina che conteneva l'errore è qui


  • User Attivo

    certo,
    quando passi alle pagine successive (con un link) l'unico parametro che passi è PAGE qundi perdi i parametri post della pagina prima (cioè il view_method)

    Ti conviene accodare ai link alle pagine tutti parametri che ti servono (per semplificare ti converrebbe usare sempre il GET anche dal form inziale)


  • User Attivo

    Non ci riesco proprio.
    Forse dovrei cambiare strategia, ritorno al concetto iniziale:
    cioe quello di creare uno script che crei realmente le pagine e passare tutte le variabili che mi servono con la funzione globale session_start().
    Però il dubbio è che i files creati sul server dovrebbero essere impostati a chmod 755 per lo meno; se così non fosse quando si andrebbe a cliccare sul link NEXT oppure PREV verrebbe visualizzato il classico errore INTERNAL SERVER ERROR 500.

    Che ne dite provo a fare così o è inutile?


  • Super User

    no!!!

    fai le cose fatte per bene.

    anche a me è capitato di far generare ad uno script centinaia di pagine per risolver eun problema. poi ho trovato la soluzione ed ho dovuto perdere parecchio tempo a cancellare gli strafalcioni (rrighe e righe di strafacioni) e sostituirle con la piccola manciata di codice che costituiva la soluzione.

    se non hai estrema fretta prova e segui i consigli che ti danno su questo forum e vedrai che arriverai alla soluzione più elegante e performante. :fumato:


  • User Attivo

    Non ho nessuna fretta, io non faccio questo per professione e semplicemente una cosa che mi piace e basta. Vorrà dire che dovrò meglio vedere come avviene il passaggio delle variabili con il method GET. Forse è lì il problema 😄

    faccio un esempio pagina1.php e pagina_2.php

    
    pagina1.php
    
    $testo="ciao";
    print&#40;"<a href=\"pagina_2.php\"?testo=$testo\">vai alla pagina 2</a>"&#41;;
    
    
    pagina_2.php
    print&#40;"la variabile è:$testo"&#41;;
    
    

    I 2 files ovviamente sono inseriti nei tag PHP.
    Quando clicco sul link (vai alla pagina 2) dovrei visualizzare LA VARIABILE E' CIAO.

    Ma nulla non va.


  • Bannato Super User

    Hai degli apici di troppo:

    
    print&#40;"<a href=\"pagina_2.php\"?testo=$testo\">vai alla pagina 2</a>"&#41;;
    
    

    deve diventare

    
    print&#40;"<a href=\"pagina_2.php?testo=$testo\">vai alla pagina 2</a>"&#41;;
    
    

    Non ho avuto il tempo di controllare ma mi sembra dovrebbe essere giusto quello che ho scritto io.


  • User Attivo

    intanto emmebar ha ragione per gli apici

    inoltre nel file 2 è meglio usare (per ragioni di sicurezza e anche perchè con certe configurazioni di server fatto così non va):

    print("la variabile è:$_GET[testo]");

    invece di

    print("la variabile è:$testo");


  • Super User

    oppure:

    
    isset&#40;$_GET&#91;'var'&#93;&#41;$variabile=$_GET&#91;'var'&#93;:$variabile=0;
    
    if &#40;$variabile!=0&#41;
    &#123;
    print&#40;'[url="pagina.php?var='.$variabile.'"]testo'&#41;;
    &#125;
    
    

    io uso sempre questo sistema. è sicuramente un discorso di abitudine nella programmaizone ma in questo modo vedo il codice più chiaro.

    p.s. la prima riga serve per controllare se la variabile passata via get esiste.


  • User Attivo

    @riky78 said:

    Ti conviene accodare ai link alle pagine tutti parametri che ti servono (per semplificare ti converrebbe usare sempre il GET anche dal form inziale)

    Ecco la risoluzione del problema. Ho semplicemente tolto il method _POST ed inserito _GET e la variabile passa.

    😉


  • Super User

    :arrabbiato: :arrabbiato:

    non avevo capito che erano parametri che venivano inviati da un form altrimenti te l'avrei detto subito.
    cmq l'importante è che hai risolto :vai:


  • User

    Salve a tutti ... in riferimento al codice postato prima ....

    
    <?php
    $count = mysql_query("SELECT COUNT(*) FROM utenti");
    $res_count = mysql_fetch_row($count);
    $tot_records = $res_count[0];
    $per_page = 10;
    $tot_pages = ceil($tot_records / $per_page);
    $current_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];
    $primo = ($current_page - 1) * $per_page;
    $query_limit = mysql_query("select user_name,citta from utenti LIMIT $primo, $per_page");
    print("<div align=\"center\"><table border=\"0\" cellpadding=\"2\" cellspacing=\"2\" width=\"420\">\n");
    print("<tr><td height=\"30\"  bgcolor=\"#FFFFC8\"><font size=\"1\">**User-name**</font></td>
            <td height=\"30\"  bgcolor=\"#FFFFC8\"><font size=\"1\">**località**</font></td></tr>\n");
     
    while($results = mysql_fetch_array($query_limit))
    {
    print("<tr>\n");
    print("<td height=\"30\"  bgcolor=\"#B9DCDC\"><font size=\"1\">$results[user_name]</font></td>
            <td height=\"30\"  bgcolor=\"#B9DCDC\"><font size=\"1\">$results[citta]</font></td>\n");
    include("pag.php");
    print(" </tr>\n </table><tr><td height=\"50\" align=\"center\">$pag</td></tr></table><td height=\"50\" valign=\"bottom\" align=\"center\"></td>\n");
     
    print(" </tr>\n</table>\n</div>\n");
    ?>
    
    
    
    <?php
     $pag = "Risultati " . $tot_pages . "
    [";
     for($i = 1; $i <= $tot_pages; $i++) {
     if($i == $current_page) {
     $pag .= $i . " ";
     } else {
     $pag .= "<a href=\"?page=$i\" title=\"Vai alla pagina $i\">$i</a> ";
     }
     }
     $pag .= "]";
    ?> 
    
    

    [/quote]

    mi riferisco a

    $current_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];

    devo sostituire il valore page esattamente con cosa ?

    Questo perchè , (divide i risultati correttamente in varie pagine ) , ma quando andiamo alla pagina seguente o 2 - 3 che dir si voglia non la trova .

    Per capire meglio il problema vi rimando alla pagina in questione : http://www.rivamania.it/modules.php?name=Uomini che in effetti è un modulo 🙂
    Ringrazio anticipatamente per l'aiuto :fumato:


  • Super User

    Il link è errato: http://www.rivamania.it/modules.php?page=2

    non specifica ?name=Uomini (che penso dovrai aggiungere)


  • User

    Si in effetti avevo provato anche a sostituire '?page' con name=Uomini , ma non lo trova ugualmente 😞
    Evidentemente i moduli puntano a qualcosa che mi sfugge o non so ...

    La domande specifiche sono queste (per chi ha provato questo genere di paginazione) :
    La pagina in cui si trova il codice deve ripuntare a se stessa ?
    In un modulo ci sono degli accorgimenti o modifiche da fare ?

    Ringrazio anticipatamente . Chiedo inoltre scusa , ma sono novello :fumato:


  • Super User

  • User

    Infatti .... ma posto per tutti il risulato dovesse servire a qualcuno

    Innanzi tutto le due prime 'page' vanno lasciate intatte in quanto non interessa più di tanto ... lo script verifica in che pagina si trova e decide di portare i risultati nelle pagine successive (sembra vedersela lui)
    Da modificare eventualmente c'è <a href '?page' nella paginazione.php che scegliete.
    Trattandosi di un modulo avendo una restituzione già complessa '?' al posto del secondo '?' sostituite &.
    Comunque ripeto , a me funziona così anche perchè del codice principale ho cambiato molto, ma magari a voi potrebbe non andare :nonono:

    Ps altra constatazione ... nella prima query SELECT COUNT(id) from nome:tabella WHERE ... tendete a specificare un campo e non (*) ci si guadagna un po' e mi dà la senzazione di maggiore correttezza.

    Ringrazio infine Gorka per la gentilezza e l'aiuto :ciaosai: