06. september 2004 - 17:26Der er
52 kommentarer og 2 løsninger
søgefunktion med flere ord i flere kolonner
Hej alle
Jeg har kigge mig lidt omkring, men har ikke lige fundet det som jeg søger! efter.
Jeg vil meget gerne have, at man kunne søge på flere ord og ikke bare det ene, som det er tilfældet nu. Altså jeg kan søge på børn, hvilket giver resultat, men ikke på børn lege, da denne tekst streng ikke optræder samme nogetsteds. Det er selvfølgelig noget med at dele søgestrenge i to og lade den søge på disse, men jeg har ikke helt kunne gennemskue koden. Her er min kode, som virker fint nu, men som altså mangler lige det sidste.
Håber meget på lidt hjælp!
<% strSearch = fjerntegn(Request.Form("search"))
If strSearch <> "" Then
SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' AND INSTR(foredrag.beskrivelse,'" & strSearch & "') OR INSTR(foredrag.titel,'" & strSearch & "') OR INSTR(foredrag.undertitel,'" & strSearch & "') OR INSTR(foredrag.sogeord,'" & strSearch & "') OR INSTR(foredrag.foredragsholder,'" & strSearch & "') ORDER BY foredrag.titel"
set rs=conn.execute(SQL)
If rs.Eof Then Response.Write "Søgningen efter <b>" & lavtegn((strSearch)) & "</b> gav intet resultat" Else if rs("vis") = "ja" then Response.Write "Søgningen efter '<b>" & lavtegn((strSearch)) & "</b>' gav følgende resultater:<br><br>" end if
Du skal splitte din søgestreng op efter mellemrum.
Dette gøres med Split() funktionen der returnerer et array af strings.
Herefter laver du en løkke der for hver streng i arrayet, lægger hvert søgeord til dit dit SQL query:
If strSearch <> "" then
SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' "
Dim arrSearch() as Array Dim i as Integer Dim strSearchLike as String strSearchLike = " AND (" arrSearch = Split(strSearch, " ") for i=LBound(arrSearch) to UBound(arrSearch) do strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') OR " & _ strSearchLike = strSearchLike & " (foredrag.titel LIKE '%" & arrSearch(i) & "%') OR " & _ strSearchLike = strSearchLike & " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') OR " & _ strSearchLike = strSearchLike & " (foredrag.soegeord LIKE '%" & arrSearch(i) & "%') OR " & _ strSearchLike = strSearchLike & " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%') OR " next i
' fjern sidste " OR " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 3) & ")" else ' Giv evt en eller anden fejl om tom søgestreng... end if
SQL = SQL & strSearchLike & " ORDER BY foredrag.titel"
Min kode leder efter et søgeord vilkårligt, dvs. "hans action" vil kunne finde et foredrag med foredragsholderen "Hans Hansen" og titlen "Et actiondrama...".
Hvis du vil kræve, at alle ord i søgestrengen skal indgå i ex. titel, skal strengen omskrives, så du grupperer alle ((foredrag.titel LIKE ...) OR ((foredrag.titel LIKE ...)) i en gruppe for sig og AND'er dette med ((foredrag.beskrivelse LIKE ....) OR (foredrag.beskrivelse LIKE ...)) AND osv.
Denne her virker - så må vi se om det giver det rigtige resultat fra databasen...
If strSearch <> "" then
SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' "
Dim arrSearch, i, strSearchLike strSearchLike = " AND (" arrSearch = Split(strSearch, " ") for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.titel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.soegeord LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%') OR " next ' i
' fjern sidste " OR " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 3) & ")" else ' Giv evt en eller anden fejl om tom søgestreng... end if
SQL = SQL & strSearchLike & " ORDER BY foredrag.titel"
SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' "
Dim arrSearch, i, strSearchLike strSearchLike = " AND (" arrSearch = Split(strSearch, " ") for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.titel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.soegeord LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%') OR " next ' i
' fjern sidste " OR " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 3) & ")" else ' Giv evt en eller anden fejl om tom søgestreng... end if
SQL = SQL & strSearchLike & " ORDER BY foredrag.titel"
'SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' AND (foredrag.beskrivelse LIKE '" & strSearch & "') OR INSTR(foredrag.titel,'" & strSearch & "') OR INSTR(foredrag.undertitel,'" & strSearch & "') OR INSTR(foredrag.sogeord,'" & strSearch & "') OR INSTR(foredrag.foredragsholder,'" & strSearch & "') ORDER BY foredrag.titel"
set rs=conn.execute(SQL)
If rs.Eof Then Response.Write "Søgningen efter <b>" & lavtegn((strSearch)) & "</b> gav intet resultat" Else if rs("vis") = "ja" then Response.Write "Søgningen efter '<b>" & lavtegn((strSearch)) & "</b>' gav følgende resultater:<br><br>" end if
Do Until RS.EOF if rs("vis") = "ja" then 'If Len(strSearch) >= 1 AND LCase(strSearch) = LCase(RS("titel")) Then %> <table border="0" cellspacing="1" cellpadding="3" width="303">
næ - det eneste sted i hele sitet, hvor jeg bruger arrSearch er her! Jeg har lige lavet en søgning(!)
Den fejler med: Fejltype: Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0411) Navnet er omdefineret /mainsite/search.asp, line 17, column 4 Dim arrSearch
Fejltype: Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0411) Navnet er omdefineret /mainsite/search.asp, line 17, column 4 Dim arrSearchStr
Du kan være 100% sikker på, at variablen bliver redifineret...
Hvor det sker er lidt svært at sige, men det er helt sikkert i en include fil (enten en af de 2 du har angivet, eller i en fil som dit udviklingsværktøj kan pille i).
Summa sumarum: De behøves ikke at blive deklareret - jeg synes bare det er pænt, og bruger det altid sammen med Option Explicit.
jeg er temmelig sikker på at det nu er et spg om mine if/end if - den fejler ret kraftigt - men jeg kan se at det er fordi, at den ikke får en strSearch med... derfor får den kun halvdelen af sql'en
If strSearch <> "" then
SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' "
Dim arrSearch, i, strSearchLike strSearchLike = " AND (" arrSearch = Split(strSearch, " ") for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.titel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.soegeord LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%') OR " next ' i
' fjern sidste " OR " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 3) & ")" else ' Giv evt en eller anden fejl om tom søgestreng... end if
SQL = SQL & strSearchLike & " ORDER BY foredrag.titel"
men jeg er nødt til lige at smutte lidt - vender tilbage senere på aftenen
SQL = "SELECT * FROM foredrag WHERE foredrag.vis='ja' "
'Dim arrSearch, i, strSearchLike strSearchLike = " AND (" arrSearch = Split(strSearch, " ") for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.titel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.sogeord LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%') OR " next ' i
' fjern sidste " OR " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 3) & ")"
SQL = SQL & strSearchLike & " ORDER BY foredrag.titel" set rs=conn.execute(SQL)
response.write "SQl: " + sql
Og her er sql'en:
SQl: SELECT * FROM foredrag WHERE foredrag.vis='ja' AND ( (foredrag.beskrivelse LIKE '%velplejet%') OR (foredrag.titel LIKE '%velplejet%') OR (foredrag.undertitel LIKE '%velplejet%') OR (foredrag.sogeord LIKE '%velplejet%') OR (foredrag.foredragsholder LIKE '%velplejet%') OR (foredrag.beskrivelse LIKE '%%') OR (foredrag.titel LIKE '%%') OR (foredrag.undertitel LIKE '%%') OR (foredrag.sogeord LIKE '%%') OR (foredrag.foredragsholder LIKE '%%') ) ORDER BY foredrag.titel
Som der fremgår strSearchLike skrevet to gange, og sidste gang uden arrSearch, og derfor returnere den alle poster i db.
Jeg tror den er gal med: strSearchLike = Left(strSearchLike, len(strSearchLike) - 3) & ")"
strSeachLike er med 2 gange, fordi array'et, der returneres af split(), indeholder 2 elementer, hvor det sidste er den tomme streng.... Det virker mærkeligt at du får et tomt element i dit array...
SQl: SELECT * FROM foredrag WHERE foredrag.vis='ja' AND ( (foredrag.beskrivelse LIKE '%test%') OR (foredrag.titel LIKE '%test%') OR (foredrag.undertitel LIKE '%test%') OR (foredrag.sogeord LIKE '%test%') OR (foredrag.foredragsholder LIKE '%test%') OR (foredrag.beskrivelse LIKE '%redskab%') OR (foredrag.titel LIKE '%redskab%') OR (foredrag.undertitel LIKE '%redskab%') OR (foredrag.sogeord LIKE '%redskab%') OR (foredrag.foredragsholder LIKE '%redskab%') ) ORDER BY foredrag.titelLBound
Altså - jeg er meget i tvivl om hvad der sker lige nu ... har prøvet at gennemskue, men ak.
På en søgning efter test og redskab, får jeg resultater tilbage med alle foredrag, som indeholder ENTEN test ELLER redskab. Jeg vil selvfølgelig gerne have de resultater, som indeholder BÅDE test OG redskab tilbage.
Er dette muligt og er vi enige om at det er målet?
Du får i øvrig ikke ENTEN/ELLER, men kun ELLER lige nu :-)
Jeg skal bare høre:
Skal ordene indgå i samme felt, dvs. titel skal indeholde både test OG redskab, eller er det også i orden, at ex. titel indeholder test og foredrag indeholder redskab?
Hvis det er ligemeget hvor ordene står (dvs. alle ord skal optrædet et eller andet vilkårligt sted i dine felter), så kan du bruge:
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') OR " & _ " ((foredrag.titel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.sogeord LIKE '%" & arrSearch(i) & "%') OR " & _ " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%')) AND " next ' i
' fjern sidste " AND " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & ")"
det virker ikke - den returnerer både de resultater med test og redskab - men ikke kun det foredrag, hvor begge søgeord optræder:
SQl: SELECT * FROM foredrag WHERE foredrag.vis='ja' AND ( (foredrag.beskrivelse LIKE '%test%') OR ((foredrag.titel LIKE '%test%') OR (foredrag.undertitel LIKE '%test%') OR (foredrag.sogeord LIKE '%test%') OR (foredrag.foredragsholder LIKE '%test%')) AND (foredrag.beskrivelse LIKE '%redskab%') OR ((foredrag.titel LIKE '%redskab%') OR (foredrag.undertitel LIKE '%redskab%') OR (foredrag.sogeord LIKE '%redskab%') OR (foredrag.foredragsholder LIKE '%redskab%')) ) ORDER BY foredrag.titel
Prøv denne kode - den er bare lige klasket sammen, så det er ikke sikkert at den overhovedet kan køre.. :-)
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') AND " next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " ((foredrag.titel LIKE '%" & arrSearch(i) & "%') AND " & _ next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') AND " & _ next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.sogeord LIKE '%" & arrSearch(i) & "%') AND " & _ next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%')) AND " next ' i ' fjern sidste "AND " fra søgestreng strSearchLike = Left(strSearchLike, len(strSearchLike) - 4)
Nedenstående skulle give det korrekte SQL output...
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.beskrivelse LIKE '%" & arrSearch(i) & "%') AND " next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.titel LIKE '%" & arrSearch(i) & "%') AND " next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.undertitel LIKE '%" & arrSearch(i) & "%') AND " next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.sogeord LIKE '%" & arrSearch(i) & "%') AND " next ' i ' fjern sidste "AND " fra søgestreng og læg "OR" til strSearchLike = Left(strSearchLike, len(strSearchLike) - 4) & "OR "
for i=LBound(arrSearch) to UBound(arrSearch) strSearchLike = strSearchLike & " (foredrag.foredragsholder LIKE '%" & arrSearch(i) & "%') AND " next ' i
' fjern sidste " AND " fra søgestreng og afslut med ")" strSearchLike = Left(strSearchLike, len(strSearchLike) - 5) & ")"
Ovenstående kan pakkes meget pænere sammen i en dobbelt løkke, der ud fra et array med feltnavne genererer SQL sætningen, men det må vist blive et andet spm :-)
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.