Avatar billede cholden Nybegynder
29. august 2006 - 17:05 Der er 12 kommentarer

Søge script virker ikke

Hej eksperter

Hvorfor virker mit søge script ikke. Den ingen resultater selvom man slet ikke skriver noget i felterne!

-------------kode---------------
    If Request.Form("beskrivelse") <> Request.Form("beskrivelse2") <> Request.Form("vekst") <> Request.Form("lov") <> Request.Form("blomst") <> Request.Form("frugt") <> Request.Form("alder") <> Request.Form("str") <>  "" then
    Set DB = Server.CreateObject("ADODB.Connection")
    DBSti = "DBQ=" & Server.Mappath("../../../../log/db.mdb")
    DB.Open "DRIVER={Microsoft Access Driver (*.mdb)}; " & DBSti
    SQL = "select * FROM lager WHERE " _
    & "beskrivelse like '%" & Request.Form("beskrivelse") & "%' AND " _
    & "beskrivelse2 like '%" & Request.Form("beskrivelse2") & "%' AND " _
    & "vekst like '%" & Request.Form("vekst") & "%' AND " _
    & "lov like '%" & Request.Form("lov") & "%' AND " _
    & "blomst like '%" & Request.Form("blomst") & "%' AND " _
    & "frugt like '%" & Request.Form("frugt") & "%' AND " _
    & "alder like '%" & Request.Form("alder") & "%' AND " _
    & "str like '%" & Request.Form("str") & "%';"
   
    Set rs = db.Execute (SQL)
   
    If not rs.eof then
    DO WHILE NOT rs.EOF
   
        id = rs("id") + 2152
        beskrivelse = rs("beskrivelse")
        beskrivelse2 = rs("beskrivelse2")
        vekst = rs("vekst")
        lov = rs("lov")
        blomst = rs("blomst")
        frugt = rs("frugt")
        alder = rs("alder")
        str = rs("str")
        pris = rs("pris")
        nr = rs("nr")
        gruppe = rs("gruppe")

Response.Write id
Avatar billede madeindk Nybegynder
29. august 2006 - 17:08 #1
Hvilken fejl modtager du?
Avatar billede nielle Nybegynder
29. august 2006 - 17:09 #2
Dette er ihvertfald ulovligt ASP-kode:

If Request.Form("beskrivelse") <> Request.Form("beskrivelse2") <> Request.Form("vekst") <> Request.Form("lov") <> Request.Form("blomst") <> Request.Form("frugt") <> Request.Form("alder") <> Request.Form("str") <>  "" Then
Avatar billede nielle Nybegynder
29. august 2006 - 17:12 #3
Skulle jo nok have været:

If (Request.Form("beskrivelse") <> "") AND (Request.Form("beskrivelse2") <> "") AND (Request.Form("vekst") <> "") AND (Request.Form("lov") <> "") AND (Request.Form("blomst") <> "") AND (Request.Form("frugt") <> "") AND (Request.Form("alder") <> "") AND (Request.Form("str") <>  "") Then
Avatar billede cholden Nybegynder
29. august 2006 - 17:27 #4
Selv om jeg fjerner det sker der intet. Den kommer ikke med nogen fejl eller noget..
Avatar billede nielle Nybegynder
29. august 2006 - 17:31 #5
Sådan som den er formuleret så skal *samtlige* felter i din form være udfyldt. Desuden skal det som fremsøges opfylde *alle* søgekriterierne. Dette er temmeligt skrappe krav, og hvis der bare er et sted det ikke er opfyldt så bliver der ikke vist noget.
Avatar billede cholden Nybegynder
29. august 2006 - 20:01 #6
Okay. Du er fat i noget der vil jeg mene.

Det er meningen at man kan lade nogle felter være tomme, hvis man ikke ønsker at sortere efter dem. Og f.eks kun skrive i et og få svar ud fra dét ene felt man har udfyldt.
Avatar billede nielle Nybegynder
29. august 2006 - 20:18 #7
Ja, så skal det hele faktisk laves om.

Prøv at læse denne her tråd igennem for ideer:

http://www.eksperten.dk/spm/723681
Avatar billede cholden Nybegynder
29. august 2006 - 21:12 #8
Det fatter jeg ærligtalt ik!
Avatar billede nielle Nybegynder
29. august 2006 - 23:59 #9
Det er da ellers den samme problemstilling som du har...

Du har en form med nogle felter, og du ønsker at søge ud fra hvad dine brugere skriver i felterne. Hvert indtastnings-felt:

<form ...>
<input type="text" name="eksempel">
</form>

- skal resultere i at der kommer et led i SQL-sætningens WHERE-del:

sql = "SELECT * FROM dinTabel WHERE ... eksempel LIKE '%" & Request.Form("eksempel") & "%' ..."

Hvis der er mere end et felt som der skal søges på:

<form ...>
<input type="text" name="eksempel1">
<input type="text" name="eksempel2">
</form>

- så skal der flere LIKE-udtryk med i WHERE-delen. Dette betyder at der samtidigt skal en AND imellem hver af dem (alternativt en OR):

sql = "SELECT * FROM dinTabel WHERE ... eksempel1 LIKE '%" & Request.Form("eksempel1") & "%' AND eksempel2 LIKE '%" & Request.Form("eksempel2") & "%' ..."

Problemet er nu, at hvis der ikke står noget i et af felterne så skal det tilsvarende LIKE-led ikke med. Vi er altså nødt til at løbe de mulige felter igennem og - for hvert felt - se om dette er udfyldt eller ej. Hvis det er udfyldt, så skal der et LIKE-led på, og hvis der er mere end ét LIKE-led ialt så skal der AND imellem dem. Til dette formål har vi funktionen AddToWhereLed(), men mere om denne om lidt.

