Är det något sånt här du menar?
function secureSQL(strText)
secureSQL = Replace(strText, "'", "''")
end function
SQL = "SELECT COUNT (*) FROM Table1 WHERE UserID='" & secureSQL(temp) & "'"
5 svar · 323 visningar · startad av Pellefant
Hej! :)
Har snurrat till det nu igen.
Har koden nedan, tanken är att det används när en ny användare registrerar sig. Om användarnamnet(userID(är en sträng)) redan finns, så sägs den som försöker regga det till(det är det som görs med querystringen), användarnamnet är upptaget om SQL>0
Dvs, jag vill gärna ha in själva antalet i SQL.
Gärna "injuctions(stavningen?)säkrat" också, så att det inte går att skriva typ "<>" eller något annat skumt för att få fram info från databasen.
temp=request.form("UserID")
SQL = "COUNT * FROM Table1 WHERE UserID=" & "'temp'"
RecSet.Open SQL, Databas, adOpenStatic, adLockOptimistic
if(SQL>=0) THEN
RecSet.close
Databas.close%>
Response.redirect("login.asp?msg=exists")
Felmed som jag får är:
Microsoft JET Database Engine error '80040e14'
Syntax error (missing operator) in query expression 'COUNT *'.
/tracking/newuser.asp, line 36
Tacksam för hjälp.
Är det något sånt här du menar?
function secureSQL(strText)
secureSQL = Replace(strText, "'", "''")
end function
SQL = "SELECT COUNT (*) FROM Table1 WHERE UserID='" & secureSQL(temp) & "'"
Hej hopp!
Jag trasslar vidare jag... :)
Jag tänkte mer att antalet hoppar in i variabeln "antal", tror jag fått ordning på den biten nedan. Det om secure var kanske lite overkill :), jag menade bara det med enkelfnuttarna, så det tog jag från ditt förslag rakt av.
Problemet är att if-vilkoret alltid blir sant, och koden utförs , även om det finns angivit UserID i db:n redan, och "antal" borde således större än 0 och Rec.Set borde vara NOT (EOF, BOF)(och if-satsen inte utföras).
Kanske gör jag något tankefel.
Nu ser det ut såhär:
<%
Set Databas = Server.CreateObject("ADODB.Connection")
Databas.Open ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("databasfilen.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")
temp=request.form("UserID")
SQL = "SELECT COUNT (*) AS antal FROM Table1 WHERE UserID='" & temp & "'"
RecSet.Open SQL, Databas, adOpenStatic, adLockOptimistic
If NOT (RecSet.EOF Or RecSet.BOF) Then
Response.redirect("login.asp?msg=existing")
RecSet.close
Databas.close%>
Jag har även testat med:
if(SQL>0) THEN
En SELECT COUNT-fråga returnerar alltid ett tal, 0 eller högre, så ditt recordset är aldrig EOF. Om du bara ska kontrollera om ett user-id finns i tabellen räcker det bra med en vanlig select-fråga (och en vanlig eof-koll).
<%
Set Databas = Server.CreateObject("ADODB.Connection")
Databas.Open ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("databasfilen.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")
temp=request.form("UserID")
SQL = "SELECT 1 FROM Table1 WHERE UserID='" & temp & "'"
RecSet.Open SQL, Databas, adOpenStatic, adLockOptimistic
If NOT RecSet.EOF Then
Response.redirect("login.asp?msg=existing")
RecSet.close
Databas.close%>
Jag gör en select på värdet 1, eftersom du inte ska använda något från tabellen. Onödigt att hämta det man inte använder, tycker jag. Jag har också tagit bort din BOF-koll, som är onödig. Det räcker alldeles utmärkt att endast kontrollera mot EOF. Om du inte ska använda recordsetet behöver du inte heller ange cursor- och låstyp som du gjort, utan det räcker med en ren execute för att skapa ditt recordset. Egentligen. :)
Dock: Du bör alltid köra med en replacefunktion när det gäller värden som ska in i en SQL-fråga, som du inte nödvändigtvis har koll på.
Mvh,
@nders : Tack för hjälpen, fungerade super, känns speciellt bra, då det var det sista stora problemet för en sida jag håller på med.
voigann1: Du har helt rätt, om det hade gällt ett värde som varit lagrad i databasen, men här så i min SQL sats hade antalet "träffar" lagrats i variabeln.