webForumDet fria alternativet

SQL-problem(insert)

24 svar · 649 visningar · startad av Mika3l

Mika3lMedlem sedan nov. 20018 492 inlägg
#1

Jag har ett formulär där jag matar in länkar som ska läggas till i en databas, dessa länkar ska vara kopplade till en viss kategori men man behöver inte välja detta utan man kan ändra detta senare.
Nu är det konstiga problemet att när jag inte fyller i kategorin så får jag ett felmeddelande om att SQL-satsen är fel men annars när jag fyller i allt så fungerar det utmärkt, och det måste inte fyllas i uppgifter i fältet(cat) i databasen heller.

Microsoft OLE DB Provider for ODBC Drivers error '80040e09'

[MySQL][ODBC 3.51 Driver][mysqld-3.23.54]You have an error in your SQL syntax near ')' at line 1

SQL = "INSERT INTO submenus(name,url,cat) VALUES('" & Replace(Trim(Request("link1")),"'","") & "','" & Replace(Trim(Request("url1")),"'","") & "'," & Trim(Request("cat")) & ")"
Connect.Execute(SQL)

Så är koden som det är fel på.
Name är av varchartyp, url likaså och cat är av tinyint-typ.

Någon som kan förstå varför det blir fel?

tydalMedlem sedan juni 20034 013 inlägg
#2

Om du skriver ut din variabel SQL på skärmen så ser du lättare vad det är för fel.

Spontant saknar du mellanslag mellan submenus och ( och mellan VALUES och ( plus att värdet för cat inte står mellan apostrofer. Men som sagt, skriv ut SQL-variabeln så ser du.

Mika3lMedlem sedan nov. 20018 492 inlägg
#3

INSERT INTO submenus(name,url,cat) VALUES('test','index.asp?sida=5',)
Det får jag när jag skriver ut SQL-satsen.
Men det ska väl inte vara ' när det är talfält, eller?

K@llenMedlem sedan mars 20032 667 inlägg
#4

Request("cat") verkar vara tom. Kolla upp med hjälp av utskrifter var du tappar värdet.

tydalMedlem sedan juni 20034 013 inlägg
#5

> INSERT INTO submenus(name,url,cat) VALUES
> ('test','index.asp?sida=5',)

Och genast ser vi felet! Kommatecknet i slutet ska ju inte vara där. Man har ju bara kommtecken =mellan= värden. Att du får ett kommatecken beror i det här fallet på att cat inte har något värde och du har glömt att kolla det.

> Men det ska väl inte vara ' när det är talfält, eller?

Jo, i Mysql kan, och bör, du ha det. Utan ' så måste du kolla att det som finns i variabeln du stoppar in där verkligen är ett heltal inom de gränser du satt upp, annars kommer besökarna åt databasen.

Dessutom, om du lägger dit apostrofer så blir det ju:
('test', 'index.asp?sida=5', '')
Alltså, inget kommatecken för mycket och du slipper kolla ifall cat har något värde.

Så om du lägger dit ' runt talfältet borde felmeddelandet försvinna.

Mika3lMedlem sedan nov. 20018 492 inlägg
#6

Aha, jo att ' fattades det förstod jag direkt men jag kunde i förstå att det skulle vara det i talfält(gammal vana från Accesstiden ;) ), får bli till att ändra då.
Tack för hjälpen. :)

RED: Tillägg, felmeddelandet kommer fram när cat är tomt skrev jag i mitt första inlägg så det vet jag, och det ska kunna vara tomt. ;)

K@llenMedlem sedan mars 20032 667 inlägg
#7

> Men det ska väl inte vara ' när det är talfält, eller?

Jo, i Mysql kan, och bör, du ha det. Utan ' så måste du kolla att det som finns i variabeln du stoppar in där verkligen är ett heltal inom de gränser du satt upp, annars kommer besökarna åt databasen.

Va? Varför bör man ha apostrof runt talfält i mysql? Bara för att mysql är en av väldigt få dbms som tillåter detta är det ingen som säger att man bör ha det.

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Jag tycker inte alls att du skall använda ' när du gör insert på numeriska värden. Om du skickar in ett ogiltigt värde så kommer Mysql att lagra 0 (utan att ge fel, vilket den borde) vilket man inte vill i alla lägen. Använd null i stället för att indikera att värdet inte är angivet.