Dette er altså problemstillingen.

Lad os starte fra starten. Vi bygger din SQL-sætningen op bid for bid. Først SELECT-keyword'et

sql = "SELECT * FROM lager"

Til denne skal vi nu have lagt en WHERE-del. Denne skal i dit tilfælde have et (potentielt) LIKE-led for følgende felter:

1) beskrivelse,
2) beskrivelse2,
3) vekst,
4) lov,
5) blomst,
6) frugt,
7) alder, og
8) str

Vi starter derfor med et hel tomt WHERE-led:

whereLed = ""

Derefter kalder vi AddToWhereLed() for hvert af disse:

whereLed = ""
AddToWhereLed("beskrivelse")
AddToWhereLed("beskrivelse2")
AddToWhereLed("vekst")
AddToWhereLed("lov")
AddToWhereLed("blomst")
AddToWhereLed("frugt")
AddToWhereLed("alder")
AddToWhereLed("str")

Og så til funktionen AddToWhereLed(), som ser sådan her ud:

Sub AddToWhereLed(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If whereLed <> "" Then
            whereLed = whereLed & " AND"
        End If
        whereLed = whereLed & " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

Denne er sådan indrettet at hvis du kalder AddToWhereLed("blomst") så vil den:

1) Undersøge om Request.Form("blomst") er tom eller ej. Hvis den er tom, så sker der ikke noget for dette indtastnings-felt.
2) Hvis den ikke er tom, så lægges der et LIKE-led på whereLed-variablen.
3) Hvis der allerede er andre LIKE-led i whereLed-variablen så adskille det nye fra disse med en AND (som du kan vælge at lave om til en OR hvis det i stedet er det du ønsker).

I tilfældet "blomst", kommer dette LIKE-led til at se sådan her ud:

whereLed = "... blomst " LIKE '%" & Request.Form("blomt") & "%' ..."

Nu har vi så lavet WHERE-delen, og den skal så bare smækkes i enden af SQL-sætningen fra før.

Men vent: whereLed kan faktisk godt være hel tom. Dette sker hvis der slet ikke var udfyldt nogle felter overhovedet. Hvis den derimod ikke er tom, så mangler vi faktisk at have selve WHERE-keyword'et med.

Derfor:

If whereLed <> "" Then
    whereLed = " WHERE" & whereLed
End If

Og så bag på SQL-sætningen:

sql = sql & whereLed


.oOo.

Til sidst samles det hele i et stort script:

' Definition af proceduren AddToWhereLed().
Sub AddToWhereLed(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If whereLed <> "" Then
            whereLed = whereLed & " AND"
        End If
        whereLed = whereLed & " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

If (Request.Form("beskrivelse") <> "") OR (Request.Form("beskrivelse2") <> "") OR (Request.Form("vekst") <> "") OR (Request.Form("lov") <> "") OR (Request.Form("blomst") <> "") OR (Request.Form("frugt") <> "") OR (Request.Form("alder") <> "") OR (Request.Form("str") <>  "") Then

    ' Start på SQL-sætningen.
    sql = "SELECT * FROM lager"

    ' Start på WHERE-delen.
    whereLed = ""

    ' Beregn LIKE-leddene i WHERE-delen.
    AddToWhereLed("beskrivelse")
    AddToWhereLed("beskrivelse2")
    AddToWhereLed("vekst")
    AddToWhereLed("lov")
    AddToWhereLed("blomst")
    AddToWhereLed("frugt")
    AddToWhereLed("alder")
    AddToWhereLed("str")

    ' Gør WHERE-delen færdig.
    If whereLed <> "" Then
        whereLed = " WHERE" & whereLed
    End If

    ' Læg WHERE-delen til SQL-sætningen.
    sql = sql & whereLed

    ' Udskrive den sådan at du kan se resulatet.
    Response.Write "DEBUG: " & sql & "<br>"

    ' Udfør SQL-sætningen.
    Set rs = db.Execute(sql)
   
    ' Udskriv resultaterne.
    Do While Not rs.EoF
        id = rs("id") + 2152
        beskrivelse = rs("beskrivelse")
        beskrivelse2 = rs("beskrivelse2")
        vekst = rs("vekst")
        lov = rs("lov")
        blomst = rs("blomst")
        frugt = rs("frugt")
        alder = rs("alder")
        str = rs("str")
        pris = rs("pris")
        nr = rs("nr")
        gruppe = rs("gruppe")

        Response.Write id

        rs.MoveNext
    Loop

End If


Det var en stor mundfuld ... håber at det hjalp på forståelsen?
Avatar billede cholden Nybegynder
30. august 2006 - 08:34 #10
Det gjorde det i hvertfald! Fedt du ider bruge så lang tid på aet hjælpe mig!

Forstår bare ikke det her:
---
Sub AddToWhereLed(key)
    value = "" & Request.Form(key)
---
Så gør den:
value = "" & Request.Form(key)
For hver:
AddToWhereLed("")

eller?
Avatar billede nielle Nybegynder
30. august 2006 - 09:29 #11
Jeg har nogen gange oplevet problemer med felter som ikke var udfyldt. I disse tilfælde kunne Request.Form(key) godt være udefineret.

Tricket:

value = "" & Request.Form(key)

- gør det at den konvertere det til en streng (dvs. den tomme streng i dette tilfælde).
Avatar billede nielle Nybegynder
05. september 2006 - 22:43 #12
Ellers andet?
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