Avatar billede mettecarsten Nybegynder
13. maj 2006 - 19:07 Der er 28 kommentarer og
1 løsning

Søgning i database med flere søgeord

Hej eksperter

Jeg har fundet flere indlæg omkring mit spg., men kan ikke få overblikket :-).

Jeg har følgende kode:

<%
' Henter værdien fra soeg.htm
strKeyword = Trim(Request.Form("Keyword"))

If Len(strKeyword) = 0 Then
  ' Hvis der ikke er skrevet i feltet
  Response.Clear
  Response.Redirect("search.htm")
Else
  ' Hvis der er skrevet i feltet
  strKeyword = Replace(strKeyword,"'","''")
  'strKeyword = Replace(strKeyword, \"AND\", \"\'% AND Name LIKE %\'\")
  'http://www.eksperten.dk/spm/25512
End If

' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE"
strSQL = strSQL & " (Bruger LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Overskrift LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Beskrivelse LIKE '%" & strKeyword & "%')"

Set rs = Conn.Execute(strSQL)
%>

Når koden er sat til strKeyword = Replace(strKeyword,"'","''") virker det helt perfekt, hvis der kun er indsat 1 søgeord, men ikke, hvis der i boksen indtastes flere søgeord. Jeg har prøvet flere metoder for at få det til at virke på flere søgeord, men uden held. Jeg har set http://www.eksperten.dk/spm/25512 og prøvet at ændre til 'strKeyword = Replace(strKeyword, \"AND\", \"\'% AND Name LIKE %\'\") (se kode), men der kommer blot en fejlmelding.

Mit spg. er nu, om mit problem kan ændres ved blot at ændre en linie, eller mere skal ændres?

På forhånd tak.
Avatar billede nielle Nybegynder
13. maj 2006 - 21:54 #1
Prøv at ændre:

strKeyword = Replace(strKeyword, \"AND\", \"\'% AND Name LIKE %\'\")

- til:

strKeyword = Replace(strKeyword, "AND", "%' AND Name LIKE '%")
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 22:15 #2
Giver umiddelbart stadig kun mulighed for søgning på 1 søgeord. Måske et dumt spg., men "Name" i linien - er det beskemt efter en tabel i databasen?
Avatar billede nielle Nybegynder
13. maj 2006 - 22:33 #3
Det er et felt i din tabel - "Name" er navnet på det felt du leder efter værdien i.
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 22:40 #4
Super. Jeg har tidligere også ændret det til feltet i min tabel, men det ændrer intet overhovedet. Stadig muligt at søge på 1 søgeord, men intet resultat, hvis jeg i feltet skriver 2 søgeord. Når der er flere søgeord indtastet i boksen, skal de vel skilles ad - kan det egentlig ske ved blot at ændre den linie, som vi her skriver om???
Avatar billede nielle Nybegynder
13. maj 2006 - 22:45 #5
Jeg har en god ide om hvor den går galt, men for at demonstrere så synes jeg lige at vi skal prøve at udskrive SQL-sætningen før at vi går videre:

' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE"
strSQL = strSQL & " (Bruger LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Overskrift LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Beskrivelse LIKE '%" & strKeyword & "%')"

Response.Write "DEBUG: " & strSQL & "<br>" ' <- Indsæt denne her linje

Set rs = Conn.Execute(strSQL)
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 22:48 #6
Hvis jeg søger på ordene "sommerhus historie", bliver udskrivningen således:

DEBUG: SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE (Bruger LIKE '%sommerhus historie%') OR (Overskrift LIKE '%sommerhus historie%') OR (Beskrivelse LIKE '%sommerhus historie%')
Avatar billede nielle Nybegynder
13. maj 2006 - 22:50 #7
Koden går uf fra at du søger ved at skrive AND imellem de enkelte ord:

"sommerhus AND historie"

Det er det denne her linje går ud fra:

strKeyword = Replace(strKeyword, "AND", "%' AND Name LIKE '%")
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 22:53 #8
Er nok ikke helt med. Umiddelbart har strKeyword = Replace(strKeyword, "AND", "%' AND Name LIKE '%") ikke nogen virkning, da der stadig kan søges på et søgeord, selvom linien helt slettes.
Avatar billede nielle Nybegynder
13. maj 2006 - 22:55 #9
Hvis du skriver:

"sommerhus AND historie"

i stedet for:

"sommerhus historie"

så burde du se at SQL sætningen ser meget anderledes ud.
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 23:00 #10
Så ser strenge således ud:

DEBUG: SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE (Bruger LIKE '%sommerhus %' AND Beskrivelse LIKE '% historie%') OR (Overskrift LIKE '%sommerhus %' AND Beskrivelse LIKE '% historie%') OR (Beskrivelse LIKE '%sommerhus %' AND Beskrivelse LIKE '% historie%')

Søger reelt de 2 ord i 2 forskellige felter?? Hvad skal Name egentlig rettes til??
Avatar billede nielle Nybegynder
13. maj 2006 - 23:04 #11
Det er det er er en af fejlene; SQL'en burde se sådan her ud i stedet:

DEBUG: SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE (Bruger LIKE '%sommerhus %' AND Bruger LIKE '% historie%') OR (Overskrift LIKE '%sommerhus %' AND Overskrift LIKE '% historie%') OR (Beskrivelse LIKE '%sommerhus %' AND Beskrivelse LIKE '% historie%')
Avatar billede nielle Nybegynder
13. maj 2006 - 23:05 #12
... dvs. Name burde faktisk have været rettet til noget forskelligt i de tre del-led af SQL-sætningen.
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 23:06 #13
Muligt, har lidt svært ved at se logikken i hele det her :-)

