Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

where-gedeelte van een query juist schrijven

Pagina: 1
Acties:
  • 43 views sinds 30-01-2008

  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
where-gedeelte van een query juist schrijven


Volgende where-gedeelte vind geen resultaten:

if ((!empty ($_GET['keywords']) && xtc_not_null($_GET['keywords'])) && (!empty ($_GET['keywords2']) && xtc_not_null($_GET['keywords2']))) {
$where_str .="((pov.products_options_values_name LIKE '%".$keywords."%' AND pov.products_options_values_id = 2 )";
$where_str .="AND (pov.products_options_values_name LIKE '%".$keywords2."%' AND pov.products_options_values_id = 1 ))";

}

Ik zal het wel fout geschreven hebben,maar na uren erna staren en uitproberen,wil het nog niet :(

Volgende versie doet het wel goed,maar ik wil alleen resultaten laten zien waar $keywords EN $keywords2 in zitten.

iif ((!empty ($_GET['keywords']) && xtc_not_null($_GET['keywords'])) && (!empty ($_GET['keywords2']) && xtc_not_null($_GET['keywords2']))) {
$where_str .="((pov.products_options_values_name LIKE '%".$keywords."%' AND pov.products_options_values_id = 2 )";
$where_str .="OR (pov.products_options_values_name LIKE '%".$keywords2."%' AND pov.products_options_values_id = 1 ))";

}

OR in AND veranderen laat dus geen resultaten zien.:mad:

weet iemand hiervoor een oplossing?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Wil je hem eens posten zonder php-code? Dus alleen het SQL gedeelte.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:02

Dido

heforshe

Als je OR in AND verandert (da's geloof ik het enige verschil in de onleesbare brij die je neerzet?) dan wil je alle resultaten waar pov.products_options_values_id gelijk is aan 1 en aan 2. dat zullen er niet veel zijn, schat ik. ;)

Wat betekent mijn avatar?


  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
@Dido
sorry voor de schrijfstijl maar dat is alles wat ik in huis heb :( als absolute beginner.tips voor verbeteringen knoop ik graag achter mijn oor ;)

de haakjes wou ik gebruiken om dit te vermijden.
Net zoals in wiskunde waar je in (1+2)+3 bepaalt wat eerst aan de orde komt.Kan dit dan niet?
Het zou me dan trouwens een raadsel zijn waarom hij in het geval van OR wel alles goed laat zien.

@P_de_B:
WHERE ((pov.products_options_values_name LIKE '%".$keywords."%' AND pov.products_options_values_id = 2 ) AND (pov.products_options_values_name LIKE '%".$keywords2."%' AND pov.products_options_values_id = 1 ))

zo beter?

aanvullende informatie:

wanner ik niet ook op pov.products_options_values_id zoek krijg ik trouwens dezelfde resultaten bij het geval "OR" en ook niets bij het geval "AND"

tabel:

Afbeeldingslocatie: http://felivanderheide.nl/tabel.jpg

[ Voor 16% gewijzigd door flee12 op 21-08-2007 13:44 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:02

Dido

heforshe

flee12 schreef op dinsdag 21 augustus 2007 @ 13:35:
de haakjes wou ik gebruiken om dit te vermijden.
Net zoals in wiskunde waar je in (1+2)+3 bepaalt wat eerst aan de orde komt.Kan dit dan niet?
Het zou me dan trouwens een raadsel zijn waarom hij in het geval van OR wel alles goed laat zien.
Dan moet je je eens afvragen wat OR betekent ;)

Je vraagt het volgende:

Ik wil records van auto's auto's die:
(1)
(Blauw zijn en type 1 zijn) of (Rood zijn en type 2 zijn)
(2)
(Blauw zijn en type 1 zijn) en (Rood zijn en type 2 zijn)

In dat laatste geval zeg je dus (precies zoals met de haakjes van je som) dat je records wilt van auto's die type 1 en type 2 zijn (en auto's die rood en blauw zijn).

Dat levert uiteraard geen resultaat op. Kijk naar het verschil tussen de volgende drie
zinnen:

• Ik wil alle rode auto's en alle blauwe auto's
• Ik wil alle auto's die rood en blauw zijn
• Ik wil alle auto's die rood of blauw zijn

Die eerste zin is gelijk aan de eerste, maar er wordt vaak egdacht dat de tweede hetzelfde is.

Wat betekent mijn avatar?


  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

// ff laatste replies herlezen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
WHERE
    (
        pov.products_options_values_name LIKE '%".$keywords."%'
        AND
        pov.products_options_values_id = 2
    )
        AND
    (
        pov.products_options_values_name LIKE '%".$keywords2."%'
        AND
        pov.products_options_values_id = 1
    )


dus de records met de keywoordjes én values=2 én values=1
-> en 1 en 2 zal wel niet voorkomen zeker

schrijf eerst je gedachten eens op in normale taal en maak dan je query. Gebruik zoals mij voldoende spaties en enters, dan is alles opeens makkelijker. Jij hebt bv al 2 haakjes gewoon die niets doen.

[ Voor 187% gewijzigd door ? ? op 21-08-2007 13:46 ]


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 14:09
*kuch* iets met SQL injectie en $_GET['keywords']. Gebruik mysql_real_escape_string als je dat nog niet al doet ;)

