Avatar billede tomic Nybegynder
25. oktober 2006 - 17:48 Der er 11 kommentarer og
1 løsning

sql update fejl

hej er der nogen der kan finde ud af hvad fejlen er her.
kilde:
strSQL = "UPDATE opgaver WHERE  opgaveid = " & request.QueryString(id) &  "SET "
strSQL = StrSQL & "fornavn ='"& replace((Request("fornavn")), "'", "") &"', "
strSQL = StrSQL & "efternavn ='"& replace((request("efternavn")), "'", "") &"', "
strSQL = StrSQL & "adresse ='"& replace((Request("adresse")), "'", "") &"', "
strSQL = StrSQL & "postnummer ='"& replace((request("postnummer")), "'", "") &"', "
strSQL = StrSQL & "byen ='"& replace((request("byen")), "'", "") &"', "
strSQL = StrSQL & "telefon ='"& replace((request("telefon")), "'", "") &"', "
strSQL = StrSQL & "email ='"& replace((request("email")), "'", "") &"', "
strSQL = StrSQL & "emne ='"& replace((request("emne")), "'", "") &"', "
strSQL = StrSQL & "problem ='"& replace((request("problem")), "'", "") &"', "
strSQL = StrSQL & "afsluttet ='"& replace((request("afsluttet")), "'", "") &"' "

'SQL eksekveres
forbin.execute(strSQL)"

fejl:
ADODB.Connection.1 (0x80004005)
SQLState: 4 Native Error Code: 1064 [TCX][MyODBC]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE opgaveid = SET fornavn =' rasmus', efternavn =' windel
Avatar billede madeindk Nybegynder
25. oktober 2006 - 18:04 #1
Hej tomic, jeg har nu kigget kiggede lidt på din SQL streng og har rettet nogle ting i den. Prøv at se om det virker nu.

<%
strSQL = "UPDATE opgaver SET "
strSQL = StrSQL & " fornavn ='" & replace((Request("fornavn")), "'", "") & "'" ,
strSQL = StrSQL & " efternavn ='"& replace((request("efternavn")), "'", "") & "'" ,
strSQL = StrSQL & " adresse ='"& replace((Request("adresse")), "'", "") & "'" ,
strSQL = StrSQL & " postnummer = '" & replace((request("postnummer")), "'", "") & "'" ,
strSQL = StrSQL & " byen = '" & replace((request("byen")), "'", "") & "'" ,
strSQL = StrSQL & " telefon = '" & replace((request("telefon")), "'", "") & "'" ,
strSQL = StrSQL & " email = '" & replace((request("email")), "'", "") & "'" ,
strSQL = StrSQL & " emne = '"& replace((request("emne")), "'", "") & "'" ,
strSQL = StrSQL & " problem = '" & replace((request("problem")), "'", "") & "'" ,
strSQL = StrSQL & " afsluttet = '" & replace((request("afsluttet")), "'", "") & "'"
strSQL = strSQL & " SET opgaveId=" & Request.QueryString("ID")

'SQL eksekveres
forbin.execute(strSQL)"
%>

Jeg er ikke helt sikker da jeg ikke har så meget tid pt.
Avatar billede tomic Nybegynder
25. oktober 2006 - 18:08 #2
Det virker ikke.
desværre nogen andre forslag?
Avatar billede madeindk Nybegynder
25. oktober 2006 - 18:09 #3
Jeg har et foreslag om 2 min. Jeg fandt nogle fejl i den jeg har skrevet :-)
Avatar billede madeindk Nybegynder
25. oktober 2006 - 18:11 #4
Prøv med denne her.

<%
strSQL = "UPDATE opgaver SET "
strSQL = StrSQL & " fornavn ='" & Replace(Request.Form("fornavn"), "'", "''") & "' ,"
strSQL = StrSQL & " efternavn ='" & Replace(Request.Form("efternavn"), "'", "''") & "' ,"
strSQL = StrSQL & " adresse ='" & Replace(Request.Form("adresse"), "'", "''") & "' ,"
strSQL = StrSQL & " postnummer = '" & Replace(Request.Form("postnummer"), "'", "''") & "' ,"
strSQL = StrSQL & " byen = '" & Replace(Request.Form("byen"), "'", "''") & "' ,"
strSQL = StrSQL & " telefon = '" & Replace(Request.Form("telefon"), "'", "''") & "' ,"
strSQL = StrSQL & " email = '" & Replace(Request.Form("email"), "'", "''")  & "' ,"
strSQL = StrSQL & " emne = '"& Replace(Request.Form("emne"), "'", "''") & "' ,"
strSQL = StrSQL & " problem = '" & Replace(Request.Form("problem"), "'", "''") & "' ,"
strSQL = StrSQL & " afsluttet = '" & Replace(Request.Form("afsluttet"), "'", "''") & "' "
strSQL = strSQL & " WHERE opgaveId=" & Request.QueryString("ID")

'SQL eksekveres
forbin.execute(strSQL)
%>
Avatar billede softspot Forsker
25. oktober 2006 - 18:12 #5
normalt ville jeg forvente denne syntaks:

