zoek kriteria.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Marcel sauer

marcel sauer

07/02/2015 16:01:08
Quote Anchor link
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 :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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???
 
PHP hulp

PHP hulp

05/11/2024 16:24:28
 
Jeroen de wilde

Jeroen de wilde

07/02/2015 16:20:46
Quote Anchor link
Als eens een test gedaan met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$query = "SELECT * FROM `user` WHERE (`username` LIKE '%".$zoek1."%' AND `id` LIKE '%".$zoek2."%' AND `usermail` LIKE '%".$zoek3."%'";

dan zoekt hij op alle combinaties
Gewijzigd op 07/02/2015 16:24:17 door Jeroen de wilde
 
Thomas van den Heuvel

Thomas van den Heuvel

07/02/2015 17:19:25
Quote Anchor link
Quote:
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.
 
Marcel sauer

marcel sauer

07/02/2015 17:47:44
Quote Anchor link
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!
 
Jan de Laet

Jan de Laet

07/02/2015 19:21:05
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

07/02/2015 19:44:51
Quote Anchor link
Quote:
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.
 
Marcel sauer

marcel sauer

07/02/2015 21:19:54
Quote Anchor link
ok kijk dan is dat duidelijk dus dat het aan de LIKE ligt! weer wat geleerd! bedankt voor jullie snelle reacties!
 
Marcel sauer

marcel sauer

28/03/2015 21:39:15
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

28/03/2015 22:24:22
Quote Anchor link
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)

?
 
Marcel sauer

marcel sauer

29/03/2015 11:10:32
Quote Anchor link
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 :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$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??

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
AND (`birthday` LIKE '%" BETWEEN DATE( DATE_SUB( NOW() , INTERVAL '$zoekwoord5' + 1 YEAR ) ) AND DATE( DATE_SUB( NOW() , INTERVAL '$zoekwoord4' YEAR ) )"%') ";  
?>
Gewijzigd op 29/03/2015 11:12:35 door marcel sauer
 
Jan de Laet

Jan de Laet

29/03/2015 12:34:02
Quote Anchor link
Marcel, dat laatst gaat niet werken.
Beschrijf eens in gewone mensentaal wat je met birthday wilt en wat voor veld birthday is.
 
Marcel sauer

marcel sauer

29/03/2015 13:45:53
Quote Anchor link
birthday is een veld 0000-00-00

hierbij wil ik dus kunnen zoeken tussen 2 data (BETWEEN)

dus in mensen taal staat er volgens mij in de code

zoek bij 'birthday' tussen datum (nu) en interval $zoekwoord5 (dus bijvoorbeeld 11) zoek alleen Jaartal en tussen datum (nu) en interval $zoekwoord4 (bijvoorbeeld 15) zoek alleen jaartal

dus dan zou hij moeten zoeken alle users die tussen de 11 en 15 jaar zijn.

het eerste voorbeeld werkt prima alleen dan werkt alleen dus de BETWEEN zoekfunctie en niet de losse zoekfuncties.
als ik de BETWEEN regel weg haal dan werken de andere zoekfuncties weer.
 
Thomas van den Heuvel

Thomas van den Heuvel

29/03/2015 13:55:23
Quote Anchor link
In het WHERE-deel van een query leg je extra condities (voorwaarden) op die aangeven waar de gegevens die je ophaalt aan moeten voldoen.

Je kunt meerdere condities opgeven, en deze worden meestal verbonden met AND of OR.

De manier waarop je condities aan elkaar hangt bepaalt welke voorwaarden er moeten gelden.

Stel dat A, B en C (verschillende) condities zijn.

Als je WHERE-deel er als volgt uitziet:

A AND B

Dan houdt dit in dat de opgehaalde gegevens zowel aan A als aan B moeten voldoen (A èn B).

Als je WHERE-deel er als volgt uitziet:

A AND B AND C

Dan houdt dit in dat de opgehaalde gegevens aan alledrie moeten voldoen (A èn B èn C).

Als je daarintegen OR gebruikt zijn de "eisen" wat losser:

A OR B

Houdt in dat er ofwel aan A of aan B moet zijn voldaan (of aan beide, dat is ook goed).

A OR B OR C

Hoeft er zelfs maar aan 1 van de 3 criteria voldaan te zijn of 2 uit 3, of alledrie, dat levert in al die gevallen resultaten op (maar waarschijnlijk niet dezelfde).

