- Home
- Categorie
- Coding e Sistemistica
- PHP
- motore di ricerca con più campi
-
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:
-
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);
-
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?
-
-
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
-
è come gia stavo provando a fare, ma non va
-
è 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]
-
resta sempre il problema dell'età
scrivo 2 e mi escono quelli con 2 anni, 12 anni, ecc
-
@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
-
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
-
Allora ti basta impostare un if per dire allo script di considerare la ricerca sul campo eta solo se gli passi un valore
-
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]
-
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ì.";
-
cosi non mi funziona più niente
-
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!!!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ì...
-
rieccomi, scusate se rispondo cosi tardi ma sto incasinatissima.
scusa l'ignoranza portaile84, ma non ho capito bene che intendi dire
-
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]