dr_damirMedlem sedan mars 2003132 inlägg Tjenna
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?
PeddaMedlem sedan juni 20006 032 inlägg // 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);
Nu har du söktexten i variabeln $var.
dr_damirMedlem sedan mars 2003132 inlägg 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?
PeddaMedlem sedan juni 20006 032 inlägg Ska göra ett försök att förklara hela delen
<?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%'
?>
dr_damirMedlem sedan mars 2003132 inlägg Tack för svaren Pedda!
Så här skriver jag:
$kolumn = mysql_fetch_array(mysql_query("select namn from tabell"));
foreach ($kolumn as $kol) {
// explodera sökorden
$s = explode(" ", $_GET['namnsok']);
foreach ($s as $sokord){
$var[] = "'%$sokord%'";
}
}
// lägg till AND mellan sökorden
$var = implode(' AND ', $var);
echo $var;
Jag tycker det ser ganska likt ut din...tack =)
Också skriver jag ut den för att se vad $var är.
$_GET['namnsok'] är "pelle knut" från sidan så då tycker jag att echo $var borde bli:
"'pelle' AND 'knut'"
men det blir
"'pelle' AND 'knut' AND 'pelle' AND 'knut'"
Lite skumt. varför undrar jag då?
PeddaMedlem sedan juni 20006 032 inlägg 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?
kjellMedlem sedan dec. 1999757 inlägg Använder du fulltext i MySQL på aktuella kolumner så kan du söka på bl.a. flera ord plus lite andra finesser likt en vanlig sökmotor.
dr_damirMedlem sedan mars 2003132 inlägg Tjena!
Jo, Pedda, jag skrev lite kontisgt där med mysql_fetch_array istället för att bara skriva in kolumnerna jag vill söka. Det inser jag nu =).
Kolumnerna är i Fulltext.
$kol är med i loopen igen =) och när jag kör echo $var så får jag precis det jag vill:
"'pelle' AND 'knut'"
Sen när jag vill räkna alla träffar jag fått med count(*) skriver jag såhär:
$AntalArtiklar = mysql_result(mysql_query("select count(*) from tabell WHERE (%$var%)"), 0, 0);
Men då får jag felmeddelande:
mysql_result(): supplied argument is not a valid MySQL result resource
på just den raden.
det fattar jag inte...
kjellMedlem sedan dec. 1999757 inlägg
dr_damir skrev:
Kolumnerna är i Fulltext.
Ok, får man då fråga varför du vill krångla till det med PHP istället för en enkel sql-fråga?
dr_damirMedlem sedan mars 2003132 inlägg 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?
dr_damirMedlem sedan mars 2003132 inlägg Hej igen!
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.
kjellMedlem sedan dec. 1999757 inlägg 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.
dr_damirMedlem sedan mars 2003132 inlägg tja!
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?
kjellMedlem sedan dec. 1999757 inlägg Inte om du anser dig vara tillfredsställd med de alternativ som boolean-sökningen kan erbjuda. Läs länken så har du alla alternativen beskrivna.