[ Site ] [ twitch ] [ jijbuis ]


  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
FragFrog schreef op dinsdag 21 augustus 2007 @ 13:46:
*kuch* iets met SQL injectie en $_GET['keywords']. Gebruik mysql_real_escape_string als je dat nog niet al doet ;)
op die manier?:

... LIKE mysql_real_escape_string('%".$keywords."%') ...

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 14:09
Uit m'n hoofd moet je de % tekens eruit laten aangezien die anders ook geescaped worden, maar verder wel ja :)

Overigens heeft MySQL ook een full text search functie die beter geschikt is om op keywoorden te zoeken, zie ook de handleiding :)

[ Site ] [ twitch ] [ jijbuis ]


  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
@DIDO:
dit wil ik juist: Ik wil alleen alle auto's die rood en blauw zijn of in mijn geval:
produkten die als merkmal zwart en 8 hebben
Mijn hoofd rookt nu.

nieuwe informatie:


ik vermoed nu dat ik ook naar het FROM-gedeelte moet kijken:

$from_str .= " LEFT OUTER JOIN ".TABLE_PRODUCTS_ATTRIBUTES." AS pa ON (p.products_id = pa.products_id) LEFT OUTER JOIN ".TABLE_PRODUCTS_OPTIONS_VALUES." AS pov ON (pa.options_values_id = pov.products_options_values_id) "; }
$from_str .= "LEFT OUTER JOIN ".TABLE_SPECIALS." AS s ON (p.products_id = s.products_id) AND s.status = '1'";


ik gaa gauw op jullie reacties (bedankt) aantwoorden,zet nu voorbeelden klar.

[ Voor 63% gewijzigd door flee12 op 21-08-2007 14:25 ]


  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

Het verhaal van Dido spreekt boekdelen. Goed uitgelegd. :)

Geef zelf eens een voorbeeld, adh van het tabelletje wat je eerder hebt gepost.
Geef het keyword en keyword2 eens op en vermeld daar eens bij wat het resultaat moet zijn van de select. Tijdens het posten van dat antwoord hier, zal er misschien wel een lampje bij je gaan branden.

Zoiets als keyword 1 = '70',
keyword 2 = 'zwart'
Wat moet dan de resultset zijn van je query?

Alles kan stuk.


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
print eerst eens, vlak voordat je de sql-string gaat uitvoeren, de sql-string op je scherm en bestudeer die eens goed... met logisch denken zoals Dido al heeft aangegeven moet je een eind komen... zo niet, ga dan eens in je database via een admin-tooltje de query aanpassen en kijk wat er gebeurt...

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:02

Dido

heforshe

flee12 schreef op dinsdag 21 augustus 2007 @ 14:12:
@DIDO:
dit wil ik juist: Ik wil alleen alle auto's die rood en blauw zijn
Een laatste hint: er is geen enkele auto die tegelijkertijd rood en blauw is.
Lees mijn drie zinnetjes nog eens heel goed door :)

Auto1: rood
Auto2: blauw

Alle auto's rood en blauw: geen
Alle auto's rood of blauw: Auto1, Auto2

[ Voor 1% gewijzigd door Dido op 21-08-2007 14:40 . Reden: ik blijk kleurendoof 8)7 ]

Wat betekent mijn avatar?


  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

Dido schreef op dinsdag 21 augustus 2007 @ 14:23:
Alle auto's rood en zwart: geen
Alle auto's rood of zwart: Auto1, Auto2
zwart?

Alles kan stuk.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

zwart, blauw, groen, geel, paars, whatever. Voor het voorbeeld maakt dat natuurlijk niet uit ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ga eerst eens gewoon de query schrijven en testen met een database tooltje. Daarna kan je hem naar PHP over zetten.

Op dit moment is natuurlijk nooit duidelijk te overzien wat je fout doet ( al is het al aangegeven ), maar als je al niet eens weet of je query goed is dan moet je het jezelf niet lastiger maken dan het nodig is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
okay hier erstmaal de voorbeeld-site:
*snip*
in het onderste vakje zwart en in het bovenste 70 ingeven aub.Tot nu werkt het niet om maar een vakje in te vullen.(later wel)

