webForumDet fria alternativet

Tecknet: ' funkar inte i mitt script...

15 svar · 373 visningar · startad av Bire

BireMedlem sedan dec. 199919 074 inlägg
#1

Jag har ett sida där jag postar från ett formulär till detta script:

<%@ Language = "VBScript"%>
<%
'Declare all local variables
dim conn
dim rs
dim strconn
dim strsql

strsql = ""
'set connection string to local variable
strconn = "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server.MapPath("\cgi-bin\gig.mdb")

'build the sql statement based on the input from the form
strSQL = "INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform)"
strSQL = strSQL & " SELECT "
strSQL = strSQL & "'" & request("Datum") & "' as Datum,"    
strSQL = strSQL & "'" & request("Ort") & "' as Ort,"
strSQL = strSQL & "'" & request("Hak") & "' as Hak,"
strSQL = strSQL & "'" & request("Band") & "' as Band,"
strSQL = strSQL & "'" & request("Url") & "' as Url,"
strSQL = strSQL & "'" & request("Av") & "' as Av,"
strSQL = strSQL & "'" & request("Inform") & "' as Inform"

'Set connection object 
set conn = server.createobject("adodb.connection")
conn.open strconn
'Use the execute method of the connection object the insert the record
conn.execute(strSQL)
conn.close
set conn = nothing
%>

Men om jag försöker att posta tecknet " ' " så får jag felmeddelandet:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access 97 Driver] Syntax error in string in query expression '' '' as Inform'.

/gig/add2.asp, line 30

Hur kommer jag runt detta problem och varför blir det så ? Jag har testat med en massa andra tecken såsom: !"#¤%& och alla funkar utom : " ' "

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

sgtpepperMedlem sedan apr. 20007 588 inlägg
#2

Tecknet ' är i SQL ett strängindelningstecken. Om du försöker posta det så avslutas strängen i INSERT satsen, därav felet. Byt ut ' mot '' (2 st efterföljande ') med Replace( hejhopp, "'","''").

När du sen plockar ut datat igen från databasen och vill visa det så byter du tillbaka med Replace( hejhopp, "''", "'").

------------------

1010011010 - The binary number of the beast

BireMedlem sedan dec. 199919 074 inlägg
#3

Jag hänger inte riktigt med i din förklaring sgtpepper ;) Kan du visa i kodexemplet så en mycket trött Bire fattar ? :e

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

BrimbaMedlem sedan dec. 19995 875 inlägg
#4

Hej!
När jag läser hans förklaring så fattar jag det som att du skall göra så här:

Vi säger att det är Band som kan innehålla ' tecknet. Så gör du kanske så här:

' Fix the ' problem
bandtmp = Replace(request("Band"), "'","''").
'build the sql statement based on the input from the form
strSQL = "INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform)"
strSQL = strSQL & " SELECT "
strSQL = strSQL & "'" & request("Datum") & "' as Datum," 
strSQL = strSQL & "'" & request("Ort") & "' as Ort,"
strSQL = strSQL & "'" & request("Hak") & "' as Hak,"
strSQL = strSQL & "'" & bandtmp & "' as Band,"
strSQL = strSQL & "'" & request("Url") & "' as Url,"
strSQL = strSQL & "'" & request("Av") & "' as Av,"
strSQL = strSQL & "'" & request("Inform") & "' as Inform"

' Sätter tillbaka de riktiga fnuttarna i stängren igen

bandtmp = Replace(bandtmp, "''", "'")

Nu har du först alltså lagt till en fnutt i bandtmp varibeln för att databasen skall veta att stängen fortsätter, sedan när du inte använder strängen i databasen längre gör du om den så att du kan visa den på sidan på ett bra sätt, istället för

<%=Request.Form("Band")%> så skriver du ut bandet med <%=bandtmp%>, iofs skulle det föregående också fungera men men :e

Ha det bra!

Jag tror att det går att lösa på ett annat sätt också men jag hinner inte förklara.

///Patrik

CeroMedlem sedan maj 20005 inlägg
#5

Testa något i stil med detta...

strInform = replace(request("Inform"), "'", "''")

Du kan läsa lite mer utförligt här... http://www.4guysfromrolla.com/webtech/051899-1.shtml

sgtpepperMedlem sedan apr. 20007 588 inlägg
#6

Hängde du med på förklaringarna Bire eller vill du ha ytterligare information?

Problemet är att strängar i en SQL-sats avdelas med '. T.ex kan en INSERT-sats se ut så här:

INSERT INTO users(name,password) VALUES('maximus', 'romavictoria');

Om du då dynamiskt bygger upp INSERT-satsen utifrån inmatad data från användaren m.h.a Request("name") etc. så kommer eventuella '-tecken som användaren matat in att avsluta strängen.

Om användaren skriver följande:

name = gorby's
password = piroger

så kommer INSERT-satsen bli följande:
INSERT INTO users(name,password) VALUES('gorby's', 'piroger');

I ovanstående sats så ser du att strängen med namnet ser konstig ut.. Den har avslutats av det inmatade '.-tecknet.

För att komma runt detta så byter du ut alla '-tecken mot något annat innan texten läggs in i SQL-satsen. Oftast byter man ut ' mot ''.

------------------

1010011010 - The binary number of the beast

BireMedlem sedan dec. 199919 074 inlägg
#7

Nja... Det där går jag bet på tyvärr...

Finns det inget enklare sätt ? Typ att inkludera en "functions.inc" eller nått... Vad vet jag ? :e

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

sgtpepperMedlem sedan apr. 20007 588 inlägg
#8

Egentligen är det enkelt. Se bara till att du alltid byter ut ' mot '' i variabler som du ska använda i SQL-satser.

Det enda du behöver göra är att köra Replace på den variabel som du ska använda i SQL-anropet:

namn = Replace( Request("namn"), "'", "''" )

Voila! Nu slipper du fel om någon skulle skicka med ett '-tecken som inmatning.

sgtpepperMedlem sedan apr. 20007 588 inlägg
#9

Bire: Du kan kolla på den här adressen: http://www.idg.se/mikrodatorn/webbmastern/md9807/

Där beskrivs det hur du fixar till användarnas inmatning så att ogiltiga tecken tas bort och det finns en zip-fil att ladda ned med en functions.inc som innehåller metoder för allt!

BireMedlem sedan dec. 199919 074 inlägg
#10

Okay ! Jag kommer att ägna natten till att lära mig detta !! Jag lovar :e

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

emissionMedlem sedan dec. 19996 721 inlägg
#11

För det första är det en hemsk lustig SQL-sats som sätts ihop, men en SELECT mitt i INSERT:en. Det funkar, eftersom SELECT:en returnerar ett "låtsasresultat", men det är osmidigt och inte SQL-standard.

Det borde i stället vara:

strSQL = "INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform)"
strSQL = strSQL & " VALUES("
strSQL = strSQL & "'" & request("Datum") & "','" 
strSQL = strSQL & "'" & request("Ort") & "','"
strSQL = strSQL & "'" & request("Hak") & "','"
strSQL = strSQL & "'" & request("Band") & "','"
strSQL = strSQL & "'" & request("Url") & "','"
strSQL = strSQL & "'" & request("Av") & "','"
strSQL = strSQL & "'" & request("Inform") & "')"

Vad gäller '.tecknen är det som bRimba säger. Eftersom strängar avgränsas av '-tecken, blir det syntax-fel om ett sådant tecken kommer mitt i strängen. SQL-parsern tror att strängen är slut, och då ska den följas av satsslut eller ett komma, men i stället kommer något annat...

Sedan kan mna ju inte byta ut ' mot vad som helst. Att byta ut ' mot '' (två enkelfnuttar) kallas double-quoting, och det är en generell tillämpning. SQL-parsern märker att det kommer en enkelfnutt efter den första, och inser då att man faktiskt villa ha med en fnutt i strängen. Vill man ha två fnuttar in strängen får man alltså skriva '''' (fyra stycken).

Jag kan tänka mig att det gåra att lösa mer generellt, men det kräver att man flyttar över indatasträngarna (från request) till variabler, eftersom man inte kan modifiera dessa.

Gör en liten funktion som t.ex. heter strfix, så blir det lättare.

function strfix(strIn)
   strfix=replace(strIn,"'","''")
end function

sedan är det bara att använda den...

strSQL = "INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform)"
strSQL = strSQL & " VALUES("
strSQL = strSQL & "'" & strfix(request("Datum")) & "','" 
strSQL = strSQL & "'" & strfix(request("Ort")) & "','"
strSQL = strSQL & "'" & strfix(request("Hak")) & "','"
strSQL = strSQL & "'" & strfix(request("Band")) & "','"
strSQL = strSQL & "'" & strfix(request("Url")) & "','"
strSQL = strSQL & "'" & strfix(request("Av")) & "','"
strSQL = strSQL & "'" & strfix(request("Inform")) & "')"
BireMedlem sedan dec. 199919 074 inlägg
#12

Hmmm... Vad gör jag för fel ?

<%@ Language = "VBScript"%>
<%
function strfix(strIn)
strfix=replace(strIn,"'","''")
end function
%>
<%
dim conn
dim rs
dim strconn
dim strsql

strsql = ""
strconn = "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server.MapPath("\cgi-bin\gig.mdb")

strSQL = "INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform)"
strSQL = strSQL & " VALUES("
strSQL = strSQL & "'" & strfix(request("Datum")) & "','" 
strSQL = strSQL & "'" & strfix(request("Ort")) & "','"
strSQL = strSQL & "'" & strfix(request("Hak")) & "','"
strSQL = strSQL & "'" & strfix(request("Band")) & "','"
strSQL = strSQL & "'" & strfix(request("Url")) & "','"
strSQL = strSQL & "'" & strfix(request("Av")) & "','"
strSQL = strSQL & "'" & strfix(request("Inform")) & "')"

set conn = server.createobject("adodb.connection")
conn.open strconn
conn.execute(strSQL)
conn.close
set conn = nothing
%>

Detta ger:

Microsoft OLE DB Provider for ODBC Drivers fel '80040e14'

[Microsoft][Drivrutin för ODBC Microsoft Access] Syntaxfel (operator saknas) i frågeuttrycket '''Borlänge',''Broadway''.

/Envikenrecords/gig/add2.asp, rad 33

Jag blir galen... ;)

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

