webForumDet fria alternativet

Insert och klåpare

ASPur ASP

20 svar · 952 visningar · startad av Nova

NovaMedlem sedan feb. 2005216 inlägg
#1

Jag hade en tråd nyss om update, nu kommer en följd fråga från en som jag, om jag nu vill lägga till en användare går det att återanvända denna kod och bara byta ut en del och vilken del i sånna fall när jag vill lägga till en användare?

<% If Request.QueryString = "upanv" Then %>
<%
str = "update anvandare set" & _
    " anv_namn = '" & request.form("namn") & "'," & _
    " anv_enamn = '" & request.form("e_namn") & "'," & _
    " anv_fodd = " & request.form("fodd") & "," & _
    " anv_ort = '" & request.form("ort") & "'," & _
    " anvmail_osyn = '" & request.form("mailadress") & "'," & _
    " anv_alias = '" & request.form("alias") & "'," & _
    " anv_losen = '" & request.form("losen") & "'," & _
    " anv_beskrivning = '" & request.form("beskrivning") & "'" & _
    " WHERE anv_nr = " & Request.Form("anv_nr") & " "
	
	set conn = Server.CreateObject("ADODB.Connection")
conn.Open MM_jaktdagbok_STRING
conn.execute str, ,128
conn.close
set conn = nothing
Response.Redirect  "testupp_datera.asp"%>
<% End if %>

alltså typ bara byta ut update mot insert?

@ndersMedlem sedan juni 200032 969 inlägg
#2

Det är inte bara att byta ut UPDATE mot INSERT dessvärre. Syntaxen skiljer sig också.

UPDATE-syntax:

UPDATE tbl SET fld1 = 1, fld2 = 2 WHERE fld3 = 3

INSERT:

INSERT INTO tbl (fld1, fld2) VALUES (1, 2)

Du får bygga om din ASP-kod så det skapas en SQL-fråga enligt INSERT-syntaxen. Men det är mest klipp och klistra-jobb.

mvh

Engine^Medlem sedan dec. 20003 887 inlägg
#3

Förtydligar lite

function FixFormInject( strId )
  FixFormInject = replace( request.form( strId ), "'", "''" )
end function

str = "INSERT INTO anvandare ( anv_namn, anv_enamn, anv_fodd, ..., anv_beskrivning )" & _
  " VALUES ('" & FixFormInject( "namn" ) & "'," & _
  " '" & FixFormInject( "e_namn" ) & "'," & _
  " " & request.form( "fodd" ) & "," & _
  "..." & _
  " '" & FixFormInject( "beskrivning" ) & "' )"

set conn = Server.CreateObject( "ADODB.Connection" )
conn.open MM_jaktdagbok_STRING
conn.execute str, , 128
conn.close
set conn = nothing

response.redirect "testupp_datera.asp"
NovaMedlem sedan feb. 2005216 inlägg
#4

Ja då kom första problemet.

<% function FixFormInject( strId )
  FixFormInject = replace( request.form( strId ), "'", "''" )
end function

str = "INSERT INTO anvandare ( anv_namn, anv_enamn, anv_fodd, anv_typ, anv_ort, anv_beskrivning, anvmail_osyn, anv_alias, anv_losen, anv_regdat )" & _
  " VALUES ('" & FixFormInject( "namn" ) & "'," & _
  " '" & FixFormInject( "e_namn" ) & "'," & _
  " " & request.form( "fodd" ) & "," & _
    " " & request.form( "anv_typ" ) & "," & _
  " '" & FixFormInject( "ort" ) & "'," & _
  " '" & FixFormInject( "beskrivning" ) & "' )"
  " '" & FixFormInject( "mailadress" ) & "' )"
  " '" & FixFormInject( "beskrivning" ) & "' )"
  " '" & FixFormInject( "alias" ) & "' )"
  " '" & FixFormInject( "losen" ) & "' )"
    " " & request.form( "anv_regdat" ) & "," & _