Har du et forslag til en løsning af fejlen?
Avatar billede nielle Nybegynder
13. maj 2006 - 23:08 #14
Måske skulle vi bare starte helt forfra, og med at du forklare hvad det præcist er du ønsker?
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 23:12 #15
Lyder meget fornuftigt :-)

Jeg har en tabel med felterne Bruger, Overskrift og Beskrivelse. Brugeren skal kunne lave en søgning i disse felter - en søgning med flere søgeord. Nok forklaring?
Avatar billede nielle Nybegynder
13. maj 2006 - 23:17 #16
Ikke helt nok.

Du har et søgefelt, og det vil du gerne kunne indtaste et eller flere søgeord i?

Du har ikke et søgefelt for Bruger, Overskrift og Beskrivelse?

Hvis ordene "sommerhus" og "historie" indtastes i søgefeltet, ønsker du så at finde de hits som indeholder "sommerhus" OR "historie" (begge skal være der) eller dem som indeholder "sommerhus" ELLER "historie" (blot et af dem skal være der)?
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 23:21 #17
Jeg har kun ét søgefelt - et samlet søgefelt, hvor det gerne skal være muligt at søge på enten 1 eller flere ord. Jeg ønsker vist at finde OR, altså hvor begge skal være der
Avatar billede nielle Nybegynder
13. maj 2006 - 23:22 #18
Jeg fik vist skrevet forkert - OR skulle have været OG - det giver lidt mere mening ;^)
Avatar billede nielle Nybegynder
13. maj 2006 - 23:23 #19
Vi fortsætter i morgen :^)
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 23:24 #20
Helt fint :-)
Avatar billede mettecarsten Nybegynder
13. maj 2006 - 23:25 #21
Jeg er desværre først ved computeren igen i morgen aften. Virkelig på forhånd tak for hjælpen
Avatar billede nielle Nybegynder
14. maj 2006 - 10:19 #22
Prøv dette:

<%
' Henter værdien fra soeg.htm
strKeyword = Trim(Request.Form("Keyword"))

If Len(strKeyword) = 0 Then
    ' Hvis der ikke er skrevet i feltet
    Response.Clear
    Response.Redirect("search.htm")
