Avatar billede doncarnage Nybegynder
27. oktober 2010 - 13:41 Der er 26 kommentarer og
1 løsning

Søge på mere end ét ord ved brug af LIKE

Hey eksperter,

Jeg bruger følgende til en simpel søgefunktion på et site:

$queryc = mysql_query("SELECT * FROM tabel WHERE Name LIKE '%$q%' ORDER BY Name DESC")or die(mysql_error());


Men den tager kun ét ord af gangen. Hvis man fx har "Bang & Olufsen" liggende i databasen, så finder man dem ved at søge på "ba". Men hvis man søger på "ba &" gør den ikke..

Hvordan får jeg den udvidet til at søge på flere ord adskilt med mellemrum?
Avatar billede Springform Nybegynder
27. oktober 2010 - 13:50 #1

$search = explode(" ",$q);

foreach($search as $bla){
$zewhere .= " Name LIKE '%$q%' AND ";
}

$queryc = mysql_query("SELECT * FROM tabel WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());


Det er bare ideen der skal tænkes på her. Altså først deler du den søge streng op i et array og så bygger du dit select statement op
Avatar billede Springform Nybegynder
27. oktober 2010 - 13:53 #2
der skal selvfølgelig i den foreach stå LIKE '%$bla%', og så skal du lige finde ud af hvordan du ikke ender på et AND
Avatar billede coderdk Praktikant
27. oktober 2010 - 13:55 #3
efter foreach: $zewhere .= "1 ";
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 14:23 #4
Bum bum... Er ikke helt med på hvad du mener med det "AND"?

Hvis jeg prøver med nedenstående, søger den blot ud fra det sidste ord i søgningen så vidt jeg lige kan se:

$search = explode(" ",$q);

  foreach($search as $bla){
  $zewhere = "Name LIKE '%$bla%'";
  }

$queryc = mysql_query("SELECT * FROM tabel WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());
Avatar billede arne_v Ekspert
27. oktober 2010 - 14:43 #5
Overvej evt. FULLTEXT muligheden.

Mange:
  WHERE LIKE felt LIKE '%noget%'

er draebende for performance!
Avatar billede Springform Nybegynder
27. oktober 2010 - 15:29 #6

$search = explode(" ",$q);

  foreach($search as $bla){
  $zewhere .= " Name LIKE '%$bla%' AND ";
  }
$zewhere .= " 1=1 "

$queryc = mysql_query("SELECT * FROM tabel WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 17:09 #7
Haha, fedt at jeg får det serveret på et sølvfad og så ikke en gang opdager det :) DOH!

Jeg bruger i øvrigt disse få linjer til at farve ordet/bogstaverne i søgeresultaterne:

$res_af_s = $row['Name'];
$soeg =  $_GET['q'];
$resultat = eregi_replace($soeg, "<span style='background-color: yellow'>" . $soeg . "</span>", $res_af_s);


Lige nu farver det kun den sidste del af ordet.. Er det muligt at få det til at farve alle ordene i søgningen også vha. en foreach?

Arne: Det er et forholdsvist lille privat projekt så derfor tror jeg i første omgang jeg vil holde mig til det nuværende, men hvis jeg kaster mig ud i en større søgemaskine vil jeg kigge nærmere på FULLTEXT, hvis jeg kan mærke det går ud over performance ;)
Avatar billede Springform Nybegynder
27. oktober 2010 - 17:36 #8
Det skal du så gøre inde i din while løkke

$search = explode(" ",$q);

foreach($search as $bla){
  $zewhere .= " Name LIKE '%$bla%' AND ";
}
$zewhere .= " 1=1 "

$queryc = mysql_query("SELECT * FROM tabel WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());

while($row = mysql_fetch_assoc($queryc)){
  $name = $row['Name'];
 
  foreach($search as $bla){
  $resultat = eregi_replace($bla, "<span style='background-color: yellow'>" . $bla . "</span>", $name);
}
echo $resultat;


Det burde gøre jobbet
Avatar billede Springform Nybegynder
27. oktober 2010 - 17:38 #9
jeg er virkelig dårlig til at læse mine ting igennem men der mangler lige en '}' efter 'echo $resultat;'
Avatar billede Springform Nybegynder
27. oktober 2010 - 17:41 #10
Prøver lige igen der var lige endnu en fejl :P


$search = explode(" ",$q);

foreach($search as $bla){
  $zewhere .= " Name LIKE '%$bla%' AND ";
}
$zewhere .= " 1=1 "

$queryc = mysql_query("SELECT * FROM tabel WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());

while($row = mysql_fetch_assoc($queryc)){
  $name = $row['Name'];
 
  foreach($search as $bla){
  $name = eregi_replace($bla, "<span style='background-color: yellow'>" . $bla . "</span>", $name);
  }
  echo $resultat;
}
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 17:51 #11
Har lige prøvet begge, men det er desværre stadig kun det sidste ord, der bliver farvet til trods for at det står inde i løkken :S
Avatar billede Springform Nybegynder
27. oktober 2010 - 18:01 #12
Tror egentlig heller ikke du behøver den foreach og så bare istedet smid array'et ind så

$name = eregi_replace($search, "<span style='background-color: yellow'>" . $bla . "</span>", $name);
Avatar billede Springform Nybegynder
27. oktober 2010 - 18:03 #13
Note til mig selv: læs før du poster


$search = explode(" ",$q);

foreach($search as $bla){
  $zewhere .= " Name LIKE '%$bla%' AND ";
}
$zewhere .= " 1=1 "

$queryc = mysql_query("SELECT * FROM tabel WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());

while($row = mysql_fetch_assoc($queryc)){
  $name = $row['Name'];
 
  $resultat = eregi_replace($search, "<span style='background-color: yellow'>" . $search . "</span>", $name);
 
echo $resultat;
}
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 18:12 #14
Er ked af at sige det, men det er desværre stadig samme resultat når jeg lige udskifter $search med $bla :/
Avatar billede Springform Nybegynder
27. oktober 2010 - 18:15 #15
Det skal være $search og ikke $bla. Lige som jeg skrev i den sidste. Jeg laver lige en test selv, det virker ihvertfald i mit hoved :P
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 18:25 #16
Den farver desværre slet ikke noget med $search hehe
Avatar billede Springform Nybegynder
27. oktober 2010 - 18:53 #17
har fundet fejlen, brug str_replace() istedet for eregi_replace(), men samme syntax.
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 19:03 #18
Har prøvet med dette nu så, men der tager den stadig kun for det sidste bogstav desværre + den erstatter ordet med navnet "Array":


$q = $_GET["q"];
$search = explode(" ",$q);

foreach($search as $bla){
  $zewhere .= " Name LIKE '%$bla%' AND ";
}

$zewhere .= " 1=1 ";

$queryc = mysql_query("SELECT * FROM tbl_customer WHERE $zewhere ORDER BY Name DESC")or die(mysql_error());


while($row = mysql_fetch_array($queryc)){

$name = $row['Name']; 
$resultat = str_replace($search, "<span style='background-color: yellow'>" . $search . "</span>", $name);

echo $resultat;
}
Avatar billede Springform Nybegynder
27. oktober 2010 - 19:13 #19
http://kennet.springform.dk/ der virker det

det er fordi jeg glemmer at fortælle dig det hele :P, har været en lang dag


while($row = mysql_fetch_array($queryc)){

$name = $row['Name'];
 
foreach($search as $b){
$resultat = str_replace($b, "<span style='background-color: yellow'>" . $b . "</span>", $name);
}

echo $resultat;
}


Du må lige selv give variablerne nogle sigende navne
Avatar billede Springform Nybegynder
27. oktober 2010 - 19:15 #20
jeg skriver kun en gang mere, og så skal det altså testes inden jeg  skriver, glem det jeg skrev det driller stadig
Avatar billede Springform Nybegynder
27. oktober 2010 - 19:17 #21
der manglede et punktum så NU tror jeg den er der


foreach($search as $b){
  $resultat .= str_replace($b, "<span style='background-color: yellow'>" . $b . "</span>", $name);
}
Avatar billede Springform Nybegynder
27. oktober 2010 - 19:19 #22
og så tilføj lige

$resultat = "";

i starten af while løkken

Så tror jeg dette er gået hen og blevet expertens største spam tråd
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 19:30 #23
Haha, vi er godt på vej derhen af nu i hvert fald :D Eneste problem nu er så vidt jeg lige kan se at den udskriver $resultat 2 gange nu, hvor det kun skal udskrives én gang :/

while($row = mysql_fetch_array($queryc)){

$resultat = "";
$name = $row['Name'];
 
foreach($search as $b){
$resultat .= eregi_replace($b, "<span style='background-color: yellow'>" . $b . "</span>", $name);
}

echo $resultat;
Avatar billede Springform Nybegynder
27. oktober 2010 - 20:19 #24
Det problem har jeg løst, men er groet lidt fast nu. Må hellere få noget mad.

Men prøv søg på fx. "a y" på http://kennet.springform.dk/

Så laver den en replace i det der allerede er udskiftet det vil sige den kringler. Jeg vil tro at man skal bruge preg_replace() og så sige at den ikke skal lave en replace hvis mellem '<' og '>' men kan være du skal oprette en tråd med det problem, den her er vel egentligt besvaret.
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 22:23 #25
Hmm... Det var mystisk at at den dobler op hos mig så, men kan se det er pga. det punktum, der bliver sat efter $resultat :S

Jo naturligvis.. Smid endelig et svar, så du kan få dine velfortjente points ;)
Avatar billede Springform Nybegynder
29. oktober 2010 - 19:37 #26
Det var fordi jeg har lavet nogle ændringer, men det er grim kode så det før du ikke :P
Avatar billede doncarnage Nybegynder
30. oktober 2010 - 16:09 #27
Haha, helt i orden ;) Droppede bare lige markeringen her i første omgang..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester