webForumDet fria alternativet

fråga ang låååång insert sql-sats

ASP

13 svar · 779 visningar · startad av rollo

Medlem sedan aug. 2001203 inlägg
Frågan#1

Tjena!

Jag har en insert sql-sats som är väldigt lång.

När jag gör min insert så görs ingenting

		SQLStmt ="INSERT INTO db_h"
		SQLStmt = SQLStmt & "(thumb,falt01,falt02,falt03,falt04, text01, text02, text03, text04, text05, text06,bild1, fil1, fil2, a_id, p_id, datum, vem,lang, prod_id,row1_1, row1_2, row1_3, row2_1, row2_2, row2_3, row3_1, row3_2, row3_3, row4_1, row4_2, row4_3, row5_1, row5_2, row5_3, row6_1, row6_2, row6_3, row7_1, row7_2, row7_3, row8_1, row8_2 ,row8_3 ,row9_1 row9_2, row9_3, row10_1, row10_2, row10_3, row11_1, row11_2, row11_3, row12_1, row12_2, row12_3, header1_1, header1_2, header1_3) "
		SQLStmt = SQLStmt & "VALUES('" & tmp_thumb & "','" & upload.Form("falt01") & "','" & upload.Form("falt02") & "','" & upload.Form("falt03") & "','" & upload.Form("falt04") & "', '" & upload.Form("text01") & "', '" & upload.Form("text02") & "', '" & upload.Form("text03") & "', '" & upload.Form("text04") & "', '" & upload.Form("text05") & "', '" & upload.Form("text06") & "', '" & tmp_namn1 & "', '" & tmp_namn2 & "', '" & tmp_namn3 & "', '" & a_id & "', '" & prod_id & "', '" & datum & "', '" & tmp_who & "', '" & tmp_lang & "', '" & tmp_prodid & "'," & upload.Form("row1_1") & "', '" & upload.Form("row1_2") & "', '" & upload.Form("row1_3") & "', '" & upload.Form("row2_1") & "', '" & upload.Form("row2_2") & "', '" & upload.Form("row2_3") & "', '" & upload.Form("row3_1") & "', '" & upload.Form("row3_2") & "', '" & upload.Form("row3_3") & "', '" & upload.Form("row4_1") & "', '" & upload.Form("row4_2") & "', '" & upload.Form("row4_3") & "', '" & upload.Form("row5_1") & "',' " & upload.Form("row5_2") & "', '" & upload.Form("row5_3") & "', '" & upload.Form("row6_1") & "', '" & upload.Form("row6_2") & "', '" & upload.Form("row6_3") & "', '" & upload.Form("row7_1") & "', '" & upload.Form("row7_2") & "', '" & upload.Form("row7_3") & "', '" & upload.Form("row8_1") & "', '" & upload.Form("row8_2") & "', '" & upload.Form("row8_3") & "', '" & upload.Form("row9_1") & "', '" & upload.Form("row9_2") & "', '" & upload.Form("row9_3") & "', '" & upload.Form("row10_1") & "', '" & upload.Form("row10_2") & "', '" & upload.Form("row10_3") & "', '" & upload.Form("row11_1") & "', '" & upload.Form("row11_2") & "', '" & upload.Form("row11_3") & "', '" & upload.Form("row12_1") & "', '" & upload.Form("row12_2") & "', '" & upload.Form("row12_3")& "', '" & upload.Form("header1_1")& "', '" & upload.Form("header1_2")& "', '" & upload.Form("header1_3")& "') "

Funkar det inte att ha så långa stränga på ASP sidor eller gör jag fel?
Kan jag slå ihop dem och få dem kortare?

Tack på förhand!

rollo

Medlem sedan dec. 20014 239 inlägg
#2

Och om du gör en response.write på din SQLStmt ser det korrekt ut?
Får du något felmeddelande?

Medlem sedan aug. 2001203 inlägg
#3

Gör jag en utskrift av SQLStmt så ser den helt rätt ut.
Hade lite fel i den först som den krashade på grund av, men nu får jag bara en vit sida och inga felmeddelade.

rollo

Medlem sedan juni 200032 967 inlägg
#4

... och du har inte glömt att exekvera SQL-frågan?

Medlem sedan aug. 2002733 inlägg
#5

Din vita sida - har du testat att öppna källkoden och se vad den innehåller?

Ibland hamnar felmeddelanden dolda i källkoden pga html-koden förstörs...

Medlem sedan aug. 2001203 inlägg
#6

tjena!

kör jag en print på SQLStmt får jag följande

