webForumDet fria alternativet

COUNT och ASP fråga ?

ASP

5 svar · 323 visningar · startad av Pellefant

Medlem sedan maj 20023 372 inlägg
Frågan#1

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.

Medlem sedan juni 200032 967 inlägg
#2

Ä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) & "'"
Medlem sedan maj 20023 372 inlägg
#3

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

Medlem sedan juni 200032 967 inlägg
#4

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,

Medlem sedan juni 20019 519 inlägg
#5

är det inte:

if recset("antal") > 0 THEN
'kör kod
else
'kör en annan kod
end if
Medlem sedan maj 20023 372 inlägg
#6

@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.

265 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)