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
4 svar · 558 visningar · startad av niNe
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.
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
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...
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å...
Jag tackar så mycket för assistansen! Använde inte exakt denna, men den hjälpte mig in på rätt spår!