[PHP/MySQL] LIKE search op meerdere woorden *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BPG908
  • Registratie: Oktober 2001
  • Laatst online: 16-09 23:23

BPG908

Ik ben bijna jarig !

Topicstarter
Ik ben bezich met een scriptje dat mensen een genre kunnen aanklikken.
helaas is de db niet netjes gesorteerd (en te groot om dit als nog te doen)
dus doe ik gewoon b.v. dit geeft je op "\index.php3?genre=hallo" vervolgens zoekt hij ("SELECT * FROM $table where naam like '%$genre%' order by id");.
Dit gaat opzich prima!

Maar er ook zinnen zijn waar hoi en hi en hallo e.d. in voorkomen wil ik bij genre=hallo ook automatich laten zoeken naar die trefworden

PHP:
1
if ($genre == "hallo"){$genre = "hoi+hi+hallo";}


Echter wekkt dit niet |:( , hij zoekt nu naar 'hoi+hi+hallo' en niet naar alle 3 de worden apart. is er een oplossing voor dit probleem ? TNX _/-\o_

Acties:
  • 0 Henk 'm!

  • StarLite
  • Registratie: Januari 2000
  • Laatst online: 03-06 21:17

StarLite

'ON ERROR RESUME NEXT

Eerst de string opsplitsen in losse woorden [is vast wel een commando voor], daarna zoeken op alle 3 de woorden. [dus ff het aantal woorden tellen en met een loopje in je SQL query gooien 8) ]

[ Voor 44% gewijzigd door StarLite op 07-02-2003 22:52 ]

tyrips, tywreps, tiewreps, tiereps, tie raps, ripties, taiwraps, kabelbindbandjes » Tie Wraps
\o/


Acties:
  • 0 Henk 'm!

Verwijderd

("SELECT * FROM $table where naam like".$genre."order by id");.
en dan met
PHP:
1
2
3
<?
if ($genre == "hallo"){$genre = " 'hoi' OR 'hi' OR 'hallo' ";}
?> 

oid

Acties:
  • 0 Henk 'm!

Verwijderd

genre moet je splitten op de + zodat je sql commando over array met lengte 3 beschikt

genereer daaruit het sql commando met een loop.

de output van de loop wordt zoiets als dit:

code:
1
naam like '%$genre[0]%'  OR  naam like '%$genre[1]%' OR  naam like '%$genre[2]%'


dat voeg je toe aan de query en dan moet et goed gaan...

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 07 februari 2003 @ 22:54:
genre moet je splitten op de + zodat je sql commando over array met lengte 3 beschikt

genereer daaruit het sql commando met een loop.

de output van de loop wordt zoiets als dit:

code:
1
*knip


dat voeg je toe aan de query en dan moet et goed gaan...
houd trouwens even in de gaten dat het gebruik van een wildcard % aan het begin van de string je query significant langzamer maakt. Als het niet strikt noodzakelijk is kun je die voorste wildcard beter weghalen. Dat je graag de achterste wilt houden staan kan ik begrijpen :)

mabit, ik snap dat dit slechts een voorbeeld was; ik geef ook slechts een kanttekening ;)

[ Voor 8% gewijzigd door Verwijderd op 07-02-2003 23:02 ]


Acties:
  • 0 Henk 'm!

  • BPG908
  • Registratie: Oktober 2001
  • Laatst online: 16-09 23:23

BPG908

Ik ben bijna jarig !

Topicstarter
Aha, dus dan zou het op deze manier moetten werken ?
PHP:
1
2
3
4
5
<? 
if ($genre == "hallo"){$genre[] = "hallo[1] hoi[2] hi[3] ";} 

naam like '%$genre[0]%'  OR  naam like '%$genre[1]%' OR  naam like '%$genre[2]%'
?> 


(uiteraard staat hiervoven niet de volledige code, maar allen het stukje wara het omgaat..)

Of zie ik dat verkeerd ?, ik heb die functie om het te splitten idd een keer gebruikt maar weet het niet precies meer.
Bij het gebruik van die split functie.., als er dan niks te splitten is
index.php?genre=boter (daar wil ik verder niksmeer aan toevogen) werkt dat dan ook gewoon. of gaat hij dan fouten geven omdat genre[1] en genre[2] leeg zijn ?

Thanks voor die tip van de wild card 8) , ik wist niet dat dit vertragend werkte.

