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

    [PHP&MySQL] Cercare con più criteri

    Ciao a tutti,
    sto cercando di creare un piccolo motore di ricerca per un elenco iscritti.

    Tanto per incominciare spiego subito quale è la struttura.

    Ho una tabella utenti con tanti dati, ma quelli sensibili sono:

    tabella utenti
    ---------------------
    NumeroIscrizione
    DataIscrizione
    Cognome
    Nome
    Laurea
    Sezione
    Settore

    Io dovrei permettere all'untente che accede al sistema di cercare l'utente registrato inserendo i filtri che ritiene più opportuni.

    Per questo ho creato un semplice form che contiene:
    NumeroIscrizione: Campo Input TEXT
    Cognome: Campo Input TEXT
    Nome: Campo Input TEXT
    Laurea: Campo Select con tante opzioni
    Sezione: Campo Radio con due elementi
    Settore: Campo Check con tre opzioni

    Per poi realizzare la query in questa maniera.
    Codice PHP:
    //Controllo se search è attivato per sostituire con i risultati della ricerca invece che con i risultati visualizzati
    if(isset($_GET['search']) and $_GET['search'] == true){

    //Inizio la composizione della tabella
        
    $q "SELECT * FROM ".$tabella utenti." WHERE ";

    //Controllo se l'imput cognome è stato impostato, se risulta vero e non vuoto aggiungo alla tabella questa opzione di ricerca in più.
        
    if(isset($_POST['cognome']) and $_POST['cognome'] <> ''){
          
    $q .= "Cogn LIKE '%".$_POST['cognome']."%' and";
        }

    //Come sopra
        
    if(isset($_POST['nome']) and $_POST['nome'] <> ''){
          
    $q .= "Nome LIKE '%".$_POST['nome']."%' and";
        }

        
        if(isset(
    $_POST['laurea']) and $_POST['laurea'] <> ''){
          
    $q .= "Laurea = '".$_POST['laurea']."' and";
        }
     
    //Come sopra   
        
    if(isset($_POST['niscrizione']) and $_POST['niscrizione'] <> ''){
          
    $q .= "NumIscr = '".$_POST['niscrizione']."' and";
        }

    //Come sopra
        
    if(isset($_POST['data']) and $_POST['data'] <> ''){
          
    $q .= "DataIscrizione LIKE '".$_POST['data']."%' and";
        }
        
    //Elimino l'ultimo "and" inserito.
        
    $q substr($q0, -3);

    //Chiudo la query ordinandola per cognome in maniera crescente.
        
    $q .= "ORDER BY Cogn ASC";
      } 
    Sembra che funzioni anche se non correttamente. Perchè nel momento in cui imposto più di un campo di ricerca non ottengo nessun risultato.
    Avete altri metodi per la costruzione di un query che si adatti a questo tipo?
    O meglio sapete il perchè?

    Vi ringrazio in anticipo

    PS: Come magari avete notato non è stato effettuata la ricerca sui campi settore e sezione, questo perchè il processo per ottenerli è un pò più complicato e dopo aver risolto questo problema passerò a loro.
    Ideabile - Web Design
    Me on Flickr
    http://www.flickr.com/photos/m3kh

    Soit qui mal y pense...

  2. #2
    Prima di analizzare il codice e le query, considera questo semplice fatto:
    codice:
    $q .= "Cogn LIKE '%".$_POST['cognome']."%' and";
    ...
    $q .= "Nome LIKE '%".$_POST['nome']."%' and";
    se non metti uno spazio dopo and, il risultato e':
    codice:
    $q .= "Cogn LIKE '%".$_POST['cognome']."%' andNome LIKE '%".$_POST['nome']."%' and";
    la parte in rosso e' un syntax error.

  3. #3
    Grazie mille K.b

    Effetivamente, avevo fatto inizialmente un conto degli spazi che poi ho dimenticato.

    Comunque, visto che sei stato così attento e gentile, chiedo un'altro aiuto, sperando di non approfittarmene.
    Allora, come accennato in precedenza ho anche due form radio e tre checklist. Però il database da quale io ricevo i dati, a cui non è possibile effetuare dei cambiamenti ha la seguente struttura.

    Tabella utenti
    ---------------------
    NumeroIscrizione
    DataIscrizione
    Cognome
    Nome
    Laurea
    SezioneASettoreA
    SezioneASettoreB
    SezioneASettoreC
    SezioneBSettoreA
    SezioneBSettoreB
    SezioneBSettoreC

    Praticamente uno deve essere obbligatoriamente iscritto sia a una sezione che ad un settore.
    Può iscriversi su più settori ma non su più sezioni.

    Per segnalare l'iscrizione alla sezione ed al settore lui utilizza l'operatore 1, in caso contrario 0.
    Ma come faccio a effettuare una query, che si concatena alle precedenti, per trovare il risultato su almeno una delle celle di selezione? Un Left Join forse?

    Grazie mille per qualsiasi aiuto. Ma non riesco neanche a immaginare la soluzione.
    Ideabile - Web Design
    Me on Flickr
    http://www.flickr.com/photos/m3kh

    Soit qui mal y pense...

  4. #4
    Non ho capito, fammi un esempio di dati concreti (anche se inventati) e del risultato che devi ottenere.

  5. #5
    Allora ho un utente Mario che iscritto alla sezione A, nei settori A,B,C

    NumeroIscrizione = 001
    DataIscrizione = 04/10/2010
    Cognome = Bianchi
    Nome = Mario
    Laurea = Informatica
    SezioneASettoreA = 1
    SezioneASettoreB = 1
    SezioneASettoreC = 1
    SezioneBSettoreA = 0
    SezioneBSettoreB = 0
    SezioneBSettoreC = 0

    E un altro utente Giovanni iscritto alla sezione B, nel solo settore A

    NumeroIscrizione = 002
    DataIscrizione = 05/10/2010
    Cognome = Rossi
    Nome = Giovanni
    Laurea = Biomedica
    SezioneASettoreA = 0
    SezioneASettoreB = 0
    SezioneASettoreC = 0
    SezioneBSettoreA = 1
    SezioneBSettoreB = 0
    SezioneBSettoreC = 0


    Nel form della ricerca praticamente io ho due pulsanti Radio (Quelli con i pallini che ti obbligano ad una sola scelta, per capirci),
    Uno che indica la sezione A e l'altro che indica la sezione B.

    Poi ho tre checkbox (i quadratini selezionabili) con i settori A, B, C.
    In pratica l'utente può selezionare una sola sezione ma più settori.

    Solo che per controllare se è nella sezione A devo effettuare il controllo in:
    SezioneASettoreA = 1 OR
    SezioneASettoreB = 1 OR
    SezioneASettoreC = 1

    e non sò se funziona dopo le dichiarazioni AND fatte in anticipo.
    Inoltre devo rieffettuare il controllo in caso le checkbox siano selezionate e quindi ripeterei di nuovo le stesse condizioni di ricerca, che penso mi causerebbero un errore.
    Ideabile - Web Design
    Me on Flickr
    http://www.flickr.com/photos/m3kh

    Soit qui mal y pense...

  6. #6
    Usa le parentesi per essere sicuro di non sbagliare le precedenze (AND ha precedenza maggiore di OR quindi senza parentesi questo caso non funziona) e anche per maggiore leggibilita'. Esempio:
    codice:
    SELECT bla bla bla
    WHERE (condizione1)
    AND   (condizione2)
    AND   (condizione3 OR
           condizione4 OR
           condizione5)
    AND   (condizione6)
    ....

  7. #7
    Grazie mille K.b
    Tutto funziona correttamente, almeno così sembra
    Ideabile - Web Design
    Me on Flickr
    http://www.flickr.com/photos/m3kh

    Soit qui mal y pense...

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.