28. december 2007 - 23:17Der er
32 kommentarer og 1 løsning
Update DB igen igen (igen?)
Hey derude ved godt denne her er stilt mange gange, men har efterhånden googlet og ekspert'et prøvet dit og dat og 4 forskellige måder at update på... jeg er end med denne kode og nu får jeg fejlen:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 3.
/admin/edit.asp, line 39
#kode edit.asp: <% strid = request.querystring("id") strnavn = trim(replace(request.form("navn"),"'","''")) strsted = trim(replace(request.form("sted"),"'","''")) If strnavn > "" AND strsted > "" then Set Conn = Server.CreateObject("ADODB.Connection") DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/fpdb/bjrigging.mdb") Conn.Open DSN SQL = "UPDATE [referencer] SET [navn] = strnavn, [sted] = strsted where id = strid" Conn.Execute(SQL) Response.Redirect "tak.asp" End If %> <form action="edit.asp" method="POST" name="update"> <p>Tilføj reference:</p> <p><input class="box" type="text" name="navn" size="20" value="<%=request.querystring("navn")%>"> jobnavn</p> <p><input class="box" type="text" name="sted" size="20" value="<%=request.querystring("sted")%>"> sted</p> <p><a href="java script:document.update.submit();">Opdatér denne reference!</a></p> </form>
nu giver jeg bare fortabt (!) nogen der kan hjælpe mvh. Kristian
får stadig denne: Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'id ='.
/admin/edit.asp, line 40
men har nu prøve at skrive response.write request.querystring("id") hvilket den også skriver, men når jeg så trykker "opdater denne reference" 'mistest' den åbenbart....
Alternativt til at lægge den i querystring er at placere id i et skjult felt i edit-formularen (du skal så blot sørge for at aflæse den i form-collection hvis den ikke ligger i querystring):
<% strid = request.querystring("id") & "" if strid = "" then strid = request.form("id") & "" end if '... %> <form action="edit.asp" method="POST" name="update"> <input type="hidden" name="id" value="<%=strid%>"> <p>Tilføj reference:</p> <p><input class="box" type="text" name="navn" size="20" value="<%=request.querystring("navn")%>"> jobnavn</p> <p><input class="box" type="text" name="sted" size="20" value="<%=request.querystring("sted")%>"> sted</p> <p><a href="java script:document.update.submit();">Opdatér denne reference!</a></p> </form>
Det der sker er, at du laver en template for hvordan parametre skal indsættes i din SQL-sætning, spørgsmålstegn er en pladsholder for en parameter.
SQL = "UPDATE [referencer] SET [navn] = ?, [sted] = ? WHERE id = ?"
Så opretter du et command-objekt der kan håndtere disse parametre og opretter hver enkelt parameter på dette command-objekt. Dette gøres med parameters.append. cmd.CreateParameter opretter en parameter med den givne type og retning ifht. din query (i de fleste tilfælde med textqueries er parametre input, så det begrænser jeg lige forklaringen til her). Et eksempel på oprettelsen og tilføjelsen af en parameter ser således ud:
NB: Det er VIGTIGT (med TextCommands som denne), at parametre tilføjes parameters-collection i den rækkefølge de forekommer i din SQL-sætning, da der ikke er nogen anden måde hvorpå ADO kan placere parametrene i din SQL-sætning.
Når du har sat dit command-objekt op, udføres den med cmd.Execute (hvilket lige bringer min opmærksomhed over på at jeg har lavet en ligge fejl i kaldet til cmd.Execute i mit eksempel - der skulle blot stå cmd.Execute - UDEN parameteren SQL).
Fordelen ved command-objektet er, at du slipper for at tænke på SQL-injections, da typekonvertering og håndtering af værdier i parametre er separeret fra selve SQL-sætningen og indholdet af parametre kan derfor ikke influere på selve SQL-sætningen.
Ja, command-objektet fritager dig ikke for at validere at dine data er korrekte inden du forsøger at smide dem efter databasen. Derfor skal du sørge for at kontrollere om de værdier du forsøger at bruge ifht. databasen er valide. Det er f.eks. ikke lovligt at bruge null-værdier i forbindelse med sammenligning af numeriske værdier med lighedstegn og hvis hverken request.querystring eller request.form indeholder en numerisk værdi for id, så vil din SQL-sætning fejle!
Så som erikjacobsen siger, så er den nemmeste løsning på kort sigt nok at ændre
Ja, det er da også lettere at bruge det man kender, men du kan spare dig selv for en del SQL-fnidder, hvis du tager dig lidt tid til at sætte dig ind i command-objektet. Det er efter min mening mere overskueligt, når du først får det gjort til en rutine at bruge og dine SQL-sætninger bliver som sagt mere overskuelige at arbejde med, da du ikke konstant flakser ind og ud af strengen med ampersand'er, apostroffer og anførselstegn flyvende om ørerne... :-)
^^^^ jeg fandt selv ud af det... ved at bytte lidt rundt hist og her så koden blev: <% if request.form("navn") > "" then Set Conn = Server.CreateObject("ADODB.Connection") DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/fpdb/bjrigging.mdb") Conn.Open DSN SQL = "UPDATE [referencer] SET [navn] = '"&request.form("navn")&"', [sted] = '"&request.form("sted")&"' where id = "&request.form("edit")&"" Conn.Execute(SQL) Conn.Close Set Conn = Nothing Response.Redirect "tak.asp?type=edit&tabel=request.querystring("tabel")" end if %> <form action="edit.asp" method="POST" name="update"> <p>Tilføj reference:</p> <p><input class="box" type="text" name="edit" size="20" value="<%=request.querystring("edit")%>"> teste</p> <p><input class="box" type="text" name="navn" size="20" value="<%=request.querystring("navn")%>"> jobnavn</p> <p><input class="box" type="text" name="sted" size="20" value="<%=request.querystring("sted")%>"> sted</p> <p><a href="java script:document.update.submit();">Opdatér denne reference!</a></p> </form>
takker for din tid og forklaring og skal du have point må du sige til --->
Ja, det er dels validering jeg hentyder til, men også sikring mod SQL-injections (som du dog har i dit oprindelige eksempel).
Næh, det er da korrekt at man ikke kan ændre i et felt som er skjult, men det fremgik bare ikke af din kode at edit-feltet var skjult (hidden) :-)
Men hvorom alt er, så tror jeg det erik snakker om er, at du bare skal være klar over de mest åbenlyse problemstillinger i forbindelse med den strategi du vælger til at arbejde med data på dit site. Du giver potentielt set uvedkommende adgang til følsomme data om andre, hvis du ikke sørger for en basal sikring mod f.eks. SQL-injections (uden i øvrigt at vide hvad dit site omhandler).
Nu ved jeg godt dette er en side, som ligger bag login og kun er for administratorer, men hvis man går på kompromis med datasikkerhed et sted, så er risikoen at man også gør det andre steder. Man kan ligeså godt lægge sig fast på nogle gode kodevaner og så være konsekvent med dem overalt (og være opmærksom på evt. forbedringer til disse kodevaner - det er den bedste måde at udvikle sig selv som udvikler)... :-)
1. at dine indtastningsfelter indeholder data der stemmer overens med det som databasen forventer (altså check for type)
2. at dine indtastningsfelter ikke indeholder tegnkombinationer som kan ødelægge din SQL-sætning (typisk apostrof der afgrænser strengværdier i SQL). I de tilfælde hvor feltet indeholder sådanne tegn skal de enten fjernes eller erstattes af en kombination som ikke ødelægger din SQL-sætning, f.eks. replace(feltværdi, "'", "''")
3. at dine indtastningsfelter ikke indeholder scriptkode som kan være farligt at vise på dine sider igen. Hvis en bruger får sneget et script ind på din side, så kører dette script i dit domæne og kan i princippet snakke med serveren og siden som det lyster. Her kunne det f.eks. injicere mere kode i dine formularer som gav yderligere udfoldelsesmuligheder på din server.
Der er sikkert mange andre ting man skal være opmærksom på, men dette er da en start (og jeg har også en del at lære på dette område ;-)).
Enkefru Hansen i Bredgade kan nok ikke, men Niels Nørd i Bitgyden 11, han kan umiddelbart. Derfor er reglen at også hidden-felter skal kontrolleres på samme måde som al andet input der kommer fra brugerens PC.
jeg har ledt lidt på siden efter div. validering men var der en af jer to der evt. ville skrive et eksempel på et felt (<input>) så jeg selv kunne prøve at arbejde udfra det med mine andre felter??
fandt også engang noget til email der kan tjekke om der er alt hvad en email indeholder ('bogstav'+'@'+'.'+'landekode') men har glemt hvor jeg fandt det...
kan man evt. lave en valideringsside og så <--include--> den på alle de sider man hhar med input-felter så man ikke skal have det på alle sine sider eller skal det til for at det fungere efter hensigten
Det kommer an på hvad du vil validere mod for hvert felt - det findes der ikke en generel regel for.
Men på de sider der modtager data fra brugeren, starter du (stort set) med en masse if-sætninger, evt med regulære udtryk der kan spare noget programmering, og først når alt er vurderet ok, så bruger du data i dine beregninger.
Og så lad være med at falde i det klassiske dybe hul: Bruger Peter har oprettet en post med id=17. Han redigerer den, og i et hidden felt skriver du 17, så du ved hvor den skal gemmes efter redigering. Men Peter er nabo til Niels Nørd, og ændrer 17 til 18 og får derved ændret noget for en anden bruger.
Det er ikke så'n bare ligetil ...
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.