set conn = Server.CreateObject( "ADODB.Connection" )
conn.open MM_jaktdagbok_STRING
conn.execute str, , 128
conn.close
set conn = nothing

response.redirect "testupp_datera.asp" %>
Microsoft VBScript compilation (0x800A0400)
Expected statement
/jaktdagbok/wwwroot/sida_som_uppdaterar.asp, line 44
" '" & FixFormInject( "mailadress" ) & "' )"
@ndersMedlem sedan juni 200032 969 inlägg
#5

Vissa av raderna har du glömt att avsluta med & _ för att meddela att det fortsätter på nästa rad.

Du saknar också en del kommatecken mellan fältvärden.

NovaMedlem sedan feb. 2005216 inlägg
#6

Var hem på lunchen tidigare, stressade och missade att skriva in allt.

Nu när jag har ordnat till dessa så får jag ett nytt felmess (som vanligt)

Error Type:
Microsoft JET Database Engine (0x80040E14)
Syntax error (missing operator) in query expression '<g'.
/jaktdagbok/wwwroot/sida_som_uppdaterar.asp, line 52

Rad 52 är

conn.execute str, , 128

Ändrade felmedelande

J.N.Medlem sedan apr. 20031 660 inlägg
#7

HEJ!

Du slutar med ... & "," & _, vilket du inte kan, vilket ingår i det @nders skriver.

Dock, jag tror att du lekt för mycket med tangentbordet, och skrivit in <g (med mera) i ett fält, vilket ger dig ett fel.

Testa med riktig data istället, eller återkom med den koden som gäller.

NovaMedlem sedan feb. 2005216 inlägg
#8

Ja jag hade lekt med tangentbordet när jag gjorde ordentligt så vart felet.

Error Type:
Microsoft JET Database Engine (0x80040E14)
Syntax error in INSERT INTO statement.
/jaktdagbok/wwwroot/sida_som_uppdaterar.asp, line 52

Browser Type:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; .NET CLR 1.1.4322; .NET CLR 1.0.3705) 

Page:
POST 187 bytes to /jaktdagbok/wwwroot/sida_som_uppdaterar.asp

POST Data:
namn=peder&e_namn=N%E4slund&alias=Test&ort=Lule%E5&fodd=1966&anvmail_synlig=&beskrivning=Test+text
&anv_bild=&losen=C5DY8TDttj&anv_regdat=8%2F17%2F2005&anv_typ=1&mailadress=peder@lyckas.nu

Regdat verkar vara lite konstigt? det ska vara datumformat 08/17/2005 // Uppdaterat Satte brädgårdar runt datumet men samma fel kvarstår.

Engine^Medlem sedan dec. 20003 887 inlägg
#9

Skriv ut sql-satsen som exekveras

response.write str
response.flush
conn.execute str, , 128

Enklare att se vad som trilskas då

NovaMedlem sedan feb. 2005216 inlägg
#10

Om jag kör en response.write på str, så verkar jag få rätt värden.

INSERT INTO anvandare ( anv_namn, anv_enamn, anv_fodd, anv_typ, anv_ort, anv_beskrivning, anvmail_osyn, anv_alias, anv_losen, anv_regdat ) 
VALUES ('Peder', 'Näslund', '1966', '1', 'Luleå', 'Testtext', 'Peder@lyckas.nu', 'Nova', 'rzZzIN1sY9', #8/17/2005# ,

Jag har radbrutit.

Engine^Medlem sedan dec. 20003 887 inlägg
#11

Nja... du har ett kommatecken för mycket och en parantes för lite i slutet.

NovaMedlem sedan feb. 2005216 inlägg
#12

kommat är borta men vart ska jag sätta parantesen?

" #" & request.form( "anv_regdat" ) & "#[B])[/B]  "

Blir det ett annat felmedelande

Error Type:
Microsoft JET Database Engine (0x80040E07)
Syntax error in date in query expression '##'.
/jaktdagbok/wwwroot/sida_som_uppdaterar.asp, line 52
NovaMedlem sedan feb. 2005216 inlägg
#13

Fick till det jag tog bort # och satte dit ' istället.

Tackar alla inblandade det är tur att ni finns annars kunde inte klåpare som jag få till saker och ting :)