emissionMedlem sedan dec. 19996 721 inlägg
#13

Skriv ut SQL-satsen, så är det lättare att hitta felet.

response.write strSQL

BireMedlem sedan dec. 199919 074 inlägg
#14

Hoppas du menar så här:
INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform) VALUES('2000-01-03',''Borlänge',''Broadway',''Metallica',''http://',''Bire',''dfst''srt rty ')
Microsoft OLE DB Provider for ODBC Drivers fel '80040e14'

[Microsoft][Drivrutin för ODBC Microsoft Access] Syntaxfel (operator saknas) i frågeuttrycket '''Borlänge',''Broadway''.

/Envikenrecords/gig/add2.asp, rad 31

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

emissionMedlem sedan dec. 19996 721 inlägg
#15

Aah!! Missade en grej...

strSQL = "INSERT INTO Gig(Datum, Ort, Hak, Band, Url, Av, Inform)"
strSQL = strSQL & " VALUES('"
strSQL = strSQL & strfix(request("Datum")) & "','" 
strSQL = strSQL & strfix(request("Ort")) & "','"
strSQL = strSQL & strfix(request("Hak")) & "','"
strSQL = strSQL & strfix(request("Band")) & "','"
strSQL = strSQL & strfix(request("Url")) & "','"
strSQL = strSQL & strfix(request("Av")) & "','"
strSQL = strSQL & strfix(request("Inform")) & "')"

.det blev lite många fnuttar....

[Redigerat av emission den 07 jun 2000]

BireMedlem sedan dec. 199919 074 inlägg
#16

Japp !!! Nu lirar det som det ska :e

TACK !!! Emission

Nu återstår bara att förstå vad scriptet gör... ;)

------------------
Explorer in a further region of experience.
<A HREF="http://www.lifestyleshop.nu" TARGET=_blank>www.LifeStyleShop.nu</A>

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