Jag har ett skrivfält vartigenom man kan söka i en databas. Vad jag nu vill är att man ska kunna skriva in inte bara ett ord eller variabel utan två eller flera. Ex. hej hopp.
Så ska sökningen ska där båda dessa orden påträffats.
Jag vet ju hur man skriver en fråga till sin MySQL databas men bara med en variabel.
Jag spånar lite och tänker mig att med explode() kanske man skulle kunna loopa igenom sökningen men har inte lyckats så värst bra.
Någon som vet hur man skulle kunna söka på flera variabler eller vet några exempel?
// De kolumner i databasen du vill söka i
$kolumn = array('foretag', 'gata', 'postnrgata', 'box', 'ort', 'lan', 'riktnr', 'telefon');
foreach ($kolumn as $kol) {
// explodera sökorden
$s = explode(" ", $_GET['search']);
foreach ($s as $sokord){
$var[] = "$kol LIKE '%$sokord%'";
}
$var[] = "$kol LIKE '%{$_GET['search']}%'";
}
// lägg till AND mellan sökorden
$var = implode(' AND ', $var);
Ok, nice ju, får det inte riktigt att fungera då jag sätter in den i min mysql fråga. Det får jag pilla lite till på men jag har en fråga först.
Den kan verka dum men men.
Kan jag få foreach loopen förklarad?
jag fattar explode och implode men jag fastnar på $kolumn as $kol. varför?
<?php
// sökorden
$_GET['search'] = "Pedda pedda@domän.se";
// De kolumner i databasen du vill söka i
$kolumn = array('namn', 'epost');
// första gången foreachloopen körs så är $kol namn
// Andra gången är $kol epost
foreach ($kolumn as $kol) {
// explodera sökorden
$s = explode(" ", $_GET['search']);
foreach ($s as $sokord){
// som innan, första loopen är $sokord Pedda
// andra gången är $sokord pedda@domän.se
$var[] = "$kol LIKE '%$sokord%'";
}
// Här lägger vi in hela sökordet, alltså "Pedda pedda@domän.se"
// Du kan radera den här raden om den inte passar ditt behov.
$var[] = "$kol LIKE '%{$_GET['search']}%'";
}
// lägg till AND mellan sökorden
$var = implode(' AND ', $var);
// hämta från databasen
$data = mysql_query("SELECT * FROM tabell WHERE ($var) ORDER BY namn");
//echo $var;
// om du körde en echo skulle den skriva ut:
// namn LIKE '%Pedda%' AND namn LIKE '%pedda@domän.se%' AND namn LIKE '%Pedda pedda@domän.se%'
// AND epost LIKE '%Pedda%' AND epost LIKE '%pedda@domän.se%' AND epost LIKE '%Pedda pedda@domän.se%'
?>
Du kan inte ha $kolumn som du har gjort. Ändra
$kolumn = mysql_fetch_array(mysql_query("select namn from tabell"));
till en array som jag skrev i exemplet fast med dina kolumnnamn.
/r såg nu att du även har tagit bort $kol från loopen. Förstår inte riktigt vad du försöker göra nu?
Ok, kjell, jag tror jag är med dig.
Menar du att man borde använda en match()...against() ?
Då skulle koden kanske kunna bli både kortare och mer lättöverskådlig?
så här skriver jag för att först ta ut alla sökorden från min sökruta på sidan och sedan söka igenom databasen:
// explodera sökorden
$s = explode(" ", $_GET['sok']);
foreach ($s as $sokord){
$var[] = "%$sokord%";
}
// lägg till AND mellan sökorden
$var = implode(' +', $var);
$sql = "SELECT * FROM tabell WHERE MATCH(namn,extra,kategori) AGAINST(%$var%) ORDER by namn ASC";
$AntalArtiklar = mysql_result(mysql_query("select count(*) from tabell WHERE MATCH(namn,extra,kategori) AGAINST($var)"), 0, 0);
}
JA, så så ser det ut och för mig ser det helt ok ut.
Men så får jag felmeddelandet: supplied argument is not a valid MySQL result resource på raden med $AntalArtiklar.
Tanken var mest att du skulle skippa det där med PHP (foreach, explode, implode etc) och istället använda den utökade funktionaliteten med fulltextsökning. Exempelvis något i stil med
$sql = "SELECT *,MATCH(namn,extra,kategori)
AGAINST('" . addslashes($_GET['sok']) . "' IN BOOLEAN MODE)
AS relevance FROM tabell WHERE MATCH(namn,extra,kategori)
AGAINST('" . addslashes($_GET['sok']) . "' IN BOOLEAN MODE)
ORDER BY relevance DESC";
[r]
Koden fungerar kanske inte rakt av för ditt exempel då det är en kodsnutt som jag själv håller på att experimentera med för att ranka söksidorna.
Information om boolean-sökning finns här och från länkarna på dess sida.
Jo det hade ju varit kanon att använda sig utav den utökade funktionaliteten med fulltextsökning.
Hur jag än gör måste jag ju ändå dela upp strängen $_GET['sok'] för att kunna söka vart ord för sig. inte sant?