Als je AND en OR gaat combineren dan heeft een van de twee "voorrang" (net zoals bij rekenen: machtsverheffen komt voor vermenigvuldigen komt voor delen etc.) maar naar mijn mening kun je beter expliciet zijn in wat je bedoelt:

(A AND B) OR C

levert namelijk hele andere resultaten op dan:

A AND (B OR C)

Simpelweg omdat de haakjes die aangeven welke condities met elkaar geassocieerd zouden moeten worden op een andere plaats staan.

Zoals Jan voorstelt: probeer te verwoorden wat je probeert te bereiken, en probeer dat met bovenstaand verhaal om te zetten in een query, of geef aan wat je probeert te bereiken als dit niet lukt.
 
Marcel sauer

marcel sauer

29/03/2015 13:59:38
Quote Anchor link
TOP UITLEG!
dit ga ik zeker even proberen ik kom hier later op terug!

bedankt!
 
Thomas van den Heuvel

Thomas van den Heuvel

29/03/2015 14:04:59
Quote Anchor link
Wat jij wilt is dus:

<een of andere leeftijdsberekening> BETWEEN <ingevulde_min_leeftijd> AND <ingevulde_max_leeftijd>
 
Marcel sauer

marcel sauer

29/03/2015 14:08:24
Quote Anchor link
ja klopt thomas!

dus de rest zou naar verluid een OR moeten zijn en alleen de leeftijds berekening een AND
en dat zou dan ook tussen BETWEEN () moeten staan
 
Thomas van den Heuvel

Thomas van den Heuvel

29/03/2015 14:41:34
Quote Anchor link
Op stackoverflow stond deze oplossing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))

Wat er in feite gebeurt: Je pakt het verschil in jaren, en corrigeert dit verschil als de verjaardag nog niet geweest is door er nog een extra jaar vanaf te trekken. Hierbij wordt een beetje misbruik gemaakt van hoe er omgegaan wordt met typen, zoals ook in dat bericht staat.

Als je voor date1 NOW() invult en voor date2 de kolomnaam van de geboortedatum dan is dat je leeftijdsberekening.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/03/2015 15:05:12
Quote Anchor link
Waarom omslachtige workarounds verzinnen als er een functie voor bestaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE TIMESTAMPDIFF(YEAR, birth_date, CURRENT_DATE) BETWEEN 20 AND 30
 
Thomas van den Heuvel

Thomas van den Heuvel

29/03/2015 15:29:08
Quote Anchor link
Ger van Steenderen op 29/03/2015 15:05:12:
Waarom omslachtige workarounds verzinnen als er een functie voor bestaat

Omdat wellicht niet iedereen weet van het bestaan van zo'n functie? Ik kon deze zo gauw niet vinden.

Het is fijn dat er een kortere oplossing bestaat, maar in eerste instantie is een werkende oplossing ook goed.

Je had ook kunnen reageren met "hier is een functie voor" in plaats van een retorische vraag. Dat staat wat... vriendelijker.
 
Marcel sauer

marcel sauer

29/03/2015 21:25:26
Quote Anchor link
Ben ik weer even.

Thomas ik heb het geprobeerd met OR maar als ik deze toevoeg dan laat hij altijd alles zien (dus geen selectie)
ik denk dat hij dan ook de lege velden mee rekend van de andere zoek criteria.

die timestamp van Ger ziet er ook logisch uit.

als ik dit in mijn script wil toepassen dan heb ik dit geprobeerd maar dit werkt niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
AND (`birthday` TIMESTAMPDIFF(YEAR, birth_date, CURRENT_DATE) BETWEEN '$zoekwoord5' AND '$zoekwoord4')
?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/03/2015 11:04:09
Quote Anchor link
Het is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AND TIMESTAMPDIFF(YEAR, birthday, CURRENT_DATE) BETWEEN 20 AND 40

Maar je zat eerder ook al in de goede richting want dit kan ook:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AND birthday BETWEEN (CURRENT_DATE - INTERVAL 40 YEAR) AND (CURRENT_DATE - INTERVAL 20 YEAR)

Het verschil tussen:

<elke keer een berekening over kolom> BETWEEN <constante waarde> AND <constante waarde>

Of

<kolomwaarde> BETWEEN <constante waarde> AND <constante waarde>

Waarbij die constante waardes voortkomen uit een eenmalige berekening.
Gewijzigd op 30/03/2015 11:58:45 door Ger van Steenderen
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.