Else
    ' Hvis der er skrevet i feltet
    strKeyword = Replace(strKeyword, "'", "''")
    strKeyword = Replace(strKeyword, " AND ", "%' AND [placeholder] LIKE '%")
    strKeyword = "([placeholder] LIKE '%" & strKeyword & "%')"
End If

' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE "

whereStr = Replace(strKeyword, "[placeholder]", "Bruger")
strSQL = strSQL & whereStr & " OR "

whereStr = Replace(strKeyword, "[placeholder]", "Overskrift")
strSQL = strSQL & whereStr & " OR "

whereStr = Replace(strKeyword, "[placeholder]", "Beskrivelse")
strSQL = strSQL & whereStr

Response.Write "DEBUG: " & strSQL & "<br>"

Set rs = Conn.Execute(strSQL)
%>
Avatar billede mettecarsten Nybegynder
14. maj 2006 - 18:38 #23
Helt kanon. Giver dette resultat:

DEBUG: SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE (Bruger LIKE '%sommerhus%' AND Bruger LIKE '%historie%') OR (Overskrift LIKE '%sommerhus%' AND Overskrift LIKE '%historie%') OR (Beskrivelse LIKE '%sommerhus%' AND Beskrivelse LIKE '%historie%')

Det kræver dog, at brugeren selv skriver AND imellem søgeordene. Kan det laves sådan, at AND "automatisk" indsættes, hvis der er flere søgeord? Er det nemt at vise brugeren noget af teksten fra databasen omkring søgeordet (håber du forstår :-)?

Jeg giver gerne nogle flere point, hvis det er nødvendigt, for din hjælp er virkelig helt kanon!
Avatar billede nielle Nybegynder
14. maj 2006 - 19:52 #24
Den med AND kan klares ved at ændre denne linje:

    strKeyword = Replace(strKeyword, " AND ", "%' AND [placeholder] LIKE '%")

til:

    strKeyword = Replace(strKeyword, " ", "%' AND [placeholder] LIKE '%")

Jeg er ikke lige klar over hvad du mener med det andet spørgsmål. Kan du ikke lige give et eksempel eller to?
Avatar billede mettecarsten Nybegynder
14. maj 2006 - 20:19 #25
Helt kanon - virker helt perfekt :-)

Det andet spg. - det springer vi over, da jeg formentlig alligevel ikke får brug for det. Smid et svar - du har fuldt fortjent pointene !
Avatar billede nielle Nybegynder
14. maj 2006 - 21:39 #26
Svar :^)
Avatar billede mettecarsten Nybegynder
14. maj 2006 - 22:00 #27
Tak for hjælpen. Lille tillægsspg., hvis du har mod på det. Jeg har lavet det sådan, at hvis en historie har status = 0 i feltet "Aktiv", skal den ikke med i søgningen. Jeg har derfor ændret:

strSQL = "SELECT ID, Brugernavn, Overskrift, Beskrivelse FROM kontakthistorier WHERE "

til

strSQL = "SELECT ID, Brugernavn, Overskrift, Beskrivelse FROM kontakthistorier WHERE Aktiv = '1' AND "

men det hjælper ikke. Har du et forslag?
Avatar billede nielle Nybegynder
14. maj 2006 - 22:03 #28
Sådan:

' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, Bruger, Overskrift, Beskrivelse FROM kontakthistorier WHERE Aktiv = '1' AND ("

whereStr = Replace(strKeyword, "[placeholder]", "Bruger")
strSQL = strSQL & whereStr & " OR "

whereStr = Replace(strKeyword, "[placeholder]", "Overskrift")
strSQL = strSQL & whereStr & " OR "

whereStr = Replace(strKeyword, "[placeholder]", "Beskrivelse")
strSQL = strSQL & whereStr & ")"


Men er du sikker på at det ikke skal være:

... Aktiv = 1 AND ...

i stedet for:

... Aktiv = '1' AND ...
Avatar billede mettecarsten Nybegynder
14. maj 2006 - 22:10 #29
IGEN tak for hjælpen - det virker helt perfekt - og jo, det var selvfølgelig uden ''
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
Kurser inden for grundlæggende programmering

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