Du må ikke have linieskift inde midt i en streng, så du kan omskrive denne linie:
sql = "select * from heste where heste '" + Request.querystring("koen") + Request.querystring("aar") + Request.querystring("farve") +"' order by navn desc"
til dette
sql = "select * from heste where heste '" + Request.querystring("koen") + Request.querystring("aar") + Request.querystring("farve") +"' order by navn desc"
I øvrigt er det nok bedst at benytte & i stedet for + til at sammensætte strenge i VBS.
sql = "select * from heste where heste = ' + Request.querystring("koen") + Request.querystring("aar") + Request.querystring("farve") +"' order by navn desc" ------------------------------------------------------------------^
Har prøvet mig lidt frem: sql = "select * from heste where heste = '" + Request.querystring("koen") + Request.querystring("aar") + Request.querystring("farve") +"' order by navn desc" Set rs = Conn.Execute(sql)
Så siger den:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
Det udskriver lige den SQL-sætning du har fået sammensat (og standser sidens udførsel). Det kan være du hurtigt kan se hvad der er galt når du ser den færdige SQL. Smid den evt. ind her, så vi kan hjælpe med at kigge på den...
Det kommer lidt an på hvad dit filtreringskriterie er, men noget kunne tyde på at du vil filtrere på koen, farve og aar. I så fald ville jeg skrive således:
Du skal benytte "and"-operatoren hvis alle kriterierne skal matches for at rækken kommer med i resultatet. Hvis det bare et et af dem der skal matche for at rækken kommer med i resultatet, skal du benytte "or"-operatoren i din SQL-sætning.
Det er nok fordi der ikke er nogen værdi i Request.querystring("aar"). Hvis der ikke er en værdi i dette felt (og det felt i øvrigt er et talfelt - altså typen af feltet - i databasen), så opstår der en fejl når man udfører forspørgslen.
Såvidt jeg kunne se på din SQL fra 01/12-2006 23:28:05, så var der ikke noget i nogle af parametrene. Du bør under alle omstændigheder lægge en validering af felterne ind i formularen på klienten, men også inden du benytter værdierne på serveren, til f.eks. at lave en forspørgsel i databasen.
<% Set conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db.mdb") sql = "select * from heste where koen = '" + Request.querystring("koen") + Request.querystring("aar") + Request.querystring("farve") +"' order by navn desc" Set rs = Conn.Execute(sql) %>
Melder ikke fejl, men den finder intet..... Har det så noget at gøre med det sted man søger ud fra ? Jeg har stillet en model op på: http://www.akhorses.dk/ASP/test.asp Kan det være fordi de ikke er forbundet rigtigt ???
<Såvidt jeg kunne se på din SQL fra 01/12-2006 23:28:05, så var der ikke noget i <nogle af parametrene. Du bør under alle omstændigheder lægge en validering af <felterne ind i formularen på klienten, men også inden du benytter værdierne på <serveren, til f.eks. at lave en forspørgsel i databasen.>>>>
Den database jeg sendte en kopi af var tom, men med nøjagtigt samme kolonner som den der er online... Ja, >aar< feltet er et tal felt...
Det er ikke sværere end så meget andet programmering, men det kræver bare at man grundliggende forståelse af hvordan databaser, forspørgsler heri, samt (procedurale) programmeringssprog fungerer... :)
Vi skal lige være enige om at bare fordi koden ikke melder fejl betyder det ikke at den er semantisk korrekt. Det er bare et udtryk for at den i det mindste er syntaktisk korrekt :)
Jeg tror den forspørgsel jeg har flikket sammen til dig i 01/12-2006 23:44:04 er god nok, du skal bare sikre dig at der er valide data i felterne aar inden du søger på dem. Alternativt, ikke søge på felterne hvis der ikke er angivet nogen værdi i dem (så skal du dog lige lave nogle forgreninger i opbygningen af din sql-sætning).
Du kan lave en forspørgsel som tager hensyn til om der er noget indhold i felterne på denne måde:
sqlw = "" sql = "select * from heste " if Request.querystring("koen")&"" <> "" then sqlw = " where koen = '" & replace(Request.querystring("koen"),"'","''") & "' " end if if Request.querystring("aar")&"" <> "" and isnumeric(Request.querystring("aar")) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar = " & Request.querystring("aar") & " " end if if Request.querystring("farve")&"" <> "" then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " farve = '" & replace(Request.querystring("farve"),"'","''") & " " end if sql = sql & sqlw & " order by navn desc"
Ehm... jeg kom lige til at kigge i din html-kode og det er jo ikke helt standard-kode, ja, rent faktisk er det slet ikke HTML-kode :)
Du skal sørge for at få HTML-koden bragt i orden (hvis den skal køre i andet end en Internet Explorer (men det bør du gøre under alle omstændigheder).
Den vigtigste pointe er dog nok at du poster dine form-felter, men forsøger at hente værdierne i Request.Querystring, hvilket ikke fører til noget godt. Når du poster noget fra en form, skal du aflæse værdierne i Request.Form. Det betyder at koden kommer til at se nogenlunde således ud:
sqlw = "" sql = "select * from heste " if Request.Form("koen")&"" <> "" then sqlw = " where koen = '" & replace(Request.Form("koen"),"'","''") & "' " end if if Request.Form("aar")&"" <> "" and isnumeric(Request.Form("aar")) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar = " & Request.Form("aar") & " " end if if Request.Form("farve")&"" <> "" then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " farve = '" & replace(Request.Form("farve"),"'","''") & " " end if sql = sql & sqlw & " order by navn desc"
Men for at adressere dit sidste indlæg (02/12-2006 00:14:01), så kan du jo lige prøve at udskrive den sql-sætning der udføres (med det trick fra indlægget http://www.eksperten.dk/spm/748317#rid6535623)
<body background="../baggrundsalgsheste%20copy.jpg" style="background-attachment: fixed"> <div align="center"> <p> </p> <p> <% Set conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db.mdb") sqlw = "" sql = "select * from heste " if Request.querystring("koen")&"" <> "" then sqlw = " where koen = '" & replace(Request.querystring("koen"),"'","''") & "' " end if if Request.querystring("aar")&"" <> "" and isnumeric(Request.querystring("aar")) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar = " & Request.querystring("aar") & " " end if if Request.querystring("farve")&"" <> "" then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " farve = '" & replace(Request.querystring("farve"),"'","''") & " " end if sql = sql & sqlw & " order by navn desc" Response.Write sql Response.End
Hvis jeg kun ændrer method til get, ser det sådan her ud når man søger:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error in string in query expression 'koen = 'Vælg venligst køn' and aar = 3 and farve = 'Vælg farve order by navn desc'.
Du bør i øvrigt lave en value til dine select-kontroller på formularen, som er tomme hvis man ikke har valgt noget, på den måde vil de ikke komme til at indgå i søgningen.
sqlw = "" sql = "select * from heste " if Request.querystring("koen")&"" <> "" then sqlw = " where koen = '" & replace(Request.querystring("koen"),"'","''") & "' " end if
aarfra = Request.querystring("aarfra")&"" aartil = Request.querystring("aartil")&"" if aarfra <> "" and isnumeric(aarfra) and aartil <> "" and isnumeric(aartil) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar between " & aarfra & " and " & aartil & " "
elseif aarfra <> "" and isnumeric(aarfra) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar >= " & aarfra & " "
elseif aartil <> "" and isnumeric(aartil) if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar <= " & aartil & " "
end if
if Request.querystring("farve")&"" <> "" then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " farve = '" & replace(Request.querystring("farve"),"'","''") & "' " end if sql = sql & sqlw & " order by navn desc"
Evt. med lidt validering på om fra er større end til (og så lige en lille rettelse til den forrige sql-kode):
sqlw = "" sql = "select * from heste " if Request.querystring("koen")&"" <> "" then sqlw = " where koen = '" & replace(Request.querystring("koen"),"'","''") & "' " end if
aarfra = Request.querystring("aarfra")&"" aartil = Request.querystring("aartil")&"" if aarfra <> "" and isnumeric(aarfra) and aartil <> "" and isnumeric(aartil) then if aarfra > aartil then ' byt rundt på alderen hvis til er mindre end fra... tmp = aartil aartil = aarfra aarfra = tmp end if
if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar between " & aarfra & " and " & aartil & " "
elseif aarfra <> "" and isnumeric(aarfra) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar >= " & aarfra & " "
elseif aartil <> "" and isnumeric(aartil) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar <= " & aartil & " "
end if
if Request.querystring("farve")&"" <> "" then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " farve = '" & replace(Request.querystring("farve"),"'","''") & "' " end if sql = sql & sqlw & " order by navn desc"
Øh nu vil den hverken buh eller bøh: <% Set conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db.mdb") sqlw = "" sql = "select * from heste " if Request.querystring("koen")&"" <> "" then sqlw = " where koen = '" & replace(Request.querystring("koen"),"'","''") & "' " end if
aarfra = Request.querystring("aarfra")&"" aartil = Request.querystring("aartil")&"" if aarfra <> "" and isnumeric(aarfra) and aartil <> "" and isnumeric(aartil) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar between " & aarfra & " and " & aartil & " "
elseif aarfra <> "" and isnumeric(aarfra) then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar >= " & aarfra & " "
elseif aartil <> "" and isnumeric(aartil) if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " aar <= " & aartil & " "
end if
if Request.querystring("farve")&"" <> "" then if len(sqlw) > 0 then sqlw = sqlw & " and " else sqlw = sqlw & " where " end if sqlw = sqlw & " farve = '" & replace(Request.querystring("farve"),"'","''") & "' " end if sql = sql & sqlw & " order by navn desc" Response.Write sql Response.End Set rs = Conn.Execute(sql) %>
Jeg kan ikke engang lave Response.Write sql Response.End . . .
For sørensen da hvor det virker!!! Jeg er ovenud lykkelig nu, har kæmpet siden Torsdag eftermiddag for at finde en løsning... Du skal have tusinde tak!!!!! Og en god nat!
NB: Jeg ved ikke om du gennemskuede det, men man kan også søge på alder større end eller alder mindre end, dvs. man behøves ikke angive både fra og til alder...
Synes godt om
Ny brugerNybegynder
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.