Avatar billede e_w Nybegynder
30. august 2006 - 12:58 Der er 36 kommentarer

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..

Mvh. e_w
Avatar billede nielle Nybegynder
30. august 2006 - 13:06 #1
Der er da visr noget meget mystiks med den kode du har nu. Må vi se den?
Avatar billede e_w Nybegynder
30. august 2006 - 13:07 #2
Ja den ser sådan her ud..

        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 />";
                                }
                            }
                }
            }
Avatar billede nielle Nybegynder
30. august 2006 - 13:13 #3
Du overskriver $RowSearch i din while-løkke:

$ResSeach = mysql_query($sql) or die(mysql_error());
while ($RowSeach = mysql_fetch_assoc($ResSeach))  <- Her bliver $ResSeach overskrevet!
Avatar billede nielle Nybegynder
30. august 2006 - 13:15 #4
Gør spdan her i stedet:

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 />";
        }
    }
}
Avatar billede kinderaeg Nybegynder
30. august 2006 - 13:23 #5
Jeg vil tro du skal ha' fat i noget Regular Expression for at få det til at spille.
http://dev.mysql.com/doc/refman/5.0/en/regexp.html
Avatar billede e_w Nybegynder
30. august 2006 - 13:23 #6
okay.. gør det virkelig en stor forskel?.. .

prøver lige og ser om den virker..

2 sec..

Mvh. e_w
Avatar billede nielle Nybegynder
30. august 2006 - 13:26 #7
Ja, det gør faktisk en stor forskel. :^)
Avatar billede nielle Nybegynder
30. august 2006 - 13:28 #8
kinderaeg> Man kunne brige regulære udtryk, men det er no overkill år en god gammeldags LIKE kan klare problemet.
Avatar billede nielle Nybegynder
30. august 2006 - 13:29 #9
Man skulle tro at jeg var ordblind:

"Man kunne bruge regulære udtryk, men det er nu overkill når en god gammeldags LIKE kan klare problemet."
Avatar billede kinderaeg Nybegynder
30. august 2006 - 13:36 #10
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).
Avatar billede e_w Nybegynder
30. august 2006 - 13:37 #11
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

www.dove.engbjerg.net
Avatar billede e_w Nybegynder
30. august 2006 - 13:39 #12
Til kinderaeg...

Ja.. du har ret.. det er hele ord.. ord som kan skal kende til.. (hvis man kan sige det på den måde).. :)

Mvh. e_w
Avatar billede e_w Nybegynder
30. august 2006 - 13:39 #13
Ahh.. et sub-

http://dove.engbjerg.net/

sådan det sku vist fungere..

Mvh. e_w
Avatar billede nielle Nybegynder
30. august 2006 - 13:41 #14
Hvis jeg søger på "fisk" får jeg slet ikke noget?
Avatar billede e_w Nybegynder
30. august 2006 - 13:41 #15
ahhh.. doh. lavede det om til

william
og
willy

det er det som er på databasen nu.. har ændret det lidt..

Mvh. e_w
Avatar billede nielle Nybegynder
30. august 2006 - 13:43 #16
Det burde virke. Og rettelsen er i hvertfald nødvendig for at det skal komme til at virke!

Når vi snakker "hele ord" betyder det så at den ikke skal finde sætninger hvor f.eks. ordet "fiskeri" indgår når vi søger på "fisk"?
Avatar billede nielle Nybegynder
30. august 2006 - 13:45 #17
Hvis der slet ikke er tale om at ordet indgår i en sætning som:

"Spiste du fisk i dag?"

- men om at der kun står ordet "fisk", så skal man ikke bruge en LIKE:

$SQL = "SELECT * FROM doveseach WHERE seachWord = '" . $_POST['SeachWord'] . "'";
Avatar billede e_w Nybegynder
30. august 2006 - 13:48 #18
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

william
willy...

og det har jo ikke rigtig meget at gøre med "i"

Mvh. e_w
Avatar billede shooka Nybegynder
30. august 2006 - 13:51 #19
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?
Avatar billede shooka Nybegynder
30. august 2006 - 13:53 #20
Havde ikke lige set dit nye spørgsmål "30/08-2006 13:48:59"
Avatar billede nielle Nybegynder
30. august 2006 - 13:53 #21
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".
Avatar billede shooka Nybegynder
30. august 2006 - 13:56 #22
Det kunne jo også være, at man skrev isk i stedet for fisk, hvis man ikke vidste om ordet fisk var med ph eller f
Avatar billede nielle Nybegynder
30. august 2006 - 13:57 #23
e_w>

Du kan jo enten prøve om denne her gør det du ønsker:

$SQL = "SELECT * FROM doveseach WHERE seachWord = '" . $_POST['SeachWord'] . "'";

- og så kan du efterfølgende også prøve denne her:

$SQL = "SELECT * FROM doveseach WHERE seachWord LIKE '" . $_POST['SeachWord'] . "%'";
Avatar billede e_w Nybegynder
30. august 2006 - 14:27 #24
nope.. det fungere ikke helt.. jeg prøver lige at lege med det..
vender tilbage hvis jeg finder en løsning..

Mvh. e_w
Avatar billede nielle Nybegynder
30. august 2006 - 14:32 #25
Jeg troede at det var meningen at vi skulle finde løsningen sammen her?

Prøv ar beskrive - med nogle flere ord og eksempler - hvad det er du ønsker, og hvorfor de nævnte løsningsforslag ikke opfylder dine kriterier.
Avatar billede kinderaeg Nybegynder
30. august 2006 - 14:51 #26
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.
Avatar billede nielle Nybegynder
30. august 2006 - 14:59 #27
kinderaeg> Der skal nu bruges word boundaries:

$SQL = "SELECT * FROM doveseach WHERE seachWord REGEXP '[[:<:]]" . $_POST['SeachWord'] . "[[:>:]]'";
Avatar billede nielle Nybegynder
30. august 2006 - 15:00 #28
... men det afklare bare ikke spørgsmålet om der både skal findes "fisk" og "fiskeri" når man søgere på "fisk".
Avatar billede kinderaeg Nybegynder
30. august 2006 - 15:23 #29
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.
Avatar billede nielle Nybegynder
30. august 2006 - 15:27 #30
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.
Avatar billede kinderaeg Nybegynder
30. august 2006 - 15:28 #31
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.
Avatar billede kinderaeg Nybegynder
30. august 2006 - 15:30 #32
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
Avatar billede nielle Nybegynder
30. august 2006 - 15:33 #33
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.
Avatar billede nielle Nybegynder
30. august 2006 - 15:35 #34
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.
Avatar billede e_w Nybegynder
30. august 2006 - 18:10 #35
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..

er det iorden hos jer?

Mvh. e_w
Avatar billede nielle Nybegynder
30. august 2006 - 23:08 #36
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. :^)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester