Avatar billede timmwillum Nybegynder
19. november 2008 - 21:48 Der er 21 kommentarer og
2 løsninger

Søgning i database

Hej eksperter

Har læst en del tråde om søgning her på eksperten og andre steder ... men har ikke helt fundet noget, jeg kunne bruge.

Er der ikke nogen som har et link til eller ligger inde med et simpelt script/noget kode, som kan håndtere en søgning i en database? Scriptet skulle gerne returner id (eller andet felt) fra de entries, hvor søgningen matcher.

Det skal være ASP og jeg anvender en MySQL, men hvis koden relateres til Accept går det også fint.

Jeg vil være interessere i den fulde kode på siden/siderne ... som jeg så kan tilpasse.
Avatar billede Slettet bruger
19. november 2008 - 21:53 #1
Du skal bruge SQL-forespørgslen LIKE:
http://www.w3schools.com/Sql/sql_like.asp

  // Steeven
Avatar billede Slettet bruger
19. november 2008 - 21:58 #2
Hvis du skal lave en søgning, så kan du fx lave et søgefelt på en side. Når brugeren så indtaster noget og klikker "Søg", så dirigeres man til en ASP-side, hvor der står fx følgende:

    strSQL = "SELECT id FROM [tabelnavn] WHERE [nogle felter] LIKE '" & Request.Form("sogefelt") & "'"

Så har man hentet id'erne til alle de poster i tabellen, hvor søgeordet optræder i de pågældende felter.

  // Steeven
Avatar billede arne_v Ekspert
19. november 2008 - 22:08 #3
et felt - flere felter kraever flere conditions med OR eller AND
Avatar billede Slettet bruger
19. november 2008 - 22:56 #4
Hmm, okay... min fejl.

  // Steeven
Avatar billede timmwillum Nybegynder
20. november 2008 - 08:38 #5
Ja, det ser fornuftigt ud. Men så bliver det måske lige en tand for simpelt. For vis nu brugeren taster to ord ... fx "bil" og "køretøj" i samme søgning "bil køretøj". Så finder den jo kun records med begge ord skrevet som "bil køretøj". Hvordan sikrer man at den finder alle resultater på begge søgeord?
Avatar billede arne_v Ekspert
20. november 2008 - 15:08 #6
Lidt afhaengig af hvad du vil:

... WHERE f1 LIKE '%bil%koeretoej%'

... WHERE f1 LIKE '%bil%' AND f1 LIKE '%koeretoej%'

... WHERE f1 LIKE '%bil%' OR f1 LIKE '%koeretoej%'

... WHERE f1 LIKE '%bil%' AND f2 LIKE '%koeretoej%'

... WHERE f1 LIKE '%bil%' OR f2 LIKE '%koeretoej%'
Avatar billede Slettet bruger
20. november 2008 - 16:00 #7
Hvis du vil separere flere ord, der er skrevet i samme sætning, så handler det vel blot om at bede om at få adskilt ordene ved hvert mellemrum.

Arne V > Denne sætning:
    ... WHERE f1 LIKE '%bil%koeretoej%'
Giver den en søgning, hvor begge ord skal forekomme (jeg kendte den ikke ;)? I så fald så er mønstret vel, at alle mellemrum udskiftes med et %-tegn, fx vha. en simpel replace-kommando.

  // Steeven
Avatar billede arne_v Ekspert
20. november 2008 - 16:03 #8
Den matcher alt hvor bil staar foer koeretoej.
Avatar billede timmwillum Nybegynder
20. november 2008 - 19:55 #9
Ja, jeg var også nået så langt som '%bil%koeretoej%'. Og det virker fint, men er jo ikke helt godt nok, hvis brugeren regner med at få alle poster, hvor enten bil eller køretøj indgår ... eller hvor begge indgår i omvendt rækkefølge.

Hvordan separerer jeg ordene og derefter bygger en sql til det passende antal ord. For det kan jo også være 3, 4 eller flere ord. Vel sagtens noget med split.

Jeg finder lige koden, som den ser ud nu og poster herefter ...
Avatar billede timmwillum Nybegynder
20. november 2008 - 20:07 #10
Her er så en søgefunktion, der fungerer, men har ovenstående svaghed ... nogen som kan hjælpe med spørgsmålet fra 20/11-2008 19:55:01?

