Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    149

    Query con ordinamento variabile

    Buonasera,
    vorrei creare tramite select in una form la possibilità di dire ORDINA I DATI PER...in modo tale che dopo la submit i dati vengano ordinati secondo i piaceri dell'utente.
    Ho questo codice:

    Codice PHP:
    $lettura_risultati=mysql_query

    ("select id, nome_utente, t_st, n_st, n_st, l_st, m_s, a_s, t_rec, vt_st, vt_qu_cam, vt_ris, vt_pul, vt_eff_s, tst_rec, date_format(data_ora_ins, '%d/%m/%Y - ore %H:%i:%s') as data_formattata, 

    MATCH(n_st, t_st, n_st, l_st) AGAINST('"
    $_POST['campo_query_nome'] ." "$_POST['campo_query_tipo'] ." "$_POST['campo_query_naz'] ." "$_POST['campo_query_luogo'] ."' IN BOOLEAN MODE) AS tot 

    from recensioni where MATCH(n_st, t_st, n_st, l_st) AGAINST('"
    $_POST['campo_query_nome'] ." "$_POST['campo_query_tipo'] ." "$_POST['campo_query_naz'] ." "$_POST['campo_query_luogo'] ."' IN BOOLEAN MODE) 

    order by tot DESC"
    ); 
    Vorrei che in questo ORDER BY ci fosse una variabile che va a leggere la select della form, perchè vorrei dare la possibilità all'utente di selezionare nella form se vuole ordinare i dati per t_st o per n_st o per l_st o per m_s o per a_s.
    Come posso fare?cosa devo scrivere al posto di order by tot desc?
    Grazie mille

  2. #2
    Codice PHP:
    $order $_REQUEST['cmb_orderby'];   // cmb_orderby è ovviamente la select nella pagina precedente

    switch($order) {
       case 
    "t_st":
       case 
    "n_st":
       case 
    "l_st":
       case 
    "m_s":
       case 
    "a_s":
           
    $orderby_clause "ORDER BY $order DESC";
           break;
       default:
           
    $orderby_clause "ORDER BY tot DESC";
    }


    $lettura_risultati=mysql_query

    ("select id, nome_utente, t_st, n_st, n_st, l_st, m_s, a_s, t_rec, vt_st, vt_qu_cam, vt_ris, vt_pul, vt_eff_s, tst_rec, date_format(data_ora_ins, '%d/%m/%Y - ore %H:%i:%s') as data_formattata,

    MATCH(n_st, t_st, n_st, l_st) AGAINST('"
    $_POST['campo_query_nome'] ." "$_POST['campo_query_tipo'] ." "$_POST['campo_query_naz'] ." "$_POST['campo_query_luogo'] ."' IN BOOLEAN MODE) AS tot

    from recensioni where MATCH(n_st, t_st, n_st, l_st) AGAINST('"
    $_POST['campo_query_nome'] ." "$_POST['campo_query_tipo'] ." "$_POST['campo_query_naz'] ." "$_POST['campo_query_luogo'] ."' IN BOOLEAN MODE)

    $orderby_clause"); // <--- abbiamo messo la order risultante qua..... 
    credo che sia sufficiente.....

    ovviamente i valori delle option della select devono avere 'value' ai valori che ho scritto nello switch.
    NB: non è molto sicuro perchè tramite i valori delle option posso leggermi i nomi di attributi direttamente presenti nel database; quindi sarebbe meglio aggiungere un passaggio (tipo, se selezione ordinamento con valore 1 nella combo, PHP sa già che 1 equivale a "n_st")
    Codice PHP:
    $order $_REQUEST['cmb_orderby'];   // cmb_orderby è ovviamente la select nella pagina precedente

    $order_attrib = array("t_st""n_st""l_st""m_s""a_s");

    switch(
    $order) {
        case 
    1:
        case 
    2:
        case 
    3:
        case 
    4:
        case 
    5:
            
    $orderby_clause " ORDER BY $order_attrib[$order] DESC ";
        default:
            
    $orderby_clause " ORDER BY tot DESC";

    e quindi la select sarà tipo:
    codice:
    <select name="cmb_orderby" ..... etc, etc...>
      <option value="1">t_st</option>
      <option value="2">n_st</option>
      <option value="3">l_st</option>
      ....
      ...
    </select>
    caput?

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    149
    Ciao Pictor,
    grazie mille per la tua risposta, non ho ben capito il secondo discorso dove mi parli di selezionare l'ordinamento con valore 1 nella combo, in modo tale che PHP sa già che 1 equivale a "n_st"...
    Grazie mille

  4. #4
    Clark Kent si faceva chiamare Superman
    Bruce Wayne si faceva chiamare Batman
    Peter Parker si faceva chiamare Spiderman
    n_st si faceva chiamare 1


    n_st è un nome di un campo di un database. Non è sicuro sbandierare questi nomi ai quattro venti. Un hacker/cracker che riuscisse ad avere accesso, tramite qualche baco, al database MySQL, avrebbe in questo modo un nome di proprietà in più su cui 'giocare' per ottenere informazioni in modo malevolo.
    Non bisognerebbe mai far sapere all'esterno i nomi dei campi e delle tabelle che usiamo all'interno....

    Come ti ho scritto dopo invece 'n_st' all'esterno si fa semplicemente conoscere come "1 di cmb_orderby" e non come sè stesso.

    Non è fondamentale ma è comunque da evitare di usare nomi di attributi delle tabelle direttamente in pagine HTML (che posso leggermi semplicemente con "Visualizza->Codice Sorgente" dal mio browser)

    Mi son spiegato?

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    149
    Grazie pictor, ti sei spiegato benissimo.
    Quindi io nelle istruzioni

    Codice PHP:
    switch($order) { 
        case 
    1
        case 
    2
        case 
    3
        case 
    4
        case 
    5
    non devo aggiungere nient'altro dopo i : ?
    Grazie mille sai, perdonami le domande banali, ma ci sto mettendo impegno per capire come funziona php ma sono comunque alle prime armi...

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    149
    Mi sono spiegato da cani...intendo, mi sono perso nel punto in cui devo associare per esempio n_st al valore 1 etc, come posso scriverlo in php?
    Grazie

  7. #7
    Il codice l'ho già scritto tutto io

    Dopo 1: (non i: ) non ci va niente, perchè lo switch controlla che il valore sia 1, 2, 3, 4 o 5.
    Se rientra in questi valori fa per tutti la stessa cosa.

    tu sai che dalla <select> che
    t_st corrisponde a 1 (<option value="1">t_st</option>)
    e così tutti gli altri

    $order assume il valore selezionato nella <select> (tramite $_REQUEST o $_POST). Di conseguenza ha un valore tra 1 e 5. E' paragonabile quindi ad un indice, visto che abbiamo creato un array che associa alla posizione:
    1 -> "t_st"
    2 -> "n_st"
    3 -> "l_st"
    ... etc...


    Ho scritto senza specificare i valori, perchè PHP, se non specifichi una chiave, all'inserimento di un nuovo valore ne crea una in automatico usando il primo numero di indice disponibile. Leggi il manuale degli array per capire meglio.

    Ho fatto così
    Codice PHP:
    $order_attrib = array("t_st""n_st""l_st""m_s""a_s"); 
    ma è equivalente a
    Codice PHP:
    $order_attrib = array(
       
    => "t_st"
       
    => "n_st"
       
    => "l_st"
       
    => "m_s"
       
    "a_s"); 
    Assegno gli indici a mano.... ma nel caso di "a_s" prenderà il valore 5 in automatico, perchè è il primo indice numerico disponibile (fino al 4 li ho già assegnati).

    Insomma comunque dopo che ho fatto le assegnazioni poi vado ad usare il valore di $order come indice dell'array e mi vado a recuperare il valore corrispondente.

    Quindi $order_attrib[4] sarà uguale a "m_s"..... torna no? Queste sono le basi del PHP....

    Se scrivo una serie di
    Case 1:
    case 2:
    case 3:
    echo "123";


    e non specifico istruzioni, in caso di corrispondenza si andrà ad eseguire il prima blocco per trovato (quello di case 3, anche in caso di 1 o di 2).

    Il break infatti serve per limitare questi blocchi.... comunque leggiti il manuale dello switch, non posso spiegarti tutto quanto.


    Per il resto, dopo il reperimento del campo da usare come ordinamento, viene creata la clausola ORDER BY e poi inserita nella stringa della query.

    Leggiti la documentazione PHP ogni volta che trovi qualcosa che non capisci.... almeno le basi te le fai solide...

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    149
    Ciao pictor, una domanda, ma quel valore default quando viene richiamato?se metto nella select value=""?
    Codice PHP:
    default: 
            
    $orderby_clause " ORDER BY tot DESC"
    Grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    149
    Ciao pictor,
    ho inserito il codice nel mio sorgente, togliendo quel "TOT" dell'ORDER BY TOT mi funziona l'ordinamento ma purtroppo non mi mette nelle prime righe i risultati che sorrispondono al valore indicato nella form.
    Esempio, se cerco nella form il valore "giovanni" e ordino i risultati per anno, se nei record ho 2 giovanni in due anni differenti vorrei che nelle prime due righe venissero fuori questi giovanni e che, proprio a parità di nome, questi venisserero ordinati per anno(in questo esempio, oppure ordinati per altri elementi decisi sempre nella form. Invece cosi com'e' ora il sorgente se cerco giovanni, ordino per anno, ma prima di quell'anno ci sono nel database altri nomi con anni precedenti, nelle prime righe mi vengono esposti proprio questi nomi, e poi in fondo i due record giovanni...
    Come posso fare?
    Grazie mille

  10. #10
    Non capisco se vuoi più parametri di ordinamento o se un filtro esclude l'altro....

    ....Nel primo caso...

    Puoi memorizzarti le selezioni.

    Per esempio in una sessione (che si mantiene tra le pagine) aggiungi ogni volta il numero selezionato nella combo/select.
    In questo modo puoi impostare la priorità di ordinamento.

    Scegli "Nome" e ti ordina per nome.
    Scegli "Anno" e ti ordina per nome e per anno.
    Scegli "altro" e ti ordina per nome, per anno e per altro...

    Però aggiungi aggiungi e finisci che non ti cambia più niente. Ti ci vorrebbe un tasto che resetta l'ordinamento (svuota la variabile di sessione).

    Oppure ti fai più <select> uguali a come abbiamo fatto fin'ora:
    Select 1 per il primo attributo di ordinamento
    Select 2 per il secondo attributo di ordinamento
    Select 3 per il terzo attributo di ordinamento


    ....Nel secondo caso...
    Probabilmente quando usi la select per cambiare pagina non passi, oltre al valore della combo per l'ordinamento, anche il valore del campo di ricerca (dove scrivi 'giovanni').
    Quindi di conseguenza lui capisce solo che deve ordinarti secondo un certo criterio e si perde l'informazione che questo dovrebbe farlo sui risultati della ricerca di 'giovanni'.

    Non so come passi i dati alla pagina successiva. Devi farti passare tutti i valori dei campi della form quando cambi pagina, altrimenti non puoi combinare le cose.

    PS - Per la 'default' dello switch te l'ho già detto: leggiti il manuale. Non posso (e voglio) spiegarti tutto quello che potresti semplicemente leggere...

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.