INSERT INTO db_h(thumb,falt01,falt02,falt03,falt04, text01, text02, text03, text04, text05, text06,bild1, fil1, fil2, a_id, p_id, datum, vem,lang, prod_id,row1_1, row1_2, row1_3, row2_1, row2_2, row2_3, row3_1, row3_2, row3_3, row4_1, row4_2, row4_3, row5_1, row5_2, row5_3, row6_1, row6_2, row6_3, row7_1, row7_2, row7_3, row8_1, row8_2 ,row8_3 ,row9_1 row9_2, row9_3, row10_1, row10_2, row10_3, row11_1, row11_2, row11_3, row12_1, row12_2, row12_3, header1_1, header1_2, header1_3) VALUES('','tomas','','','', '1', '2', '12', '4', '54', '854', '', '', '', '151', '151', '2008-02-27', 'Tomas Rylander', '1', '99',1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13',' 14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', 'header 1', 'header 2', 'header 3')

och koden ser ut så här

		SQLStmt ="INSERT INTO db_h"
		SQLStmt = SQLStmt & "(thumb,falt01,falt02,falt03,falt04, text01, text02, text03, text04, text05, text06,bild1, fil1, fil2, a_id, p_id, datum, vem,lang, prod_id,row1_1, row1_2, row1_3, row2_1, row2_2, row2_3, row3_1, row3_2, row3_3, row4_1, row4_2, row4_3, row5_1, row5_2, row5_3, row6_1, row6_2, row6_3, row7_1, row7_2, row7_3, row8_1, row8_2 ,row8_3 ,row9_1 row9_2, row9_3, row10_1, row10_2, row10_3, row11_1, row11_2, row11_3, row12_1, row12_2, row12_3, header1_1, header1_2, header1_3) "
		SQLStmt = SQLStmt & "VALUES('" & tmp_thumb & "','" & upload.Form("falt01") & "','" & upload.Form("falt02") & "','" & upload.Form("falt03") & "','" & upload.Form("falt04") & "', '" & upload.Form("text01") & "', '" & upload.Form("text02") & "', '" & upload.Form("text03") & "', '" & upload.Form("text04") & "', '" & upload.Form("text05") & "', '" & upload.Form("text06") & "', '" & tmp_namn1 & "', '" & tmp_namn2 & "', '" & tmp_namn3 & "', '" & a_id & "', '" & prod_id & "', '" & datum & "', '" & tmp_who & "', '" & tmp_lang & "', '" & tmp_prodid & "'," & upload.Form("row1_1") & "', '" & upload.Form("row1_2") & "', '" & upload.Form("row1_3") & "', '" & upload.Form("row2_1") & "', '" & upload.Form("row2_2") & "', '" & upload.Form("row2_3") & "', '" & upload.Form("row3_1") & "', '" & upload.Form("row3_2") & "', '" & upload.Form("row3_3") & "', '" & upload.Form("row4_1") & "', '" & upload.Form("row4_2") & "', '" & upload.Form("row4_3") & "', '" & upload.Form("row5_1") & "',' " & upload.Form("row5_2") & "', '" & upload.Form("row5_3") & "', '" & upload.Form("row6_1") & "', '" & upload.Form("row6_2") & "', '" & upload.Form("row6_3") & "', '" & upload.Form("row7_1") & "', '" & upload.Form("row7_2") & "', '" & upload.Form("row7_3") & "', '" & upload.Form("row8_1") & "', '" & upload.Form("row8_2") & "', '" & upload.Form("row8_3") & "', '" & upload.Form("row9_1") & "', '" & upload.Form("row9_2") & "', '" & upload.Form("row9_3") & "', '" & upload.Form("row10_1") & "', '" & upload.Form("row10_2") & "', '" & upload.Form("row10_3") & "', '" & upload.Form("row11_1") & "', '" & upload.Form("row11_2") & "', '" & upload.Form("row11_3") & "', '" & upload.Form("row12_1") & "', '" & upload.Form("row12_2") & "', '" & upload.Form("row12_3")& "', '" & upload.Form("header1_1")& "', '" & upload.Form("header1_2")& "', '" & upload.Form("header1_3")& "') "
		Connection.Execute(SQLStmt)	
	response.write(sqlstmt)
Medlem sedan dec. 20014 239 inlägg
#7

Och fortfarande inget felmeddelande?

Medlem sedan aug. 2001203 inlägg
#8

nope

låter jag sidan funka som den skall, så går redirecten till rätt sida

rollo

Medlem sedan juli 20003 825 inlägg
#9

Jag frågar följande:

1. Måste du ha så mycket kod på en INSERT?
2. Det står inte skrivet "on error resume next" på din sida...? Då får du inga felmeddelanden.

***
Mitt tips till dig! När du ska skapa en ny påst, börja då med typ det mest basala, som datum. INSERT.

Manipulationen ovan har du sen som en UPDATE. För du måste ändå ha en UPDATE... och det blir FASLIGT mycket kod att hålla ordning på!! Du har ju nästan samma kod på UPDATE som på INSERT! Varför skriva samma sak två gånger...??

Nåja, jag vet inte i vilket sammanhang detta är, men jag ville bara väcka tanken!

Medlem sedan aug. 2001203 inlägg
#10

1. ja, dessvärre. Min kunskapsnivå säger att jag behöver det. Jag har en tabell med 36 celler som jag skall spara + 10 andra fält, därav längden på INSERTen

2. Kör inte med on error resume next

***
funderade på att dela upp inserten i en insert o en, eller flera update. Det känns som det lämpligaste eftersom det inte funkar att köra en insert

Medlem sedan juli 20003 825 inlägg
#11

1. Du missuppfattar mig. Jag säger:

Fixa en INSERT som enbart skapar räknare, använd till exempel bara datum, namn eller annat kort och flexibelt.

Sen har du ditt megaformulär, som jag absolut inte har några åsikter om efter som jag inte känner till vad det är du gör.

Men då kan du köra UPDATE på detta formuläret.

Alltså, det första användaren gör är att välja ett namn eller ett datum. Du använder INSERT på detta. Sen koller användaren till ditt megaformulär via sidan view.asp?ID=123

Om du, mot förmodan, senare ska byta namn, byta ordning, lägga till eller ta bort fält i ditt megafält så behöver du inte redigera så mycket kod. Minimalt med kod, alltså.

Det spelar ingen roll vad det är du gör. Aldrig är det motiverat med en så lång INSERT... (Om nu inte saker är databasgenererat eller automatiserat, men det är det ju inte i ditt fall.)

***
OK, du kanske har en användare som bara trycker OK .... och det skapas en tom post förutom räknare + datum.

So what!?

DELETE * FROM [db_h] WHERE intID = 123

Du gör det krångligt för dig... Trust me! :-)

****
Du ska inte vara rädd för att använda många poster, att vissa blir onödiga. ingen kommer tacka dig för att du skriver kod som inte förbrukar många poster... Med vettig kod behöver du inte bry dig om sånt som ID med mera... saker bara fungerar.

Samma med dina val av namn. Använd mer beskrivande namn. Skriv vad det är i stället för anonyma textfält:
strFirstname
strLastname
strAddress
strAge
strPhone

Det är en sanning som är en sanning! :-)

Medlem sedan juli 20003 825 inlägg
#12

http://www.google.com/search?hl=sv&client=safari&rls=sv-se&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=hungarian+notation&spell=1

Hungarian Notation kan du söka på. Det betyder i korthet att man döper fält efter vad de är.

Kör du Access...?? De vanligaste är

Prefix: int -- integer
Exempel: intID -- räknare, tal

Prefix: str -- strängar. text
Exempel: strFirstname, strCity -- kan vara kort (max 255) eller PM (tar mer plats i databasen)

Prefix: dte -- datum
Exempel: dteCreated, dteViewTo, dteViewFrom -- datum, tid

Prefix: bol -- sant/falskt (på/av)
Exempel: bolView, bolClick

Hmm... ja, det är typ dom fyra...

Medlem sedan feb. 20001 590 inlägg
#13

Hungarian Notation är istort sett att betrakta som död inom den moderna mjukvaruindustrin. Tom Microsoft som var med att pusha fram detta på 90-talet har övergett detta helt i samband med .NET introduktionen. Nu används mer namngivning mot vad man gör istället för att tala om vad det är. För att citera en "anonym" guru:

my belief is that Hungarian notation, and other type-specific naming conventions, are obsolete in an era of strongly-typed object-oriented programming.

Fast vi lever i en fri värld, så om man vill använda HN så gör det...

Jag själv övergav det helt när intellisense kom, eftersom den aktiveras av alla reserverade ord. Kändes frustrerande att börja skriva int, och intellisense poppar upp med integer... Dessutom så övergavs det på jobbet ganska kvickt, för att anpassa oss mot resten av världen...

Medlem sedan dec. 19996 721 inlägg
#14

Tack Toonster, håller helt med.

Ett tips, rollo, eller snarare ett krav, är att du undersöker begreppet SQL Injection. I korthet går det ut på att du inte får lägga in värden i en SQL-sats på detta viset:

...LUES('" & tmp_thumb & "','" & upload.Form("falt01") & "','....

dvs. att du stoppar in värden direkt från formulärdata el. likn i SQL-satsen. Problem uppstår nämligen om användaren skickar in värden som innehåller apostrofer, eftersom dessa används av SQL för att avgränsa strängar. Om "falt01" skulle innehålla texten "McDonald's" så skulle SQL-strängen bli

...LUES('nånting','McDonald's','....

och som du ser så blir det helt fel då, med apostroferna runt "s". Lösningen för de flesta databastyperna är att man ersätter alla apostrofer med dubbla apostrofer (inte citationstecken, utan två apostrofer)

...LUES('" & tmp_thumb & "','" & replace(upload.Form("falt01"),"'","''") & "','....

Detta är JÄTTEVIKTIGT! Problemet är inte bara att det kan bli fel när man ska söka eller uppdatera, utan att en illvillig användare kan förstöra databasen eller komma igenom inloggningssystem etc. genom att lura databasen till att köra SQL-frågor som inte var tänkta att kunna köras.

268 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)