[ Voor 35% gewijzigd door BPG908 op 07-02-2003 23:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

BPG schreef op 07 februari 2003 @ 23:08:
Aha, dus dan zou het op deze manier moetten werken ?
PHP:
1
2
3
4
5
<? 
if ($genre == "hallo"){$genre[] = "hallo[1] hoi[2] hi[3] ";} 

naam like '%$genre[0]%'  OR  naam like '%$genre[1]%' OR  naam like '%$genre[2]%'
?> 


Thanks voor die tip van de wild card 8) , ik wist niet dat dit vertragend werkte.
Nee, het moet worden:

$genre[] = "hallo, hoi, hi"

dan doe je split op de komma, je krijgt dan

genre[0] = "hallo"
genre[1] = "hoi"
genre[2] = "hi"

dit werkt ook als je maar 1 trefwoord hebt...

je moet daarna een functie schrijven die het de lengte van de array telt, en aan de hand daarvan een output maakt via een loop.

Ben geen php-coder dus durf je ff geen codevoorbeeld te geven, maar de werkwijze moet duidelijk zijn?!

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
$genre = "pop+rock+metal";
$genres = explode("+", $genre); //$genres is een array

$where = "";
for($i=0; $i<count($genres); $i++) {
  $where .= "naam like '" . $genre[$i] . "%' OR ";
}
$where = substr($where, 0, strlen($where)-3);
$query = "SELECT somethin FROM table WHERE " . $where;


kunnen errors inzitten, maar dit is het idee ;)

edit:

mabit, alsof ik je gedachten lees :+
explode op "," levert in jouw geval trouwens steeds een ongewilde extra op ;)

[ Voor 39% gewijzigd door Verwijderd op 07-02-2003 23:22 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 07 February 2003 @ 23:20:

edit:
mabit, alsof ik je gedachten lees :+
explode op "," levert in jouw geval trouwens steeds een ongewilde extra op ;)
offtopic:
je zou kunnen, schrijf normaal gesproken in ASP, en daar wertk de comma wel goed... maar je vult me aardig aan :)

Acties:
  • 0 Henk 'm!

  • BPG908
  • Registratie: Oktober 2001
  • Laatst online: 16-09 23:23

BPG908

Ik ben bijna jarig !

Topicstarter
OP de een of andre menier kom ik er toch niet uit, er zit ergens enen foutje dat ik niet kan ondekken.. bj geeft bij mij namlijk niet deselectie die hij zou moetten geven (hij geefet niks)
ik heb de bovenstaande code gebruikt.
Iemand een idee ?

Acties:
  • 0 Henk 'm!

Verwijderd

ik zou eens kijken naar fulltext search (daarbij ga ik uit van mysql)

Maar aan je antwoord te zien weet je nog niet echt veel van php dus misschien is wat algemeen verdiepen in php ook niet slecht.
Zeker als het een te grote database is om te sorteren (:?) lijkt het me geen succes om een hoop like's erop los te gaan

Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
BPG schreef op 10 February 2003 @ 19:52:
OP de een of andre menier kom ik er toch niet uit, er zit ergens enen foutje dat ik niet kan ondekken.. bj geeft bij mij namlijk niet deselectie die hij zou moetten geven (hij geefet niks)
ik heb de bovenstaande code gebruikt.
Iemand een idee ?
Er staat $genre[$i] in plaats van $genres[$i].

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • spine
  • Registratie: Juni 2001
  • Niet online

spine

VISHUDDHI

je hebt in MySQL (als je die gebruikt) een functie Match

[BSDFreaks.nl] [www.Dark-Future.org] [Alizarin.nl]


Acties:
  • 0 Henk 'm!

Verwijderd

Suggestie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$meerwoorden = Array();
$meerwoorden["hallo"] = Array("hello","hoi","hi");

/* Zoeken of er dus meer woorden zijn bij $genre */
if(isset($meerwoorden[strtolower($genre)])
{
$where = "Naam like '$genre%' ";
foreach($meerwoorden[strtolower($genre)] as $ander_genre)
 $where .= " OR Naam like '$ander_genre%'";

}
else
{
$where = "Naam like '$genre%' ";
}

$qeury = "Select dit, dat, zus, zo from table where ".$where;

[ Voor 16% gewijzigd door Verwijderd op 12-02-2003 10:20 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert


BPG
Volgens mij zit je op de verkeerde plaats naar een fout te zoeken. Ik heb het vermoeden dat je formulier gewoon niet helemaal rielekst is...

Hoe ziet je form eruit?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • spine
  • Registratie: Juni 2001
  • Niet online

spine

VISHUDDHI

ja negeer mijn reply maar weer :P

[BSDFreaks.nl] [www.Dark-Future.org] [Alizarin.nl]

Pagina: 1