webForumDet fria alternativet

Sökfunktion som plockar flera sökord

Databaser & SQL

4 svar · 558 visningar · startad av niNe

Medlem sedan maj 2005138 inlägg
Frågan#1

Tjenare

Har en sökfunktion på min site som funkar klockrent när man söker på ett ord. Nu skulle jag ju då vilja utöka denna till att leta på flera ord.

Min SQLquery ser ut enligt nedan:

$search = $_GET['search'];
$news = mysql_query("SELECT * FROM news WHERE info LIKE '%".$search."%' AND publish='1' OR headline LIKE '%".$search."%' AND publish='1' ORDER BY newsdate DESC");

Om jag börjar söka på fler ord så får jag ju inga träffar. Sökfältet skickar ju dock ut Sökord1+sökord2... Någon som kan skicka mig i rätt riktning.

Medlem sedan okt. 2002257 inlägg
#2

Du måste använda lite parenteser:

SELECT * FROM news WHERE
(info LIKE '%".$search."%' OR headline LIKE '%".$search."%') AND publish='1'
ORDER BY newsdate DESC

Medlem sedan maj 2005138 inlägg
#3

Mja, det löser ju inte riktigt mitt problem. Jag behöver dock inte skriva in "publish" vilket uppskattas. Får dock inga träffar på fler ord än ett...

Medlem sedan aug. 20039 340 inlägg
#4

LIKE är intelligent på det sättet som man kanske tror. LIKE '%sökord1+sökord2%' t ex söker just efter strängen sökord1+sökord2. Vad du måste göra är att dela upp strängen i till en array t ex med funktionen explode, sedan konstruera ett antal undersatser. Dessutom bör du se till att varje enskilt ord är minst 3 tecken långt, gärna 4 till och med, för att inte försvåra för databasen.
Men först av allt, mysql_real_escape_string för att undvika SQL-injektioner!

$wordstring = mysql_real_escape_string($_GET['search']);

$words = explode(' ', $wordstring);

for_each($words as $word){
  if(strlen($word)<3){
    $error = 'Fel! Alla sökord måste vara minst 3 tecken långa!';
  }else{
    subarray[]= "(info LIKE '%".$words[$i]."%' OR headline LIKE '%".$words[$i]."%')";
  }
}

Detta samlar alla undersatser i en array. Sedan klistrar du ihop dessa satser antingen med AND eller OR. AND gör att alla orden måste finnas med för att matchning ska ske, OR gör att endast ett ord måste finnas med. Detta väljer du lämpligen med en checkbox.

if ($alla_ord){
  $subexpression = implode(' AND ', $subarray);
}else{
  $subexpression = implode(' OR ', $subarray);
}

Sist infogar du hela underuttrycket och kör frågan.

if (isset($error)){
  echo $error;
}else{
  $news = mysql_query("SELECT * FROM news WHERE ( $subexpression ) AND publish='1' ORDER BY newsdate DESC");
}

Ungefär så...

Medlem sedan maj 2005138 inlägg
#5

Jag tackar så mycket för assistansen! Använde inte exakt denna, men den hjälpte mig in på rätt spår!

255 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
114 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)