J.N.Medlem sedan apr. 20031 660 inlägg
#14

HEJ!

Bra att det fungerar, men att ta bort fnutten innebär inte automatiskt att det blir rätt.
Dock brukar det fungera ändå, men grundregeln är # runt datum för Access, inget för sql-server, fnutt för MySQL:

Access:
sql = sql & " '" & sträng & "', " & siffra & ", #" & now() & "#)"

SQL-Server:
sql = sql & " '" & sträng & "', " & siffra & ",  CONVERT(DATETIME, '" & now() & "', 102)")

MySQL:
sql = sql & " '" & sträng & "', " & siffra & ", '" & now() & "')"
@ndersMedlem sedan juni 200032 969 inlägg
#15

Dock brukar det fungera ändå, men grundregeln är # runt datum för Access, inget för sql-server, fnutt för MySQL:

Uhm, var har du fått det ifrån? SQL Server vill ha apostrofer runt datum, annars subtraheras månad och dag från året och ger en integer.

Dessutom känns det väldigt onödigt att konkatenera in now() från VBScript, då alla dbms har en egen funktion för detta.

J.N.Medlem sedan apr. 20031 660 inlägg
#16

HEJ!

Jag fick det från kod jag skrivit, och där är det så.
Om det beror på servern, felkodning av mig eller något annat, vet jag inte. Tyckte det själv var lite konstigt, men kontrollerade på en annan webb/server, och där är det likadant.
Därför postade jag svaret ändå!

now() har du rätt i, använder det här endast för att visa att det är ett datum som läggs in.

I MySQL ska man göra som du sagt till mig, http://www.webforum.nu/showthread.php?s=&postid=1037003#post1037003, använda ett TIMESTAMP, när det är ett senast redigerat-värde man ska ha in.

@ndersMedlem sedan juni 200032 969 inlägg
#17

Jag fick det från kod jag skrivit, och där är det så.

Jag tror att du har fel. :)

Man får inget felmeddelande om man utelämnar apostroferna i SQL Server, däremot får man extremt konstiga datum i sina tabeller om man gör det. Testa att köra denna SQL-fråga mot en SQL Server:

select convert(datetime, 2005-12-01)

mvh

GuffaMedlem sedan juni 2004533 inlägg
#18

Det är inte alls konstigt. Det som sker är exakt det som @anders säger, månad och dag subtraheras ifrån året, och resultatet är ett heltal.

Eftersom du konverterar talet till ett datum, så utgår den ifrån det format som används för att lagra datum internt i databasen. Datumen lagras som flyttal, där heltalsdelen är antal dagar sedan 1899-12-31.

2005 minus 12 minus 1 blir 1992. 1992 dagar sedan 1899-12-31 blir 1905-06-16.

J.N.Medlem sedan apr. 20031 660 inlägg
#19

HEJ!

Att datumen kan bli extremt konstiga vet jag, det är precis som det blir i Excel, om man inte formaterar fältet just som datum.
Kommenterar det även om upplysningen var generell, garanterar att @nders vet om det!

@nders skrev:

Jag fick det från kod jag skrivit, och där är det så.

Jag tror att du har fel. :)

Nej, det är det jag inte har, koden gjordes för flera år sedan, och har hängt med, utan problem, sedan dess.

@ndersMedlem sedan juni 200032 969 inlägg
#20

Du menar alltså att om du inte har apostrofer runt datumen i dina SQL-frågor och använder SQL-server, så lagras datumen korrekt? :o

Om du exekverar denna fråga:

INSERT INTO foo (bar) VALUES(2005-08-23)

, så lagras datumet 2005-08-23 i tabellen? (jag utgår alltså ifrån att bar är ett fält av datumtyp).

140 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)