Avatar billede manhunter Nybegynder
23. juni 2005 - 17:22 Der er 43 kommentarer og
1 løsning

Søgefunktion med flere valg ?

Sidder lige og bixer med en søgefunktion, og jeg har INGEN idé om hvor jeg skal begynde. Det ser sådan her ud grafisk:
[url]http://manhunter.users.whitehat.dk/Soeg.JPG[/url]

Det skal være sådan at man kan søge på alle 3 ting, og så sådan så man også kan søge f.eks kun på 1 ting eller 2 ting. Kort sagt, lige meget hvad man søger på skal den finde ud af det
Koden jeg har indtil videre er:




<%
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open server.MapPath("CarTraders.mdb")
%>

<table border="0" cellpadding="6">
    <tr>
        <td>
<form name="frmsoeg" method="get" action="soeg.asp">
        Søg på:
                </tr>
            </td>
       
    <tr>
        <td>
        <select name="maerke">
            <option>Mærke</option>
            <option>BMW</option>
            <option>Audi</option>
            <option>Chevrolet</option>       
        </select>   
        </td>
    </tr>
       
        <tr>
            <td>
        <input type="text" name="txtsoegbil" value="Skriv Model">
        </td>
    </tr>
       
        <tr>
            <td>       
    <select name="aargang">
        <option>År</option>
        <option>1988</option>
        <option>1989</option>
        <option>1990</option>
        <option>1991</option>
        <option>1992</option>
        <option>1993</option>
        <option>1994</option>
        <option>1995</option>
        <option>1996</option>
        <option>1997</option>
        <option>1998</option>
        <option>1999</option>
        <option>2000</option>
        <option>2001</option>
        <option>2002</option>
        <option>2003</option>
        <option>2004</option>
        <option>2005</option>
    </select>
        </td>
    </tr>
       
        <tr>
            <td>
        <input name="submit" type="submit" value="Søg">
            </form>
            </td>
        </tr>
</table>


<%
       
        dim maerke
        dim txtsoegbil
        dim aargang
       
        maerke = request.QueryString("maerke")
        txtsoegbil = Request.QueryString("txtsoegbil")
        aargang = request.QueryString("aargang")       
       
        set rs=Server.CreateObject("ADODB.recordset")
        rs.Open "Select * from Salg where maerke = '" & maerke & "'", conn
        if maerke = "" Then
        else
        do until rs.eof
           
            Response.Write "Fornavn: "
            Response.Write(rs.fields("Fornavn") & "<br>")
           
            Response.Write "Efternavn: "
            Response.Write(rs.fields("Efternavn") & "<br>")
           
            Response.Write "Adresse: "
            Response.Write(rs.fields("Adresse") & "<br>")
           
            Response.Write "Postnr: "
            Response.Write(rs.fields("Postnr") & "<br>")
           
            Response.Write "By: "
            Response.Write(rs.fields("By") & "<br>")
           
            Response.Write "Telefon Nummer: "
            Response.Write(rs.fields("tlf") & "<br>")
           
            Response.Write "Mærke: "
            Response.Write(rs.fields("Maerke") & "<br>")
           
            Response.Write "Årgang: "
            Response.Write(rs.fields("aargang") & "<br>")
           
            Response.Write "Kilometer Kørt: "
            Response.Write(rs.fields("km") & "<br>")
           
            Response.Write "Pris: "
            Response.Write(rs.fields("pris") & "<br> <br>")
                       
            rs.movenext
                loop
                rs.close
                    end if
                    %>
Avatar billede hnteknik Novice
23. juni 2005 - 17:53 #1
Tag lidt inspiration i dette script, som jeg har sakset direkte ud af et gammelt script:

Brugercount=request.form("HEN").count
PWcount=request.form("HEN2").count
FNcount=request.form("HEN1").count
BrugerPresent=""
BrugerNiv=request.form("txtBNiveau")
datostart=request.form("HENStart")
datoslut=request.form("HENSlut")