Het from-gedeelte:
$from_str .= "
LEFT OUTER JOIN ".TABLE_PRODUCTS_ATTRIBUTES." AS pa ON (p.products_id = pa.products_id) LEFT OUTER JOIN ".TABLE_PRODUCTS_OPTIONS_VALUES." AS pov ON (pa.options_values_id = pov.products_options_values_id) ";

De 2 tabellen:


TABLE_PRODUCTS_ATTRIBUTES AS pa

Afbeeldingslocatie: http://felivanderheide.nl/as_pa.jpg

TABLE_PRODUCTS_OPTIONS_VALUES as pov
Afbeeldingslocatie: http://felivanderheide.nl/as_pov.jpg

En het where-gedeelte:
if ((!empty ($_GET['keywords']) && xtc_not_null($_GET['keywords'])) && (!empty ($_GET['keywords2']) && xtc_not_null($_GET['keywords2']))) {
$where_str .="(pov.products_options_values_name = '".$keywords."'";
$where_str .="AND pov.products_options_values_name = '".$keywords2."')";

}

[ Voor 20% gewijzigd door Creepy op 21-08-2007 15:50 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:48

Janoz

Moderator Devschuur®

!litemod

Lees de posts van Dido nu gewoon nog eens een keertje door. Bedenk daarbij dat de where telkens op 1 records slaat en kom dan ook zelf tot de conclusie dat een record niet 70cm en zwart tegelijk kan zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
Janoz schreef op dinsdag 21 augustus 2007 @ 15:19:
Lees de posts van Dido nu gewoon nog eens een keertje door. Bedenk daarbij dat de where telkens op 1 records slaat en kom dan ook zelf tot de conclusie dat een record niet 70cm en zwart tegelijk kan zijn.
Betekent het nu uiteindelijk dat dan in een veld bij
products_options_values_name

zwart en 70 zou moeten staan om te werken?
Net uitprobeerd en ook geen success.

[ Voor 4% gewijzigd door flee12 op 21-08-2007 15:26 ]


  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

flee12 schreef op dinsdag 21 augustus 2007 @ 15:25:
[...]


Betekent het nu uiteindelijk dat dan in een veld bij
products_options_values_name

zwart en 70 zou moeten staan om te werken?
Net uitprobeerd en ook geen success.
Waar is de like gebleven dan?

Dit:
pov.products_options_values_name = 'zwart' AND pov.products_options_values_name = '70 cm'
Levert nooit resultaat op.

De server gaat per record kijken of hij voldoet aan alle voorwaarden:
Voldoet dit record products_options_values_name = 'zwart'?, zo ja, voldoet datzelfde veld van hetzelfde record OOK aan '70 cm'? zo ja, dan hoort dit record thuis in de resultset. Zo nee, dan hoort het niet thuis in de resultset.
Zoals je zult begrijpen is er geen enkel record waarin zwart EN 70 cm in het namefield staat.
Dit is al vanaf de topicstart je probleem.

HINT: Subquery

[ Voor 8% gewijzigd door remco_k op 21-08-2007 15:33 ]

Alles kan stuk.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Het betekent dat je 2x met die values tabel wil joinen. De 1e alias check je dan op de ene eigenschap, de 2e alias op de ander.

Ik raad je aan om een stapje terug te schakelen en rustig oa nog wat over joins te lezen.

Tevens raad ik je aan om alle links te verwijderen, daar je reeds hebt toegegeven (en je in je code herhaaldelijk laat zien) vatbaar te zijn voor sql injection. Als iemand (FragFrog) je erop wijst dat je je deur niet op slot doet is dat niet zo erg, het is juist behulpzaam en leerzaam, maar dan moet je niet enkele ogenblikken later zeggen waar je woont. ;)
Dat kan ook, maar zolang het met een eenvoudige extra join kan, moet je niet naar subqueries grijpen. Probeer zoveel mogelijk met joins te denken. :)

{signature}


  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

Voutloos schreef op dinsdag 21 augustus 2007 @ 15:35:Dat kan ook, maar zolang het met een eenvoudige extra join kan, moet je niet naar subqueries grijpen. Probeer zoveel mogelijk met joins te denken. :)
Eensch, maar voor een beginner kan het makkelijker zijn om het met een subquery te doen, aangezien je die resultset los kunt bekijken. Ik heb dat tenminste ervaren toen ik hier voor het eerst mee te maken kreeg.
JOINS hebben ook een nadeel; waarschijnlijk moet hij in dit geval ook met GROUP BY gaan werken en dat hoeft bij die subquery dan weer niet. Het maakt het even wat makkelijker.