<table border="0" width="200" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
      <input value="<%=request.form("search")%>" type="text" name="search" size="18">
      <input name="send" align="top" type="submit" value="Søg">
      </form>
    </td>
  </tr>
</table>

<%
If request.form("search") <> "" Then
    language = "DK" 'kan senere hentes fra db eller query

    txtSearch = request("search")
    txtSearch = Replace(txtSearch," ","%")
    txtSearch = Replace(txtSearch,"'","")

    cString = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=xxx.dk; DATABASE=xxx; UID=xxx; PWD=xxx;"

    'Så finder vi posterne
    Set RS = Server.CreateObject("ADODB.RecordSet")
    Sql = "SELECT * FROM tblSprogVarer WHERE (sprogKort = '" & language & "' and (varenavn LIKE '%" & txtSearch & "%' OR varebeskrivelse LIKE '%" & txtSearch & "%' OR detaljebeskrivelse LIKE '%" & txtSearch & "%')) LIMIT 20"
    RS.CursorType = 2
    RS.LockType = 3
    RS.Open Sql, cString


    %>
    <table class="table_shop" cellspacing="0" cellpadding="0">
    <%
                                   
    'for x = 1 to pageLimit
      IF NOT (RS.eof or RS.bof) Then
        Do while NOT (RS.eof or RS.bof)
               
            Set vareRS = Server.CreateObject("ADODB.RecordSet")
            vareSql = "SELECT * FROM tblVarer WHERE varenummer =" & RS("varenummer")
            vareRS.CursorType = 2
            vareRS.LockType = 3
            vareRS.Open vareSql, cString
                       
            If NOT (vareRS.eof or vareRS.bof) then
                aktiv = vareRS("aktiv")
                billedUrl = vareRS("billedUrl")
            End if
                       
            vareRS.Close
            Set vareRS = Nothing
                                   
            If aktiv = "ja" then
                response.write "<tr>"
                response.write "<td class=""td_overskrift"" style=""border-right: 0"">" & RS("varenavn") & "</td>"
                response.write "</tr>"
                response.write "<tr>"
                response.write "<td class=""td_indhold"" style=""padding:5px"">" & replace(left(RS("varebeskrivelse"),100),"<br>"," ") & " ... "
                response.write "<a title=""Se varen"" href=""../default.asp?page=shop&amp;action=detaljer&amp;item=" & RS("varenummer") & "&amp;billedUrl=" & billedUrl & """>Gå til varen >></a></td>"
                response.write "</tr>"
            End if
            RS.movenext
        Loop
      Else
        response.write "<p class=""errorText"">Søgningen gav ingen resultater</p>"
      End if
    'Next 'x
               
    'afslut tabel
    response.write "</table>"
                   
       
    'Close and dispose of our DB objects
    'RS.Update
    RS.Close
    Set RS = Nothing
End if

'Det var vist det hele, tror jeg har alt det relevante med
%>
Avatar billede arne_v Ekspert
20. november 2008 - 20:22 #11
Du kan splitte feltet op i ord og saa dynamisk konstruere en WHERE med flere betingelser med
AND eller OR imellem.
Avatar billede Slettet bruger
20. november 2008 - 20:43 #12
Kan man ikke oprette en array, som indholder hvert søgeord...
Altså noget i retningen af følgende:


    Dim sog_array

    sog_array = split(txtSearch, " ")
      ' Nu er hvert søgeord gemt.
      ' 3 søgeord ville fx være gemt i sog_array(0), sog_array(1) og sog_array(2)


    Sql = "SELECT * FROM tblSprogVarer WHERE (sprogKort = '" & language & "' and ("

      FOR i=0 TO sog_array.Count-1
        Sql = Sql & "varenavn LIKE '%" & sog_array(i) & "%' OR "
      NEXT

      FOR i=0 TO sog_array.Count-1
        Sql = Sql & "varebeskrivelse LIKE '%" & sog_array(i) & "%' OR "
      NEXT

      FOR i=0 TO sog_array.Count-1
        Sql = Sql & "detaljebeskrivelse LIKE '%" & sog_array(i) & "%'"

        IF sog_array(i)<>sog_array.Count-1 THEN
          " OR "
        END

      NEXT

    Sql = Sql & ")) LIMIT 20"
     

Hver gang der står en FOR-TO-kommando, så skrives hvert søgeord igen i SQL-forespørgslen.

  // Steeven
Avatar billede arne_v Ekspert
20. november 2008 - 20:55 #13
man kan ikke blande SQL og VBS

noget a la:

sqlstr = "SELECT * FROM tabelnavn WHERE FALSE "
vals = Split(fld, " ")
For i = LBound(vals) To UBound(vals)
  sqlstr = sqlstr & " OR feltnavn LIKE '%" & vals(i) & "%' "
Next
Avatar billede timmwillum Nybegynder
20. november 2008 - 22:07 #14
Det ser meget rigtigt ud ... ser på det i løbet af weekenden, da jeg er løbet ud af tid :-(    ...beklager
Avatar billede timmwillum Nybegynder
26. november 2008 - 22:17 #15
Hali halo ... det gjorde I sku' godt svende. Det virker ved en kombination af jeres forslag krydret med lidt fantasi ;-)

arne v: Man kan måske nok ikke kombinere SQL og VBS, men det er jo faktisk heller ikke det, der sker. Jeg har bare først opbygget en sql-streng, som så bagefter eksekveres med VBS'en???
Kan du ikke lige fortælle mig lidt om "FALSE". Jeg har ikke set den før, men forstår at den vel bare opfattes som en "tom" parameter. Uden den ville jeg jo have problemet med, om sql opbygningen skal starte eller slutte med et "OR". Den virker i hvert tilfælde efter hensigten ...
Smid lige et svar, så deler jeg point mellem jer begge!

'----------
'Byg Sql
    Dim arrSearch
    arrSearch = split(txtSearch, " ")
    ' Nu er hvert søgeord gemt.
    ' 3 søgeord ville fx være gemt i sog_array(0), sog_array(1) og sog_array(2)
   
    Sql = "SELECT * FROM tblSprogVarer WHERE (sprogKort = '" & language & "' and (FALSE"
   
      For i = LBound(arrSearch) To UBound(arrSearch)
        Sql = Sql & " OR varenavn LIKE '%" & arrSearch(i) & "%' OR varebeskrivelse LIKE '%" & arrSearch(i) & "%' OR detaljebeskrivelse LIKE '%" & arrSearch(i) & "%'"
      NEXT 'i
   
    Sql = Sql & ")) LIMIT 20"
'----------


NB Hvis nogen skulle få lyst til at anvende den fulde søgefunktion med udgangspunkt i indlægget fra 20/11-2008 20:07:30, skal I huske at erstatte Sql-sætningen med ovenstående ... og samtidig er det nødvendig at slette linjen: 'txtSearch = Replace(txtSearch," ","%")
Avatar billede arne_v Ekspert
26. november 2008 - 22:34 #16
FALSE er kun for at undgå at håndtere første gennemløb specielt.
Avatar billede arne_v Ekspert
26. november 2008 - 22:35 #17
Og et svar fra mig.
Avatar billede arne_v Ekspert
26. november 2008 - 22:35 #18
Om igen.
Avatar billede arne_v Ekspert
26. november 2008 - 22:36 #19
Og teknikken med at opbygge SQL streng i VBS og så udføree rmåden at gøre det på.

Husk at validere input data !

Dynamisk SQL er sårbaty overfor SQL injection.
Avatar billede timmwillum Nybegynder
28. november 2008 - 09:19 #20
Jeg har en validering på input ... så jeg undgår appostrof! Det er vel primært, det du hentyder til?
Avatar billede Slettet bruger
28. november 2008 - 11:49 #21
Tak for point.

  // Steeven
Avatar billede arne_v Ekspert
28. november 2008 - 16:03 #22
Ja. Omend nogen gange kan der også være andre kritiske tegn.
Avatar billede timmwillum Nybegynder
29. november 2008 - 10:27 #23
Det er mig, der takker ...
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