• User Attivo

    motore di ricerca con più campi

    ciao a tutti
    sto cercando di realizzare un motore di ricerca per dei dati memorizzati su un db mysql. ho 4 form di inserimento dove scrivere le parole da cercare nominativo (text) - tutore (text) - sesso (select) - età (text solo valori numerici)

    inizialmente ho fatto una semplice

    [php]SELECT * FROM xxxxx WHERE nominativo LIKE '%$nominativo%' AND tutore LIKE '%$tutore%' AND sesso LIKE '%$sesso%' AND eta LIKE '%$eta%'[/php]

    ed ho riscontrato due problemi:

    1. se cerco un nominativo e lo scrivo con un ordine nome-cognome diverso da come è memorizato sul db non mi trova niente (es. se nel db ho "paolo rossi" e io scrivo "rossi paolo" non me lo trova);

    2. la ricerca per età non mi restituisce solo l età precisa (es. se scrivo "3" mi trova "3", "13", "23", "33", ecc ecc).

    quindi ho pensato di usare explode

    [php]
    $postnominativo= $_POST['nominativo'];
    $posttutore=$_POST['tutore'];
    $nominativo = explode(" ",$postnominativo);
    $tutore = explode(" ",$posttutore);
    $sesso = $_POST['sesso'];
    $eta= $_POST['eta'];

    $connection = mysql_connect(".............",".............",".................");
    $db = mysql_select_db(".........", $connection);
    $query = "SELECT * FROM ..............WHERE ";
    for ($i=0; $i<count($nominativo); $i++) {
    if ($i > 0) {
    $query .= " AND ";
    }
    $query .= "(nominativo LIKE '%" . $nominativo* . "%')";
    }
    $query .= " ORDER BY id DESC";
    $result = mysql_query($query);
    while( $row=mysql_fetch_assoc($result)){

    ...

    }
    mysql_close($connection);
    ?>
    [/php]

    cosi funziona per il campo nominativo

    e qui mi sono bloccata, non rieco ad ampliare il codice per tutti gli altri campi.

    aiutino?:tongueout:


  • Consiglio Direttivo

    Ciao LauPhp

    credo tu possa togliere il LIKE per il campo sesso ed età ed utilizzare lo stesso metodo che usi per il nominativo anche per il tutore....

    Dicci se risolvi 😉


  • User Attivo

    è come gia stavo provando a fare, ma non va:gtsad:


  • User Attivo

    è una coincidenza o cosi può funzionare?
    che ne pensate?:?

    [php]
    <?
    $postnominativo= $_POST['nominativo'];
    $posttutore=$_POST['tutore'];
    $nominativo = explode(" ",$postnominativo);
    $tutore = explode(" ",$posttutore);
    $nnominativo = count($nominativo);
    $ntutore = count($tutore);
    $totale = $nnominativo+$ntutore;
    $sesso = $_POST['sesso'];
    $eta= $_POST['eta'];

    $connection = mysql_connect(".............",".............",".................");
    $db = mysql_select_db(".........", $connection);
    $query = "SELECT * FROM ..............WHERE ";
    for ($i=0; $i<$totale; $i++) {
    if ($i > 0) {
    $query .= " AND ";
    }
    $query .= "(nominativo LIKE '%" . $nominativo* . "%') AND (tutore LIKE '%" . $tutore* . "%') AND (sesso LIKE'%".$sesso . "%') AND (eta LIKE'%".$eta . "%')";
    }
    $query .= " ORDER BY id DESC";
    $result = mysql_query($query);
    while( $row=mysql_fetch_assoc($result)){

    ...

    }
    mysql_close($connection);
    ?>
    [/php]


  • User Attivo

    resta sempre il problema dell'età

    scrivo 2 e mi escono quelli con 2 anni, 12 anni, ecc


  • Consiglio Direttivo

    @LauPhp said:

    resta sempre il problema dell'età

    scrivo 2 e mi escono quelli con 2 anni, 12 anni, ecc

    sostituisci:
    [PHP]....AND (eta LIKE'%".$eta . "%')"; [/PHP]

    con:
    [PHP]....AND eta='$eta'"; [/PHP]

    vedi , dovrebbe andare 😉


  • User Attivo

    no non va

    se scrivo l età funziona, ma se invece faccio una ricerca solo per nominativo o tutore a esempio (in caso non conosc l età della persona) non mi restituisce niente


  • Consiglio Direttivo

    Allora ti basta impostare un if per dire allo script di considerare la ricerca sul campo eta solo se gli passi un valore 😉


  • User Attivo

    stessa cosa se scrivo questo
    [php]

    $query = "SELECT * FROM ..............WHERE ";
    for ($i=0; $i<$totale; $i++) {
    if ($i > 0) {
    $query .= " AND ";
    }
    if(isset($eta)){
    $query .= "(nominativo LIKE '%" . $nominativo* . "%') AND (tutore LIKE '%" . $tutore* . "%') AND (sesso LIKE'%".$sesso . "%') AND eta= '$eta'";
    } else {
    $query .= "(nominativo LIKE '%" . $nominativo* . "%') AND (tutore LIKE '%" . $tutore* . "%') AND (sesso LIKE'%".$sesso . "%')";
    }
    $query .= " ORDER BY id DESC";
    $result = mysql_query($query);
    [/php]


  • Consiglio Direttivo

    Perchè non provi ad annidare tutti i campi, così la verifica la fa solo su quello che ricerchi?

    [php]if (isset($nominativo)){
    $query .="nominativo LIKE '%$nominativo%'";}
    if (isset($tutore)){
    $query .=" tutore LIKE '%$tutore%'";}

    // etc etc[/php]
    Prova un po così 😉

    .";


  • User Attivo

    😢😢😢 cosi non mi funziona più niente


  • Bannato User Attivo

    @Samyorn

    isset($nominativo) è sempre vera a meno che non si inizializzi a NULL e di default la variabile in oggetto.
    Provai, tempo fa, così per curiosità con ciclo while e quella condizione... Povero web server!!!

    @LauPhp

    Hai provato questo metodo?

    La variabile nominativo trasformala in un Array dove ogni indice conterrà tutte le possibili combinazioni fra nome (eventualmente 2^ 3 ^ 4 ^ 5^ 6^ (....povero bimbo se ha 5 nomi... :P) e cognome).
    Utilizza un po' di risorse (specialmente se i nomi sono diversi...) però è assicurato un risultato certo.

    Altrimenti potresti usare questo:

    INSTR(nominativo, explode(" ", $nominativo))

    quest'ultima restituisce tutte le righe che nella colonna nominativo (primo argomento di INSTR) hanno $nominativo

    Non sono sicuro al 100% che funzioni...mi è venuta ora così...


  • User Attivo

    rieccomi, scusate se rispondo cosi tardi ma sto incasinatissima.
    scusa l'ignoranza portaile84, ma non ho capito bene che intendi dire 🙂


  • User Attivo

    così sembra funzionare, mi date un parere sulla sua efficienza?

    [php]<?
    $postnominativo= $_POST['nominativo'];
    $posttutore=$_POST['tutore'];
    $nominativo = explode(" ",$postnominativo);
    $tutore = explode(" ",$posttutore);
    $nnominativo = count($nominativo);
    $ntutore = count($tutore);
    $totale = $nnominativo+$ntutore;
    $sesso = $_POST['sesso'];
    $eta= $_POST['eta'];

    $connection = mysql_connect(".............",".............",".................");
    $db = mysql_select_db(".........", $connection);
    $query = "SELECT * FROM ..............WHERE ";
    for ($i=0; $i<$totale; $i++) {
    if ($i > 0) {
    $query .= " AND ";
    }
    if ($eta != NULL){
    $query .= "(nominativo LIKE '%" . $nominativo* . "%') AND (tutore LIKE '%" . $tutore* . "%') AND (sesso LIKE'%".$sesso . "%') AND eta ='$eta'";
    }
    else {
    $query .= "(nominativo LIKE '%" . $nominativo* . "%') AND (tutore LIKE '%" . $tutore* . "%') AND (sesso LIKE'%".$sesso . "%')";
    }
    }
    $query .= " ORDER BY id DESC";
    $result = mysql_query($query);
    while( $row=mysql_fetch_assoc($result)){

    echo $row['nominativo']."<br>";
    echo $row['tutore']."<br>";
    echo $row['eta']."<br>";
    echo $row['sesso']."<br>";
    }
    mysql_close($connection);
    ?>[/php]