If  Brugercount>0 then   
    firstbruger=request.form("HEN")(1)
    SQLtemp = "(brugernavn='" & firstbruger & "'"
    for counter=2 to brugercount
      whichBruger=request.form("HEN")(counter)
      SQLtemp = SQLtemp & " or Brugernavn='" & whichbruger & "' "
    next
    SQLtemp = SQLtemp & ")"
    BrugerPresent=" AND "
end if
if request.form("txtbruger")>"" then
    SQLtemp = SQLtemp & BrugerPresent & "Brugernavn like '%" & request.form("txtbruger") & "%'"
    BrugerPresent=" AND "
end if
if request.form("txtpw")>"" then
    SQLtemp = SQLtemp & BrugerPresent & "pasord like '%" & request.form("txtpw") & "%'"
    BrugerPresent=" AND "
end if
if request.form("txtfn")>"" then
    SQLtemp = SQLtemp & BrugerPresent & "Fulde_navn like '%" & request.form("txtfn") & "%'"
    BrugerPresent=" AND "
end if
If  PWcount>0 then
    firstPW=request.form("HEN2")(1)
    SQLtemp = SQLtemp & BrugerPresent & "(pasord='" & firstPW & "'"
    for counter=2 to PWcount
      whichPW=request.form("HEN2")(counter)
      SQLtemp = SQLtemp & " or pasord='" & whichPW & "' "
    next
    SQLtemp = SQLtemp & ")"
    BrugerPresent=" AND "
end if

If  FNcount>0 then
    firstFN=request.form("HEN1")(1)
    SQLtemp = SQLtemp & BrugerPresent & "(Fulde_navn='" & firstFN & "'"
    for counter=2 to FNcount
      whichFN=request.form("HEN1")(counter)
      SQLtemp = SQLtemp & " or Fulde_navn='" & whichFN & "' "
    next
    SQLtemp = SQLtemp & ")"
    BrugerPresent=" AND "
end if

If  BrugerNiv>0 then
    SQLtemp = SQLtemp & BrugerPresent & "(userlevel=" & BrugerNiv & ")"
    BrugerPresent=" AND "

end if   

If  datostart>"" and isdate(datostart) then   
    datostart= Cdate(datostart)
    datostart= CLng(datostart)
    if BrugerPresent>"" then
        SQLtemp = SQLtemp & BrugerPresent & "([OprettelsesDato] >=" & datostart & ")"
    else
        SQLtemp = "([OprettelsesDato] >=" & datostart & ")"
    end if
end if

If  datoslut>"" and isdate(datoslut) then   
    datoslut= Cdate(datoslut)
    datoslut= CLng(datoslut)
    if BrugerPresent>"" then
        SQLtemp = SQLtemp & BrugerPresent & "([OprettelsesDato] <=" & datoslut & ")"
    else
        SQLtemp = "([OprettelsesDato] <=" & datoslut & ")"
    end if
end if 
%> <font color="crimson"><%

if SQLTemp="" then
    SQLTemp=SQLStart & "true" & sqlsort
else  SQLTemp=SQLStart & SQLTemp & sqlsort
end if
response.write SQLtemp%></font></p>
Avatar billede goose Nybegynder
23. juni 2005 - 17:57 #2
Det må være noget i stil med nedenstående:

maerke = request.QueryString("maerke")
txtsoegbil = Request.QueryString("txtsoegbil")
aargang = request.QueryString("aargang")       
       
if maerke <> "" then
SQL = SQL & "maerke='" & maerke &"' AND "
end if

if txtsoegbil <> "" then
SQL = SQL & "txtsoegbil LIKE '%" & txtsoegbil &"%' AND "
end if

if aargang <> "" then
SQL = SQL & "aargang='" & aargang &"' AND "
end if

