søgefunktion som kun skal lede efter det indtastede ord
Hej..
har lavet et bette og enkelt almindelig søgefunktion script som skal søge efter noget fra databasen
mit problem er bare at hvis jeg nu har et ord i databasen som hedder fisk f.eks. så når jeg i min input skriver fisk, så finder den det fint..
MEN hvis jeg så skriver i/s eller k
så finder den også fisk.. og alle andre som indeholder de bogstaver.. det jeg gerne vil have den til er at den KUN henter det ord som er skrevet i databasen som i dette tilfælde så er fisk.. og intet andet.. håber der er nogle som kan hjælpe mig på vej..
if (isset($_POST['Soeg'])) { if (empty($_POST['SeachWord'])) { echo"Skriv et søgeord før du kan søge"; } else { $ResSeach = mysql_query("SELECT * FROM doveseach WHERE seachWord LIKE '%". $_POST['SeachWord'] ."%'")or die(mysql_error()); while ($RowSeach = mysql_fetch_array($ResSeach)) { if ($RowSeach['seachWord'] == "") { echo'<font color="#990000">Der findes ikke noget søgeord for det du søgte på</font>'; } else { echo "<a href='?Seach=Watch&SeachID=". $RowSeach['id'] ."'> ". $RowSeach['seachWord']."</a><br />"; } } } }
if (isset($_POST['Soeg'])) { if (empty($_POST['SeachWord'])) { echo "Skriv et søgeord før du kan søge."; } else { $sql = "SELECT * FROM doveseach WHERE seachWord LIKE '%" . $_POST['SeachWord'] . "%'"; $result = mysql_query($sql) or die(mysql_error()); while ($row = mysql_fetch_assoc($result)) { if ($row['seachWord'] == "") echo'<font color="#990000">Der findes ikke noget søgeord for det du søgte på</font>'; else echo "<a href='?Seach=Watch&SeachID=" . $row['id'] . "'>" . $row['seachWord'] . "</a><br />"; } } }
Som jeg forstår det, vi e_w kun ha' de rækker med, hvor hele søgeordet findes, og LIKE kender ikke forskel på fisk og is. Hvis du søger på sidstnævnte med LIKE vil du få begge dele med i dit resultat, og som jeg forstår det, ønskes kun de rækker hvor der vitterligt står is og ikke hvor is indgår i andre ord. LIKE leder jo blot efter bogstaverne is, og er ligeglad med hvad der står rundt om (når der sættes % i begge ender).
ahh kan ikke få det til at funke.. med dit script tilføjelse (nielle) ehm.. det sådan her ud..
$SQL = "SELECT * FROM doveseach WHERE seachWord LIKE '%" . $_POST['SeachWord'] . "%'"; $result = mysql_query($SQL) or die(mysql_error()); while ($RowSeach = mysql_fetch_assoc($result)) { if ($RowSeach['seachWord'] == "") echo'<font color="#990000">Der findes ikke noget søgeord for det du søgte på</font>'; else echo "<a href='?Seach=Watch&SeachID=" . $RowSeach['id'] . "'>" . $RowSeach['seachWord'] . "</a><br />"; }
hm.. men sys ikke at den gør det store forskel nemlig.. du kan se den i "auktion" her
ja okay.. den må gerne gøre sådan at den søger efter fiskeri samtidig.. så man få nogle valgmuligheder.. ellers ku jeg vel lige så godt lade være med at lave den i en while..
så hvis man ser det på den måde "nielle" så har du ret i at det er sådan.. men det var mere fordi sådan som den er nu.. hvis du f.eks. skriver i så finder den
Kunne man ikke bare indsætte et " " (mellemrum) på hver side af søgeordet? Så det kom til at se sådan ud " fisk ". Jeg ved godt, at det ikke holder med første og sidste ord, men ellers?
shooka> Nej, så er et regexp at foretrække de den kan gøres solid over for om ordet er i starten eller slutningen.
e_w> Hvis du gerne vil kunne søge på "fisk" og så både kunne finde "fisk" og "fiskeri", så er der vist ingen vejne uden om at du også må acceptere at du kan søge på "i" og så finde "fisk" og "fiskeri".
Uden at ha' testet det yderligere vil jeg tro du skal bruge noget i retning af:
$SQL = "SELECT * FROM doveseach WHERE seachWord REGEXP '( |^)" . $_POST['SeachWord'] . "( |$)'";
Med mindre du bruger punktuering efter/imellem dine søgeord, så skal du selvfølgelig tilføje de tegn der skal tages højde for. I ovenstående finder den alle ord der enten starter strengen (altså første ord i searchWord) eller har et foranstillet mellemrum, og samtidig enten afslutter strengen eller har et bagvedstillet mellemrum.
Nu har jeg ikke sat mig ind i hvordan mysql håndterer reg exp, men ( |^) skulle gerne sørge for at tegnet foran søgeordet enten er et mellemrum, eller begyndelsen af feltet og relativt det samme for ( |$)?!? Men hvis mysql implementerer deres egen tolkning, så kan du uden tvivl ha' ret.
Word boundaries matcher ved "enden af et ord". Dermed er en sådan løsning stabil over for om et ord er ved starten af teksten, i slutningen af teksten eller inde midt i teksten. Dertil klarer den tilfældet, hvor at der f.eks. kommer et punktum, et komma eller et spørgsmålstegn efter ordet.
Du har ret i at det ikke ændrer ved, om man fanger både fisk og fisken, men sådan som jeg ser det, er kolonnen searchWord i tabellen blot en samling ord, der skal relateres til posten, så løsningen må jo være at smide begge ord i feltet, altså:
id: 1 searchWord: Fisk Fiskeri Fiskene...
id: 2 searchWord: Æble Æbler Frugt...
osv.
Jeg vil tro det er grunden til at man skal søge på hele ord, frem for blot at søge på hele feltet, at der netop kunne være flere søgeord i feltet, med mindre jeg har misforstået, og det er reelt tekst om et emne, der søges i.
Jo jo, men word boundry er mig bekendt \b, så det må være mysql's egen tolkning at anvende [[:<:]] [[:>:]], men du har ret i, at det er en lettere løsning end den jeg først kom med
Ja, det der hedder "\b" i stort set alle ander regex-impementeringer hedder hhv. [[:<:]] og [[:>:]] i MySQL. Ikke helt logisk. De har øjensynligt også en skenen mennel om det er starten eller slutningen af et ord der skal matche.
Bortset fra det, så synes jeg at det er lidt ufrugtbart at gætte på hvad der er den rigtige løsning så længe e_w ikke er lidt mere konkret mht. hvad han ønsker.
jeg ved det snart ikke... ehm men tak for jeres forslag.. sender i lige begge et svar så jeg kan tildele pointene til jer?
jeg prøver mig med noget andet.. og ja bare lækkert at der er nogle hurtige svar når man efterspørger om det..så sys ikke selv jeg vil nappe dem tilbage selvom jeg ikke helt fik løst det..
Prøv nu at fortælle os lidt mere om hvordan du ønsker at det skal virke ... ellers har vi jo ikke en chance for at lave det på den rigtige måde. :^)
Synes godt om
Ny brugerNybegynder
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.