Mika3lMedlem sedan nov. 20018 492 inlägg
#9

LarsG skrev:

Jag tycker inte alls att du skall använda ' när du gör insert på numeriska värden. Om du skickar in ett ogiltigt värde så kommer Mysql att lagra 0 (utan att ge fel, vilket den borde) vilket man inte vill i alla lägen. Använd null i stället för att indikera att värdet inte är angivet.

Njao, jag vill inte ha något värde ö.h.t i databasen i det här fallet. ;)

LarsGMedlem sedan dec. 200012 464 inlägg
#10
cat = request("cat")
if  cat = "" or not IsNumeric(cat) then  cat = "NULL"
SQL = "INSERT INTO submenus(name,url,cat) VALUES('" & Replace(Trim(Request("link1")),"'","") & "','" & Replace(Trim(Request("url1")),"'","") & "'," & cat & ")"
Connect.Execute SQL

Något värde blir det alltid.

tydalMedlem sedan juni 20034 013 inlägg
#11

> Va? Varför bör man ha apostrof runt talfält i mysql?

Det skrev jag ju; det öppnar för SQL injection om man inte passar sig.

tydalMedlem sedan juni 20034 013 inlägg
#12

> Om du skickar in ett ogiltigt värde så kommer Mysql att lagra 0
> (utan att ge fel, vilket den borde) vilket man inte vill i alla lägen.

Om man nu har glömt att kolla värdet innan så är det ju bättre att den lagrar 0 än att den låter besökaren köra godtyckliga sql-frågor.

K@llenMedlem sedan mars 20032 667 inlägg
#13

tydal skrev:

> Va? Varför bör man ha apostrof runt talfält i mysql?

Det skrev jag ju; det öppnar för SQL injection om man inte passar sig.

Bättre att hålla koll på vad som skickas in i sql-frågan istället för att ägna sig åt fullösningar. :)

tydalMedlem sedan juni 20034 013 inlägg
#14

> Bättre att hålla koll på vad som skickas in i sql-frågan istället
> för att ägna sig åt fullösningar.

Det är ingen fullösning att lägga på ytterligare ett lager säkerhet.

LarsGMedlem sedan dec. 200012 464 inlägg
#15

Om man nu har glömt att kolla värdet innan så är det ju bättre att den lagrar 0 än att den låter besökaren köra godtyckliga sql-frågor.

Nej, det är inte bättre att den lagrar 0. Det skall bli fel.

Vad har det med godtyckliga SQL-frågor att göra?

tydalMedlem sedan juni 20034 013 inlägg
#16

> Vad har det med godtyckliga SQL-frågor att göra?

Om du verkligen inte har hört talas om SQL injection så rekommenderar jag följande till att börja med:

http://www.nextgenss.com/papers/advanced_sql_injection.pdf

LarsGMedlem sedan dec. 200012 464 inlägg
#17

Jag vet vad SQL injection är.

Mysql tillåter inte multipla statements i ett anrop.

tydalMedlem sedan juni 20034 013 inlägg
#18

> Jag vet vad SQL injection är.
> Mysql tillåter inte multipla statements i ett anrop.

Om du tror det är allt SQL injection handlar om rekommenderar jag följande läsning:

http://www.wiretrip.net/rfp/txt/rfp2k01.txt

K@llenMedlem sedan mars 20032 667 inlägg
#19

tydal skrev:

> Jag vet vad SQL injection är.
> Mysql tillåter inte multipla statements i ett anrop.

Om du tror det är allt SQL injection handlar om rekommenderar jag följande läsning:

http://www.wiretrip.net/rfp/txt/rfp2k01.txt

Det finns bra botmedel mot sådant utan att använda fullösningar. Ser du till att köra escapesekvenser på variabler med okänt innehåll, då slipper du problem med "bad characters" i dina sql-frågor.

solbulleMedlem sedan mars 20015 287 inlägg
#20

. red/ ska nog vara tyst...

134 ms totalt · 3 externa anrop · v20260731065814-full.457f92c7
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)