if right(SQL,4) = "AND " then
SQL = left(SQL, len(SQL)-4)
end if

set rs=Server.CreateObject("ADODB.recordset")
rs.Open "Select * from Salg where " & SQL, conn
if rs.eof Then
response.write "Ingen fundet"
else
do until rs.eof

Ovenstånde er baseret på, at dine felter i databasen hedder det samme som dine søgestrenge og at alle er at typen tekst.

/Goose
Avatar billede hnteknik Novice
23. juni 2005 - 18:06 #3
count refererer til mulighed for multi select af biler, årgange mv
Avatar billede manhunter Nybegynder
23. juni 2005 - 18:46 #4
Goose, Den siger fejl ved: rs.Open "Select * from Salg where " & SQL, conn

Forstår heller ik helt hvordan den skal stå :\ Men ellers ser det ud som jeg nogenlunde havde forestillet mig det.

Ved bare ikke lige hva det her betyder:

if right(SQL,4) = "AND " then
        SQL = left(SQL, len(SQL)-4)
        end if

hnteknik, prøver lige din om lidt :) Den er lidt mere indviklet imo
Avatar billede manhunter Nybegynder
23. juni 2005 - 21:23 #5
Cmon, nogen må lige kunne lave det så det virker :S? Skal bruge det til i morgen :(
Avatar billede goose Nybegynder
23. juni 2005 - 21:42 #6
Rolig nu, der er også lige en familie der skal have lidt tid :o)

Prøv lige og ret det her:

set rs=Server.CreateObject("ADODB.recordset")
rs.Open "Select * from Salg where " & SQL, conn

til det her:

SQLstmt = "Select * from Salg where " & SQL
set rs=conn.execute(SQLstmt)
response.write SQLstmt


- og så poster du lige den streng den udskriver

/Goose
Avatar billede goose Nybegynder
23. juni 2005 - 21:57 #7
- og til dit spørgsmål omkring

if right(SQL,4) = "AND " then
        SQL = left(SQL, len(SQL)-4)
        end if

Så gør den det, at den ser efter om SQL strengen ender på "AND " og hvis den gør, så skal den fjerne det ellers vil der komme en fejl i forespørgelsen.

/Goose

PS: Har du fået prøvet det jeg skrev 21:42 ?
Avatar billede manhunter Nybegynder
23. juni 2005 - 21:58 #8
Heh sorry goose :D

Den kager inden den kommer ind på siden

Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "maerke='' AND aargang='' AND".
/Soeg.asp, line 105

Har Den sagt hele tiden, også med den anden sætning :\
Avatar billede manhunter Nybegynder
23. juni 2005 - 21:59 #9
Hov, havde disablet noget (Det der if Right), nu siger den noget andet !

Datatyperne stemmer ikke overens i kriterieudtrykket.
/Soeg.asp, line 105
Avatar billede goose Nybegynder
23. juni 2005 - 22:00 #10
Hvis du får den fejl, så er det typisk fordi du forsøger at hente noget fra et databasefelt som ikke eksisterer

Hvad hedder felterne i din tabel ?

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:04 #11
Hmm, Det har bare ellers virket med en simpel søgning :\

De hedder:
Fornavn
Efternavn
Adresse
Postnr
By
tlf
Maerke
aargang
km
pris
Avatar billede goose Nybegynder
23. juni 2005 - 22:07 #12
Hvilke typer er dine felter med:

maerke og aargang (tekst eller tal)?

Hvor skal txtsoegbil kigge henne, du har jo ikke et felt der hedder det i din tabel ?

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:11 #13
HEh, nej den skal kigge i Model, så må det være:

if txtsoegbil <> "" then
        SQL = SQL & "txtsoegbil LIKE '%" & Model &"%' AND "
        end if

?

Tal er: Aargang, tlf og KM resten er tekst.
Avatar billede goose Nybegynder
23. juni 2005 - 22:13 #14
nej omvendt:

if txtsoegbil <> "" then
        SQL = SQL & "Model LIKE '%" & txtsoegbil &"%' AND "
        end if

og så skal du rette:

if aargang <> "" then
SQL = SQL & "aargang='" & aargang &"' AND "
end if

til:

if aargang <> "" then
SQL = SQL & "aargang=" & aargang &" AND "
end if

- tal skal jo ikke omkrandses af '

Prøv så.

/Goose
Avatar billede goose Nybegynder
23. juni 2005 - 22:15 #15
øhh hvor kom feltet "Model" ind henne, du har den da ikke med i den liste du sendte kl. 22:04 ?

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:20 #16
Glemte at skrive Model :)

Men ÉN ting virker nu :D Den vil en på siden, og den vil søge på årgang, og udskriver

Select * from Salg where Model LIKE '%Skriv Model%' AND aargang=1992 Ingen fundet

ved de 2 andre siger den Der er ikke angivet nogen værdi for en eller flere krævede parametre.
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:21 #17
Heh, det var 2 ting, men den vil ikke udksrive Årgangen selvom den passer. Der sker intet selvom der ligger en under 1992 f.eks
Avatar billede goose Nybegynder
23. juni 2005 - 22:22 #18
Okay, så virker den jo fint nok i den første del.

Prøv lige og post forespørgelsen på de andre du siger der ikke virker

/Goose
Avatar billede goose Nybegynder
23. juni 2005 - 22:24 #19
Det er jo naturligt, den skal jo vise dem der indeholder teksten "Skriv Model" og er fra 1992

Dem har du ingen af vel ?

Hvad nu hvis du fjerner teksten i model og kun søger på årgangen ?

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:24 #20
Aha, fandt lige ud af noget, Hvis man søger kun på årgang finder den intet, men hvis jeg søger på f.eks M5 i model så vil den godt finde annoncen, altså både Årgang og Model søgefeltet skal være rigtige før det virker (Skal jo helst ikke være sådan)

Har postet forespørgslen på dem, og der sagde den jo: Der er ikke angivet nogen værdi for en eller flere krævede parametre.
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:25 #21
Vil godt søge uden tekst i Model feltet, men kager hvis der står noget som ikke passer - Skal den ikke :\
Avatar billede goose Nybegynder
23. juni 2005 - 22:26 #22
Jeg tror, at hvis du kun søger på årgang og fjerner din tekst i feltet Model, så viser den det også, ikk ?

/Goose
Avatar billede goose Nybegynder
23. juni 2005 - 22:27 #23
Jamen hvis du skriver noget i feltet "Model" som ikke findes, så er det da klart den ikke finder nogle gyldige resultater.

/Goose
Avatar billede goose Nybegynder
23. juni 2005 - 22:29 #24
Dit spørgsmål lød på følgende:

"Det skal være sådan at man kan søge på alle 3 ting, og så sådan så man også kan søge f.eks kun på 1 ting eller 2 ting."

Det er det koden gør. Hvis du søger på noget som ikke findes, så skal den jo heller ikke finde nogle forekomster.

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:30 #25
Ja Den finder ingen gyldige resultater, men derudover kommer den med "Siden kan ikke vises" :D Det var Det jeg mente med kager.

BTW kan den søge uden tekst og så med Årgang, og så også med Mærket, men lige så snart der står noget itekstfeltet går den i ged.
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:30 #26
Hmm, lave tekstfeltet til en Dropdown menu ? Vil det hjælpe på besværeligheden ?
Avatar billede goose Nybegynder
23. juni 2005 - 22:33 #27
Næe det skulle ikke være nødvendigt at lave en dropdown, den vil jo søge efter noget der ligner det der er indtastet (LIKE)

Den side du får frem med siden kan ikke vises, står der ikke SQL halløj på den side ?

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:37 #28
Ja Det er self rigtigt !
Der står bare: Der er ikke angivet nogen værdi for en eller flere krævede parametre.
OG den henviser til linje 107 som er:

set rs=conn.execute(SQLstmt)
Avatar billede goose Nybegynder
23. juni 2005 - 22:38 #29
Prøv lige i din browser og vælg Funktioner > Internet Indstillinger > fanebladet "Avanceret" og fjern så vingen i feltet:

"Vis meddelser om uskadelige HTTP-fejl"

På den måde får du vist den fejl der er og ikke den der standardside med at den ikke kan vises.

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:43 #30
Den viser stadigvæk Siden kan ikke vises, efter det er slået fra :S

og så det sædvanlige

HTTP 500,100 - Intern fejl på serveren - ASP-fejl -
Internet Information Services


Fejltype:
Microsoft JET Database Engine (0x80040E10)
Der er ikke angivet nogen værdi for en eller flere krævede parametre.
/soeg.asp, line 107
Avatar billede goose Nybegynder
23. juni 2005 - 22:44 #31
Prøv lige og post hele din kode som den ser ud nu

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:45 #32
Der er jo en del :)






<%
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open server.MapPath("CarTraders.mdb")
%>

<table border="0" cellpadding="6">
    <tr>
        <td>
<form name="frmsoeg" method="get" action="soeg.asp">
        Søg på:
                </tr>
            </td>
       
    <tr>
        <td>
        <select name="maerke">
            <option>Mærke</option>
            <option>BMW</option>
            <option>Audi</option>
            <option>Chevrolet</option>       
        </select>   
        </td>
    </tr>
       
        <tr>
            <td>
        <input type="text" name="txtsoegbil" value="Skriv Model">
        </td>
    </tr>
       
        <tr>
            <td>       
    <select name="aargang">
        <option>År</option>
        <option>1988</option>
        <option>1989</option>
        <option>1990</option>
        <option>1991</option>
        <option>1992</option>
        <option>1993</option>
        <option>1994</option>
        <option>1995</option>
        <option>1996</option>
        <option>1997</option>
        <option>1998</option>
        <option>1999</option>
        <option>2000</option>
        <option>2001</option>
        <option>2002</option>
        <option>2003</option>
        <option>2004</option>
        <option>2005</option>
    </select>
        </td>
    </tr>
       
        <tr>
            <td>
        <input name="submit" type="submit" value="Søg">
            </form>
            </td>
        </tr>
</table>


<%                                           
        dim maerke
        dim txtsoegbil
        dim aargang
                               
        maerke = request.QueryString("maerke")
        txtsoegbil = Request.QueryString("txtsoegbil")
        aargang = request.QueryString("aargang")       
       
                               
        if maerke <> "Mærke" then
        SQL = SQL & "Maerke='" & Maerke &"' AND "
        end if
       
        if txtsoegbil <> "" then
        SQL = SQL & "Model LIKE '%" & txtsoegbil &"%' AND "
        end if

       
            if aargang <> "" then
        SQL = SQL & "Aargang=" & aargang &" AND "
        end if

       
        if right(SQL,4) = "AND " then
        SQL = left(SQL, len(SQL)-4)
        end if
       
        SQLstmt = "Select * from Salg where " & SQL
        set rs=conn.execute(SQLstmt)
        response.write SQLstmt

        if rs.eof Then
        response.write "Ingen fundet"
        else
        do until rs.eof
       
       
           
            Response.Write "Fornavn: "
            Response.Write(rs.fields("Fornavn") & "<br>")
           
            Response.Write "Efternavn: "
            Response.Write(rs.fields("Efternavn") & "<br>")
           
            Response.Write "Adresse: "
            Response.Write(rs.fields("Adresse") & "<br>")
           
            Response.Write "Postnr: "
            Response.Write(rs.fields("Postnr") & "<br>")
           
            Response.Write "By: "
            Response.Write(rs.fields("By") & "<br>")
           
            Response.Write "Telefon Nummer: "
            Response.Write(rs.fields("Tlf") & "<br>")
           
            Response.Write "Mærke: "
            Response.Write(rs.fields("Maerke") & "<br>")
           
            Response.Write "Årgang: "
            Response.Write(rs.fields("Aargang") & "<br>")
           
            Response.Write "Kilometer Kørt: "
            Response.Write(rs.fields("KM") & "<br>")
           
            Response.Write "Pris: "
            Response.Write(rs.fields("Pris") & "<br> <br>")
                       
            rs.movenext
                loop
                rs.close
                    end if
                    %>