strSQL = "UPDATE opgaver SET "
strSQL = StrSQL & "fornavn ='"& replace((Request("fornavn")), "'", "") &"', "
strSQL = StrSQL & "efternavn ='"& replace((request("efternavn")), "'", "") &"', "
strSQL = StrSQL & "adresse ='"& replace((Request("adresse")), "'", "") &"', "
strSQL = StrSQL & "postnummer ='"& replace((request("postnummer")), "'", "") &"', "
strSQL = StrSQL & "byen ='"& replace((request("byen")), "'", "") &"', "
strSQL = StrSQL & "telefon ='"& replace((request("telefon")), "'", "") &"', "
strSQL = StrSQL & "email ='"& replace((request("email")), "'", "") &"', "
strSQL = StrSQL & "emne ='"& replace((request("emne")), "'", "") &"', "
strSQL = StrSQL & "problem ='"& replace((request("problem")), "'", "") &"', "
strSQL = StrSQL & "afsluttet ='"& replace((request("afsluttet")), "'", "") &"' "
strSQL = strSQL & "WHERE  opgaveid = " & request.QueryString(id)

men det kræver at der er indhold i request.QueryString(id) (og at id er en streng som indeholder navnet på parameteren).
Avatar billede madeindk Nybegynder
25. oktober 2006 - 18:14 #6
Softspot -> Jeg tror det er det han mener med Request.QueryString("ID") med mindre id indeholder en variabel.
Avatar billede softspot Forsker
25. oktober 2006 - 18:19 #7
madeindk >> ja, det vil jeg også tro, men jeg vil undlade at antage noget og bare forholde mig til det kode jeg ser (jeg kan ikke vide hvad der er tænkt og gjort forud for denne stump kode)... :)
Avatar billede tomic Nybegynder
25. oktober 2006 - 18:20 #8
nu går den helt i ged
Avatar billede madeindk Nybegynder
25. oktober 2006 - 18:21 #9
Nej, det er rigtigt softspot. Jeg giver dig rettet, jeg rettet det dog alligevel.

Hvad siger den nu? Mig og Softspot's er praktisk talt den samme bortset fra sidte linie hvor der står: strSQL = strSQL & "WHERE  opgaveid = " & request.QueryString(id) i softspot's og i min står der: strSQL = strSQL & "WHERE  opgaveid = " & request.QueryString("id") :-)
Avatar billede tjaz Nybegynder
25. oktober 2006 - 18:39 #10
Et par små tips:

Hvis du skal fejlfinde på din kode, fordi den ikke virker, så prøv at udskrive din sql i stedet for bare at eksekvere den. Det gøres ved, at du før forbin.execute(strSQL) indsætter disse 2 linier:

response.write strSQL
response.end

Dernæst synes jeg du skulle prøve at anvende en function til at lave replace på dine inputs, prøv følgende:

Function repl(txt)
  repl = Replace(txt, "'", "''")
End Function

hvorefter du på dine inputs til databasen skriver f.eks.:

strSQL = StrSQL & "fornavn ='"& repl(Request("fornavn")) &"', "

Hvorfor? Fordi det for det første gør din kode mere overskuelig og du glemmer ikke en parentes, en ' eller noget andet som kan være med til at din kode ikke virker.

Håber det kan bruges...
Avatar billede madeindk Nybegynder
25. oktober 2006 - 18:46 #11
Nu er det godt nok ikke mig der har oprettet spørgsmålet, tjaz. Men tak for tippet alligevel :-) Det KAN brugs. 1000 tak og jeg overførte også hans SQL i et asp dokument. Det kan ses her: http://arto.sykonia.dk/sqltest.asp hvis nogen skulle være interreseret.
Avatar billede softspot Forsker
25. oktober 2006 - 19:03 #12
Jeg ville heller anbefale at benytte Command-objektet i stedet, da man så slipper for de typiske problemer med SQL-injection (jeg har dog ikke erfaring med at benytte Command-objektet sammen med MySQL, så det må der være nogen som kan teste om fungerer eller måske endda ved det i forvejen :)).

Et Command-objekt kan laves således:

' Jeg tager lige den korte version, så kan man nok se mønsteret...
sql = "UPDATE opgaver SET " & _
      "  fornavn = ? " & _
      ", efternavn = ? " & _
      ", adresse = ? " & _
      "WHERE opgaveid = ?"
set cmd = Server.CreateObject("ADODB.Command")

' sæt command-obj. forbindelse til den åbne db-forbindelse
set cmd.ActiveConnection = forbin

cmd.CommandType = adCmdText
cmd.CommandText = sql

' Tilføj parametre i den rækkefølge som det er angivet i SQL-sætnignen
cmd(0) = Request("fornavn")
cmd(1) = Request("efternavn")
cmd(2) = Request("adresse")
cmd(3) = Request.QueryString("id")
call cmd.Execute(sql)

adCmdText er en konstant som defineres i ADO-dll'en og hvis man skal bruge den i sine ASP-sider kan man smide et meta-tag ind i global.asa eller i toppen af den side hvor koden ligger (jeg foretrækker naturligvis global.asa, da jeg så slipper for at tænke mere på dette i resten af min webapplikation). Dette metatag ser således ud:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->

Som det kan ses af ovenstående er selve SQL-koden let at overskue og håndteringen af parametre til SQL-sætnignen er ret simpel (og det er godt når kode er simpelt, for så er det lettere at gennemskue og dermed mindre udsat for fejl).
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