Avatar billede krel Nybegynder
28. december 2007 - 23:17 Der 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
Avatar billede krel Nybegynder
28. december 2007 - 23:18 #1
^^^
linie 39 er min SQL
Avatar billede erikjacobsen Ekspert
28. december 2007 - 23:27 #2
Måske:
  SQL = "UPDATE [referencer] SET [navn] = strnavn, [sted] = strsted where id = " & strid

Men sørg for at du ikke lægger det her på nettet til almindeligt brug, før du ved præcis hvad SQL-injection er.
Avatar billede erikjacobsen Ekspert
28. december 2007 - 23:28 #3
Og det gælder de andre navne også

SQL = "UPDATE [referencer] SET [navn] = *" & strnavn & "', [sted] = *" & strsted & "' where id = " & strid
Avatar billede erikjacobsen Ekspert
28. december 2007 - 23:29 #4
Nå, det er lidt tidligt på dagen - der var en slåfejl:

SQL = "UPDATE [referencer] SET [navn] = '" & strnavn & "', [sted] = '" & strsted & "' where id = " & strid
Avatar billede erikjacobsen Ekspert
28. december 2007 - 23:33 #5
Og hvor kommer din request.querystring("id") fra?
Avatar billede krel Nybegynder
28. december 2007 - 23:40 #6
jeg har et link der hedder:
edit.asp?id=<%=rs("id")%>
hvor jeg har fat i databasen...
Avatar billede erikjacobsen Ekspert
28. december 2007 - 23:42 #7
Det bør du så også have på formen i edit.asp
Avatar billede krel Nybegynder
28. december 2007 - 23:43 #8
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....
Avatar billede softspot Forsker
28. december 2007 - 23:49 #9
Du kan også benytte ADODB.Command-objektet. I så fald skulle du udskifte

SQL = "UPDATE [referencer] SET [navn] = strnavn, [sted] = strsted where id = strid"
Conn.Execute(SQL)

med

SQL = "UPDATE [referencer] SET [navn] = ?, [sted] = ? WHERE id = ?"
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandText = SQL
cmd.Parameters.Append cmd.CreateParameter("@navn", adVarChar, adParamInput, len(navn)+1, strnavn)
cmd.Parameters.Append cmd.CreateParameter("@sted", adVarChar, adParamInput, len(navn)+1, strsted)
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, 4, strid)
cmd.Execute(SQL)

Desuden vil jeg da anbefale at du sørger for at lukke din connection inden du redirectet, ellers risikerer du at løbe tør for forbindelser! Altså:

conn.close
Avatar billede krel Nybegynder
28. december 2007 - 23:51 #10
okay her må du lige forklare for fatter hat af det stykke kode jeg skal erstatte med og gider ikke bare lave en copy/paste....
Avatar billede softspot Forsker
28. december 2007 - 23:54 #11
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>
Avatar billede krel Nybegynder
28. december 2007 - 23:59 #12
ja kan se din pointe... desværre melder den stadig missing operator ;(
Avatar billede erikjacobsen Ekspert
29. december 2007 - 00:02 #13
Det er fordi du ikke har det id
Avatar billede softspot Forsker
29. december 2007 - 00:03 #14
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:

cmd.Parameters.Append cmd.CreateParameter("@navn", adVarChar, adParamInput, len(navn)+1, strnavn)

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.
Avatar billede softspot Forsker
29. december 2007 - 00:06 #15
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

<form action="edit.asp" method="POST" name="update">

til

<form action="edit.asp?id=<%=request.querystring("id")%>" method="POST" name="update">
Avatar billede krel Nybegynder
29. december 2007 - 00:08 #16
forstår nok stadig ikke helt, men altså en anden måde at hive data'erne fra et sted til et andet....

prøvede at bruge it eks. men fik en fejl...

men tror helst jeg vil prøve at holde det på SQL og querystring basis som jeg efterhånden kender godt.... hvis du forstår?
Avatar billede softspot Forsker
29. december 2007 - 00:15 #17
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... :-)
Avatar billede krel Nybegynder
29. december 2007 - 00:18 #18
^^^^
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 --->
Avatar billede krel Nybegynder
29. december 2007 - 00:22 #19
hov havde slet ikke set i var to *flov!
i må skrive hvis i skal have point...
Avatar billede erikjacobsen Ekspert
29. december 2007 - 00:26 #20
Ingen point til mig, tak. Godt det virker. Men lad nu være med at lægge noget på nettet, til du ved hvad du foretager dig.
Avatar billede krel Nybegynder
29. december 2007 - 00:29 #21
jo, men så spørg jeg måske dumt? hvordan skal jeg så teste det??
Avatar billede softspot Forsker
29. december 2007 - 00:30 #22
Det var vist ikke meget af det jeg ævlede om du brugte, så du må hellere selv nappe pointene tilbage :)
Avatar billede krel Nybegynder
29. december 2007 - 00:30 #23
^^^
desuden er dette under en admin-del der beskyttes med password...
Avatar billede softspot Forsker
29. december 2007 - 00:32 #24
Du kunne f.eks. prøve at skrive jens' i feltet navn, eller syv i edit bare for at nævne to faldgruber i det du har lavet...
Avatar billede krel Nybegynder
29. december 2007 - 01:09 #25
ja okay der er ikke nogen form for validator er det det du hentyder til....? men hvis et felt er hidden kan man vel ikke ændre i det?
Avatar billede softspot Forsker
29. december 2007 - 01:26 #26
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)...  :-)
Avatar billede krel Nybegynder
29. december 2007 - 01:42 #27
dvs. at jeg skal lave denne trim(replace på alle felter jeg har sådan at man ikke bare kan skrive 'dsfsdfsdf' i fx login og så kan man komme ind?

vil selvfølgelig gerne lave mine sider sikre!! så hvad kan jeg gøre på stående fod?
Avatar billede softspot Forsker
29. december 2007 - 01:55 #28
Det du skal mindst sikre følgende:

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 ;-)).
Avatar billede erikjacobsen Ekspert
29. december 2007 - 09:00 #29
"hvis et felt er hidden kan man vel ikke ændre i det?" - jo, det kan man.
Avatar billede softspot Forsker
29. december 2007 - 10:14 #30
erikjacobsen >> nå ja, jeg opfattede det dog som at man ikke umiddelbart som almindelig bruger af siden ikke kunne ændre det... :-)
Avatar billede erikjacobsen Ekspert
29. december 2007 - 10:16 #31
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.
Avatar billede krel Nybegynder
01. januar 2008 - 22:28 #32
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

??????
- så er der stadig 100 point ;-)
Kristian
Avatar billede erikjacobsen Ekspert
02. januar 2008 - 08:50 #33
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 ...
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