Avatar billede goose Nybegynder
23. juni 2005 - 22:52 #33
Prøv lige og fjern denne

<option>År</option>

det er jo en tekst og ikke et tal

/Goose
Avatar billede goose Nybegynder
23. juni 2005 - 22:53 #34
- eller lave den her om:

  if aargang <> "" then
        SQL = SQL & "Aargang=" & aargang &" AND "
        end if

til:

  if aargang <> "År" then
        SQL = SQL & "Aargang=" & aargang &" AND "
        end if

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 22:59 #35
Uha vi nærmer os ! :D Den kunne ikke gå i ged nu, men man SKULLE vælge en årgang, så kan man ikke lige lave det om så man kan fravælge af søge på det ?

Det med if aargang <> "År" then
        SQL = SQL & "Aargang=" & aargang &" AND "
        end if

Virkede ikke, der siger den

Fejltype:
Microsoft JET Database Engine (0x80040E14)
Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "Maerke='' AND Aargang=".
/Soeg.asp, line 109

Og henviser igen til: set rs=conn.execute(SQLstmt)
Avatar billede goose Nybegynder
23. juni 2005 - 23:04 #36
Kan du ikke smide et link hvor jeg kan se det online ?

/Goose
Avatar billede manhunter Nybegynder
23. juni 2005 - 23:04 #37
Puuh, desværre :S Har ikke uploadet Den, bruger kun localhost, men kan jeg ikke sende hele projektet eller har du msn ??
Avatar billede goose Nybegynder
23. juni 2005 - 23:08 #38
Jeg har MSN på admin [@] goose.dk
Avatar billede hnteknik Novice
23. juni 2005 - 23:59 #39
Holy Balony
Holder I ikke Sct. Hans ??
Avatar billede manhunter Nybegynder
24. juni 2005 - 00:05 #40
hnteknik - Heh nope, jeg har jo det her projekt, sidder også og har "lidt" neder på ! :)

Goose fik fixet det, Tak til ham :O ! Fortsat god sct. hans alle :)
Avatar billede goose Nybegynder
24. juni 2005 - 00:13 #41
hnteknik >> nej, jeg har dårlig samvittighed over at jeg ikke har fået klippet hækken inden så jeg holder mig indendøre :o)

Løsningen var iøvrigt at checke længden på felterne ved load af siden da der blev brugt GET og ikke POST i formen.

/Goose
Avatar billede hnteknik Novice
24. juni 2005 - 13:38 #42
Godt gået her på årets hotteste aften.
Jeg toror blot ikke manhunter forstod potentialet i mit script oplæg med mulighed for multiselect af årgang, bil etc eller også havde han mere brug for en pakkeløsning ;-)
God sommer
Avatar billede goose Nybegynder
24. juni 2005 - 14:38 #43
Jeg tror også han havde brug for en komplet løsning, skulle vist afleverer et projekt i dag kl. 11 :o)

Spændt på at høre om det blev godkendt :o/

God sommer til dig også, og iøvrigt tror jeg i aften bliver mere hot end i går ..... det er godt nok varmt her i kjøvenhavnstrup :o)

/Goose
Avatar billede hnteknik Novice
24. juni 2005 - 14:51 #44
Hav en god varm weekend. En tager til westerhaushytten om få timer.
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