IMO: Code maak je eerst functioneel, dan pas maak je het goed. Vooral als je niet helemaal weet wat je aan het doen bent.

Alles kan stuk.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Voutloos schreef op dinsdag 21 augustus 2007 @ 15:35:
Dat kan ook, maar zolang het met een eenvoudige extra join kan, moet je niet naar subqueries grijpen. Probeer zoveel mogelijk met joins te denken. :)
Hoezo niet? Ik vindt Sub-queries in sommige situatie's veel duidelijker. Een beetje SQL optimizer kan het dan toch op een efficiente manier uitvoeren. Als je echt performance problemen krijgt kun je altijd nog proberen om te herschrijven.

[ Voor 9% gewijzigd door Woy op 21-08-2007 15:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nou ja, subqueries zijn ook weer niet 'the root of all evil', maar het valt me gewoon op dat er heel snel naar subqueries gegrepen wordt. En dat gebeurd meestal (nofi) omdat het joinen als moeilijk gezien wordt. Maar goed, ik wil er ook geen offtopic querystijl discussie van maken.

{signature}


  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
Voutloos schreef op dinsdag 21 augustus 2007 @ 15:35:
Het betekent dat je 2x met die values tabel wil joinen. De 1e alias check je dan op de ene eigenschap, de 2e alias op de ander.

Ik raad je aan om een stapje terug te schakelen en rustig oa nog wat over joins te lezen.

Tevens raad ik je aan om alle links te verwijderen, daar je reeds hebt toegegeven (en je in je code herhaaldelijk laat zien) vatbaar te zijn voor sql injection. Als iemand (FragFrog) je erop wijst dat je je deur niet op slot doet is dat niet zo erg, het is juist behulpzaam en leerzaam, maar dan moet je niet enkele ogenblikken later zeggen waar je woont. ;)

[...]
Dat kan ook, maar zolang het met een eenvoudige extra join kan, moet je niet naar subqueries grijpen. Probeer zoveel mogelijk met joins te denken. :)
mysql_real_escape_string('".$keywords."') krijg ik nog niet zo goed ingebouwd,maar wou eerst maar bij mijn topic-vraag blijven.En de site is maar een voorbeeld,alleen hiervoor gebruikt.Zal zelfs later niet gebruik maken van dit domein,dus maak ik me er geen zorgen over.

  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
rwb schreef op dinsdag 21 augustus 2007 @ 15:42:
[...]

Hoezo niet? Ik vindt Sub-queries in sommige situatie's veel duidelijker. Een beetje SQL optimizer kan het dan toch op een efficiente manier uitvoeren. Als je echt performance problemen krijgt kun je altijd nog proberen om te herschrijven.
Mag ik een voorbeeld van een sub-query in mijn geval zien?

  • flee12
  • Registratie: Augustus 2007
  • Laatst online: 22-12-2021
(jarig!)
Mag ik van iemand een klein voorbeeld van een sub-queri (van mijn geval) zien?

Verwijderd

flee12 schreef op dinsdag 21 augustus 2007 @ 15:52:
Mag ik een voorbeeld van een sub-query in mijn geval zien?
Tuurlijk: hier is genoeg leesvoer.

  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

Iets wat hier op lijkt:
SQL:
1
2
3
4
5
SELECT ... WHERE values_id IN (
    SELECT values_id FROM PRODUCTS_OPTIONS_VALUES
    WHERE name = 'keywords1'
    OR name = 'keywords2'
)

Alles kan stuk.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Ja ok, zo kan ie wel weer. Dat je AND en OR niet kan plaatsen is 1 ding (daar zit nu net je probleem), maar vervolgens ook nog om een kant en klaar voorbeeld van een subquery vragen gaat te ver en is gewoon een ordinair scriptrequest (zie Programming Beleid - Scriptrequests)

Als je Programming Beleid en met name Programming Beleid - De Quickstart eens door wilt lezen dan graag. Dan snap je hopelijk waarom we scriptrequest e.d. niet willen zien. Daarnaast is een WHERE met een AND en/of een OR redelijke SQL basis waarvan we eigenlijk verwachten dat je dat zelf onder de knie kan krijgen. Als dat niet lukt is dat helemaal niet erg maar geef dan wel duidelijk aan wat je nu zelf hebt geprobreerd, wat daar niet mee lukte en wat je nu wel had verwacht.

[ Voor 66% gewijzigd door Creepy op 21-08-2007 17:03 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.