03. juli 2012 - 16:02Der er
14 kommentarer og 1 løsning
Data type mismatch in criteria expression
Hejsa ...
På en webside har jeg følgende link ...
.../test.asp?gr=1
I selve test.asp laver jeg
strsql = "SELECT * FROM udbud where gruppe = ('"& clng(request("gr")) &"') ORDER BY produkt, pot asc"
Kolonnen i min access database er langt heltal ... jeg får følgende fejl ...
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression. ../udbud.asp, line 15
Skifter jeg request'en ud med fx et et tal ... så spiller det bare ...
Det er ikke request/request.querystring der gør forskellen - der er bare ingen grund til at lede hele request-objektet igennem hvis du ved at værdien altid ligger i querystring.
at typecaste hjælper lidt på sikkerheden da input af en SQL-string ville gøre at koden fejlede - men ellers gør det ingen forskel her, dog skal der ikke ' omkring.
Replace er rigtig nok en måde mange forsøger at beskytte sig mod SQL injections ved men at replace med ~ giver ingen mening da man altid bør opbevare data som brugeren har skrevet dem ind, hvordan vil du ellers kunne se om brugeren har skrevet ' eller reelt et ~? Den rigtige måde er at bruge parametre.
Well, point taken, du har ret; jeg kan selvfølgelig ikke se om brugeren har skrevet ' eller ~ men et tal bør vel næppe indeholde en enkeltpling? Men hvis det er vigtigt at parse netop enkelplingen kunne det måske gøres som
strsql = "SELECT * FROM udbud WHERE gruppe = '"& replace(request.querystring("gr"), "'", chr(39)) &"' ORDER BY produkt, pot ASC" ?
eller
strsql = "SELECT * FROM udbud WHERE gruppe = '"& replace(request.querystring("gr"), "'", "'") &"' ORDER BY produkt, pot ASC" ?
Vil du forklare hvad du mener med "at bruge parametre"?
Tak for svar - jeg lærer nyt hele tiden: Rigtig god artikel, men hvad betyder tallene, i parantesen: Cmd.Parameters.Append(Cmd.CreateParameter("@username", 200, 1, 50))
Hvis det skal være et tal, som overføres, kan man så ikke også "sikre sig" på denne måde:
gr = request.querystring("gr") If isNumeric(gr) Then strsql = "SELECT * FROM udbud WHERE gruppe = "&gr&"' ORDER BY produkt, pot ASC" End If ?
Jo, du vil sagtens kunne sikre dig på den måde men det vil stadig være uhensigtsmæssigt da du så også skal opfinde en måde at håndtere strings på. Sætter du dig ind i parametre og benytter dem konsekvent har du en ensartet måde at gøre tingene på uanset datatyper.
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.