hallo,

ik heb weer een vraagje.
ik ben op zoek naar een manier om mijn database uit te lezen dermate van zoek kriteria.
nu heb ik 1 input veld en dit werpt top!
full textsearch heb ik ook naar gekeken maar naar zo iets ben ik niet op zoek.
ik wil dus bijvoorbeeld 3 input velden onder elkaar :

1 voor zoeken op username
2 voor zoeken op id
3 voor zoeken op mail adres

nu heb ik bij de input name verschillende namen gemaakt dus bv.
zoek1
zoek2
zoek3

en bij mijn query heb ik dit ingevuld :


$query = "SELECT * FROM `user` WHERE (`username` LIKE '%".$zoek1."%' OR `id` LIKE '%".$zoek2."%'OR `usermail` LIKE '%".$zoek3."%'";  




maar als ik nu 3 zoekvelden heb maakt het niet uit wat ik invul maar ik krijg altijd alle gegevens te zien uit de database.

dit komt denk ik door de lege velden.

wat kan ik hier tegen doen???
Als eens een test gedaan met:

 $query = "SELECT * FROM `user` WHERE (`username` LIKE '%".$zoek1."%' AND `id` LIKE '%".$zoek2."%' AND `usermail` LIKE '%".$zoek3."%'"; 

dan zoekt hij op alle combinaties
maar als ik nu 3 zoekvelden heb maakt het niet uit wat ik invul maar ik krijg altijd alle gegevens te zien uit de database.

dit komt denk ik door de lege velden.


Dat klopt.
WHERE .... X LIKE %% OR ... WHATEVER
is hetzelfde als
WHERE TRUE

Je zult je query dynamisch moeten opbouwen, en alleen een LIKE-stuk toevoegen als je zoekterm niet leeg is. En als alle zoektermen leeg zijn dan krijg je inderdaad alles te zien.
ok dat OR ook als TRUE gezien kan worden wist ik niet.
ik had het idee dat hij dan zou kijken of (OR) zoek1 of zoek2 zou kunnen invullen.

met de AND werkt hij wel goed.

kan iemand mij hier verdere uitleg over geven?
ik dacht dat met AND allebei ingevuld hadden moeten worden voor hij wat terug stuurt.

in ieder geval alvast bedankt!
Thomas zijn suggestie over dynamisch opbouwen van de query is natuurlijk juist.

Of je OR of AND moet gebruiken hangt af van wat jij wilt.
Stel je vult username en mail adres in, welke resultaten wil je dan zien. Moeten ze allebei kloppen, dan gebruik je AND, moet 1 van de twee kloppen (of username of mail adres), dan gebruik je OR.
ok dat OR ook als TRUE gezien kan worden wist ik niet.


Verduidelijking: het gaat specifiek om het stukje LIKE %% (oftewel LIKE %<lege zoekterm>%).

Dat is zoiets als LIKE *alles*, wat altijd "waar" is.

Het maakt dan niet meer uit wat er in die andere OR's staat.

Dat bedoelde ik eigenlijk te zeggen.
ok kijk dan is dat duidelijk dus dat het aan de LIKE ligt! weer wat geleerd! bedankt voor jullie snelle reacties!
kan je ook een LIKE en een BETWEEN DATE in 1 query gebruiken??

als ik dat nu probeer dan werkt alleen de BETWEEN nog maar en de LIKE niet meer.
als ik de BETWEEN DATE weg haal werken de LIKE's weer.
Dat kan, maar het hangt er een beetje vanaf hoe je deze twee zoekcriteria wilt combineren:

Moet er ZOWEL aan de LIKE ALSMEDE het datuminterval voldaan worden als je zoekt

OF

er moet OFWEL aan de LIKE OFWEL aan het datuminterval voldaan worden (of allebei)

?
ok dus als ik het goed begrijp moet ik dus een LIKE en een BETWEEN gebruiken?
zonder BETWEEN kan ik anders niet de tussenliggende datums me geven toch?

ik heb nu dit :


<?
$zoekwoord4 = $_POST['zoekwoord4'];
$zoekwoord5 = $_POST['zoekwoord5'];
if($_SERVER['REQUEST_METHOD'] == 'POST')
{											

 $query = "SELECT id, user_name, birthday, TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age FROM users WHERE 

(`id` LIKE '%".mysql_real_escape_string($_POST['zoekwoord'])."%' )

AND (`user_name` LIKE '%".mysql_real_escape_string($_POST['zoekwoord1'])."%' )
AND (`country` LIKE '%".mysql_real_escape_string($_POST['zoekwoord2'])."%' )
AND (`birthday` BETWEEN DATE( DATE_SUB( NOW() , INTERVAL '$zoekwoord5' + 1 YEAR ) ) AND DATE( DATE_SUB( NOW() , INTERVAL '$zoekwoord4' YEAR ) )) ";  
?>


moet dit dan zo iets worden??


<?
AND (`birthday` LIKE '%" BETWEEN DATE( DATE_SUB( NOW() , INTERVAL '$zoekwoord5' + 1 YEAR ) ) AND DATE( DATE_SUB( NOW() , INTERVAL '$zoekwoord4' YEAR ) )"%') ";  
?>
Marcel, dat laatst gaat niet werken.
Beschrijf eens in gewone mensentaal wat je met birthday wilt en wat voor veld birthday is.

Reageren