Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    118

    Ricerca avanzata con utilizzo delle checkbox

    ciao ragazzi,

    non riesco a far funzionare la ricerca condizionata se l'utente sceglie oltre alla select una o molte caselle checkbox

    Codice PHP:
    <?php    
        
        $errori 
    = array();

        
    $regioni htmlspecialchars($_POST['regioni'], ENT_QUOTES);
        

        if (isset(
    $_POST['invia'])) {
            if (
    $regioni == "") {
                
    $errori[0] = "il campo &egrave; necessario
    "
    ;
            }
        
            if (
    $errori == FALSE) {

                
    //istruzioni sql

                
    include('connessione.php');

                
    $condizione_query "";

                
    $select ""// select di avvio per campi checkbox
                
    if(is_array($_REQUEST['servizio'])) {
                        for (
    $i 0$i count($_REQUEST['servizio']); $i++) {
                            if (
    $select != ""$select .= ", ";
                            
    $select .= $_REQUEST['servizio'][$i];
                        }
                }
                
                if (
    $provincia == "tutte") {
                    
    $condizione_query "SELECT ".$select." FROM ".$table02."";
                }

                if (
    $provincia != "tutte") {
                    
    $condizione_query "SELECT * FROM $table02 WHERE regioneazienda = '$regioni' AND provincia = '$provincia'";
                }

                
                
    $query $condizione_query//query di avvio
                
    $result mysql_query($query) or die(mysql_error());
                
    $number mysql_num_rows($result);

                if (
    $number == 0) {
                    echo 
    "La ricerca non ha prodotto nessun risultato";
                }else{
            
                while(
    $row mysql_fetch_array($result)) {
                
    $nomeazienda $row['nomeazienda'];

                
    ?>

                <div class="errore">
                    <?php echo "$nomeazienda"?>
                </div>

                <?php
                    $displayed
    ++;
                    }
                }    
                
    ?>

                <?php
            
    }
        
        }else{
            
    $errori TRUE;
        }

        if(
    $errori == TRUE) {
        
        
    ?>
            <form method="POST" >
                
                Regioni:<select onchange=setCities(this) name="regioni">
                    <option value="" selected="selected">Seleziona la sezione:</option>
                    <option value="calabria">Calabria</option>
                    <option value="sicilia">Sicilia</option>
                    <option value="lombardia">Lombardia</option>
                </select><? echo $errori[0]; ?>
                

                Provincia:<select name="provincia" class="contenuto">
                    <option value="tutte" selected="selected">--------------</option>
                </select>
                


                servizio1<input type="checkbox" name="servizio[]" value="vini" />
                servizio2<input type="checkbox" name="servizio[]" value="equitazione" />
                <input type="submit" name="invia" value="Invia la richiesta" />

            </form>

        <?
            
    }
        
    ?>

  2. #2
    Beh.... Innanzi tutto, io metterei la action nel tag form ed anche l'enctype (enctype="multipart/form-data", ad esempio).
    Per seconda cosa, visto che non specifichi cosa intendi per "non riesco a far funzionare la ricerca condizionata", andrei a vedere se le variabili arrivano allo script.

    Codice PHP:
    $regione $_POST['regioni'];
    $servizio $_POST['servizio'];

    echo 
    "
    Regione Selezionata: 
    $regione

    "
    ;
    foreach(
    $servizio AS $rigo) {
    echo 
    $rigo."
    "
    ;
    }

    exit; 
    Fatto questo controllino, mi preoccuperei di continuare con le query e tutto il resto dello script.

    Annotazione.
    L'utilizzo dell'array super-globale $_REQUEST è sconsigliato e deprecabile per motivi di sicurezza!
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  3. #3
    Scusate: doppio post!
    Sono le 3:30 d'altronde!
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  4. #4
    Moderatore di Off Topic, Kickstarter e XML L'avatar di Sky
    Registrato dal
    Jul 2000
    residenza
    Roma
    Messaggi
    1,053
    Sono le 3 e mezza, non so se questo tentativo di riscrittura del codice che ho fatto risolverà il problema, ma proviamo comunque.

    Quello che cambia è il codice dall'inclusione del file per la connessione al db fino all'esecuzione della query (esclusi).

    Codice PHP:

    // Escape dei campi del form
    $regioni   mysql_real_escape_string($_REQUEST['provincia']);
    $provincia mysql_real_escape_string($_REQUEST['provincia']);

    // Determiniamo i campi della tabella che dovranno essere estratti, basandoci sulle checkbox selezionate.
    // Se non è selezionata alcuna checkbox, la ricerca avverrà su tutti i campi
    $expr_select count($_REQUEST['servizio'])  ?  implode(', '$_REQUEST['servizio'])  :  '*';
                
    // Costruiamo la clausola WHERE solo se è selezionata una provincia
    if ($provincia != 'tutte')
      
    $condizione_query "WHERE regioneazienda = '$regioni' AND provincia = '$provincia'";

    // Concateniamo le stringhe e otteniamo la nostra query
    $query "SELECT $expr_select FROM $table02 $condizione_query"
    Spiego ciò che ho fatto così in caso di dubbi hai già un chiarimento

    Non ho usato le parentesi graffe con il costrutto if perché è associata una sola istruzione di codice...per renderlo più leggero possibile

    Per selezionare i campi della tabella tramite le checkbox, sfruttiamo il fatto che tutto finisce in un array.
    $_REQUEST['servizio'] sarà comunque un array, quindi il controllo deve verificare quanti elementi contiene.
    Se count() restituisce un numero maggiore di 0 (quindi TRUE) allora almeno una checkbox è selezionata; viceversa, con la funzione implode() raggruppiamo i valori dell'array in un'unica stringa, inserendo ciò che gli abbiamo passato (la virgola) tra un valore dell'array e l'altro. Se il valore è uno solo non sarà inserita alcuna virgola quindi siamo sicuri che non saranno generati errori durante l'esecuzione della query.

    Infine, se è selezionata anche la provincia, viene accodata alla query una condizione WHERE.

    Fammi sapere se funziona, ciao ciao!
    Lo Stato deve dare ai cittadini, come diritto, ciò che la mafia dà come favore.
    Carlo Alberto dalla Chiesa

    Facebook | Twitter | Last.fm | LinkedIn | Quora

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    118
    Ciao Regazzi, nulla....

    x Sky, non va... se spunto le checkbox non tira fuori nulla

    sul db o due colonne messe a 0 o 1 a seconda di chi ha il servizio "vini" e il servizio "equitazione"

  6. #6
    Moderatore di Off Topic, Kickstarter e XML L'avatar di Sky
    Registrato dal
    Jul 2000
    residenza
    Roma
    Messaggi
    1,053
    Allora c'è dell'altro...
    Intanto la tabella del database ha questi due campi di cui prima non sapevamo l'esistenza. La query sarà diversa da quello che mi hai detto.

    Ma soprattutto: che errore ti dà?

    Stasera riscrivo il codice con la nuova query.
    Lo Stato deve dare ai cittadini, come diritto, ciò che la mafia dà come favore.
    Carlo Alberto dalla Chiesa

    Facebook | Twitter | Last.fm | LinkedIn | Quora

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    118
    Ciao Sky,

    nulla, tira fuori pagina bianca se provo a stampare $expr_select, se non seleziono nulla mi stampa * oppure il valore selezionato. Il problema sta forse sui valori delle colonne servizio "vini" e il servizio "equitazione" ?

    una cosa: SERVIZI nel db non esiste esistono 2 colonne che si chiamano: vini e equitazione.
    Se messo a 1 allora il servizio c'è altrimenti no.

    grazie

    Lory

  8. #8
    Moderatore di Off Topic, Kickstarter e XML L'avatar di Sky
    Registrato dal
    Jul 2000
    residenza
    Roma
    Messaggi
    1,053
    Eccomi

    Questo è il nuovo codice:

    Codice PHP:
    // Escape dei campi del form
    mysql_connect('localhost''ekoes_srv''f8f138f75');
    $regioni   mysql_real_escape_string($_POST['regioni']);
    $provincia mysql_real_escape_string($_POST['provincia']);


    $condizioni_query = array();

    // Costruiamo le istruzioni SQl per selezionare i record desiderati, basandoci sulle checkbox selezionate
    // Ogni servizio spuntato implicherà la ricerca dei record che hanno il relativo campo settato a 1
    if (count($_POST['servizio'])) {
      
    $function create_function('$servizio''return "$servizio = 1";');
      
    $condizioni_query += array_map($function$_POST['servizio']);
    }

    if (
    $provincia != 'tutte') {
      
    $condizioni_query[] = "regioneazienda = '$regioni'";
      
    $condizioni_query[] = "provincia = '$provincia'";
    }

    // Costruiamo la clausola WHERE solo se sono stati selezionati i campi di ricerca
    if ($condizioni_query)
      
    $clausola_where 'WHERE 'implode(' AND '$condizioni_query);
      
      
      
    // Concateniamo le stringhe e otteniamo la nostra query
    $query "SELECT * FROM $table02 $clausola_where"
    Potevamo costruire tutto con una serie di condizioni IF, a patto di cambiare il codice ogni volta che si aggiunge o si toglie un nuovo servizio.
    Così invece è sufficiente aggiungere la checkbox e il campo nella tabella perché la query viene creata dinamicamente ogni volta
    Lo Stato deve dare ai cittadini, come diritto, ciò che la mafia dà come favore.
    Carlo Alberto dalla Chiesa

    Facebook | Twitter | Last.fm | LinkedIn | Quora

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    118
    ciao Sky,

    sei un grande sembra funzionare alla grande ;-)

    una cosa che non va però e il fatto che se seleziono una regione, lascio la provincia su tutte e seleziono un servizio, mi tira fuori tutti i servizi con valore 1 anche nelle altre regioni

    grazie
    Lory

  10. #10
    Moderatore di Off Topic, Kickstarter e XML L'avatar di Sky
    Registrato dal
    Jul 2000
    residenza
    Roma
    Messaggi
    1,053
    Ok, togli queste righe di codice:
    Codice PHP:
    if ($provincia != 'tutte') {
      
    $condizioni_query[] = "regioneazienda = '$regioni'";
      
    $condizioni_query[] = "provincia = '$provincia'";

    Al loro posto metti queste:

    Codice PHP:
    if ($regioni)
      
    $condizioni_query[] = "regioneazienda = '$regioni'";

    if (
    $provincia != 'tutte')
      
    $condizioni_query[] = "provincia = '$provincia'"
    Buon proseguimento, ciao
    Lo Stato deve dare ai cittadini, come diritto, ciò che la mafia dà come favore.
    Carlo Alberto dalla Chiesa

    Facebook | Twitter | Last.fm | LinkedIn | Quora

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.