webForumDet fria alternativet

upptaget användarnamn

ASP

20 svar · 323 visningar · startad av Hazze

Medlem sedan jan. 20002 453 inlägg
Frågan#1

hur gör jag för att undvika att personer registrerar samma användarnamn?

min insert ser ut så här:

<%
Set connection = server.createObject("adodb.connection")
connection.open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("falala.mdb") & ";"
SQL = "INSERT INTO members (Login, Password, Email, Lag, Position, Kommentar ) VALUES ('" & Request.Form("namn") &"','" & Request.Form("pass") &"','" & Request.Form("epost") &"','" & Request.Form("lag") &"','" & Request.Form("pos") &"','" & Request.Form("comment") &"')"
set RS = Connection.Execute(SQL)
Response.Redirect("registrerad.asp")
%>

tacksam för svar :)

------------------
It aint over until the fat lady sings...

Medlem sedan juni 20019 024 inlägg
#2

Själv gör jag så att jag först kör en SQL sats där jag kollar om användarnamnet redan finns - om det inte finns, dvs recordset:et blir EOF så är det fritt fram att lägga till med insert!

------------------
Peter D

Medlem sedan jan. 20002 453 inlägg
#3

ok, har försökt med något sådant. får det dock inte att fungera. har du någon kod att visa? :)

------------------
It aint over until the fat lady sings...

Medlem sedan juni 20019 024 inlägg
#4

Hmm, det verkar konstigt. För mig funkar det utmärkt att använda det sättet, vilket jag gjort med följande:

'***************************************************************
'* Lägg till i databas.
'***************************************************************

  ' Öppna databas och skapa recordSet instans.
   databasFil = "login.mdb"
   losenord = "nej du, sånt skriver jag ju inte här förstås!"
   Set Connect = Server.CreateObject("ADODB.Connection")
   Connect.Open "driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath(databasFil) & ";pwd=" & losenord

   ' Kontrollera så att användaren inte finns redan.
   SQL = "SELECT * FROM Users WHERE username='" & Request.Form("username") & "'"
   SET rs = Connect.Execute(SQL)

   If rs.EOF Then
	'Fält att lägga till i databasen.
	SQL = "INSERT INTO Users (username, password, name, initials, email)"
	SQL = SQL & " VALUES('" & Request.Form("username") & "', "
	SQL = SQL & "'" & Request.Form("password") & "', "
	SQL = SQL & "'" & Request.Form("name") & "', "
	SQL = SQL & "'" & Request.Form("initials") & "', "
	SQL = SQL & "'" & Request.Form("email") & "'"
	SQL = SQL & ")"
	Connect.Execute(SQL)
	%>
	Användaren "<% =Request.Form("username") %>" har lagts till.<P>
	<A HREF="login.asp">Tillbaka</A>
	<%
   Else
	%>
	Användaren "<% =Request.Form("username") %>" finns redan.<P>
	<A HREF="javascript:history.back(-1)">Tillbaka till formuläret</A>
	<%
	   End If

Hoppas det funkar för dig!

------------------
Peter D

Medlem sedan juni 20019 024 inlägg
#5

Fast jag ska nog uppdatera den koden och använda ADO istället... det blir så in i helvetes jobbigt att använda SQL för att skriva insert och sådant. Chanserna för att man gör fel är 110 % högre än om man använder ADO tycker jag.

Förresten så är den koden inte sådär optimerad.

Connect.Execute(SQL)
%>
[b]
Användaren "<% =Request.Form("username") %>" har lagts till.<P>
<A HREF="login.asp">Tillbaka</A>
[/b]
<%
Else
%>
[b]
Användaren "<% =Request.Form("username") %>" finns redan.<P>
<A HREF="javascript:history.back(-1)">Tillbaka till formuläret</A>
[/b]
<%
End If

De fetmarkerade områden bör skrivas med "Response.Write" istället, det är snabbare på sådana korta partier.

------------------
Peter D

Medlem sedan mars 20002 836 inlägg
#6

Du kan oxå indexera fältet username och sätta att inga dubbletter är tillåtna.

Sedan kan du använda denna kod:

SQL = "INSERT INTO members (Login, Password, Email, Lag, Position, Kommentar ) " & _
	"VALUES ('" & Request.Form("namn") &"','" & Request.Form("pass") &"','" & _
	Request.Form("epost") &"','" & Request.Form("lag") &"','" & _
	Request.Form("pos") &"','" & Request.Form("comment") &"')"

On Error Resume Next

Set Connection = Server.CreateObject("ADODB.Connection")
	Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
		"Data Source=" & Server.MapPath("falala.mdb")

	Connection.Execute(SQL)

	If err.Number <> 0 Then
		Response.Write "Användarnamnet är upptaget. Försök med ett annat."
		err.Clear
	End If

	Connection.Close
Set Connection = Nothing

cya,
PatrikB

------------------
*Det tar sig sa han som hade eld i håret*

Medlem sedan juni 20019 024 inlägg
#7

Bra idé PatrikB!

Du har banne mig svar på allt (nästan i alla fall)! :)

------------------
Peter D

Medlem sedan juni 20019 024 inlägg
#8

Förresten, när jag ändå håller på... :)
Är det någon som använder DSN "nu förtiden"?

------------------
Peter D

Medlem sedan maj 20011 312 inlägg
#9

Vad innebär att indexera fältet?

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan dec. 1999653 inlägg
#10

det innebär att du ställer in i Access/mySql/ms SQL att fältet 'username' eller vad det nu heter är indexerat. då kommer den använda användarnamnet som ett slags ID då detta är unikt.

vidare så saknar jag Trim() då vi inte vill att folk ska kunna regga "nakoz", " nakoz" och "nakoz " m.m.

mvh.

------------------
stora pojkar gråter också.

Medlem sedan jan. 20002 453 inlägg
#11

tackar för hjälpen alla :)

tyvärr är det något som inte riktigt stämmer. använder PatrikB´s kod just nu såhär:

<%
Set connection = server.createObject("adodb.connection")
connection.open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("falala.mdb") & ";"

SQL = "INSERT INTO members (Login, Password, Email, Lag, Position, Kommentar, Goals, Matcher) " & _
"VALUES ('" & Request.Form("namn") &"','" & Request.Form("pass") &"','" & _
Request.Form("epost") &"','" & Request.Form("lag") &"','" & _
Request.Form("pos") &"','" & Request.Form("comment") &"','" & Request.Form("goal") &"','" & Request.Form("match") &"')" 
On Error Resume Next 

Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("falala.mdb") 
Connection.Execute(SQL) 
If err.Number <> 0 Then
Response.Write "Användarnamnet är upptaget. Försök med ett annat."
err.Clear
End If 
Connection.Close
Set Connection = Nothing
%>

tyvärr visas meddelandet att användarnamnet är upptaget även om det är ledigt. någon som ar någon idé? :)

------------------
It aint over until the fat lady sings...

Medlem sedan okt. 20005 273 inlägg
#12

Jag skulle gjort så här..

1. Lagt in alla Request.Form´s i variablar.

2. Klammrat alla reserverade ord kolla här http://www.webeye.nu/default2.asp?que=asp/default.asp&exec=asp/reserverade_ord_t-sql.asp

3. Tagit bort det översta connectionobjektet.

4. Skrivit ut SQL-satsen med response.wtite och slängt upp den här på wF.

Testa detta :)

------------------
I like ¼ £ whith cheese

Medlem sedan mars 20002 836 inlägg
#13

Om du avkommaterar On Error Resume Next vad får du för felmeddelande då??

När man använder sig av On Error Resume Next så kommer inga fel att visas och sidan fortsätter att processa dock ej på korrekt sätt.

Man kan även i if satsen kolla felen så här:

If err.Number <> 0
Response.Write "<P>" & err.Number & "<BR>" & err.Description & "</P>"
Response.Write "Användarnamnet upptaget."
End If

cya,
PatrikB

------------------
*Det tar sig sa han som hade eld i håret*

Medlem sedan jan. 20002 453 inlägg
#14

PatrikB: använde mig av din senaste kod. fick följande fel:

-2147217900
Syntax error in INSERT INTO statement.

Användarnamnet upptaget.

såhär ser det ut just nu:

<%
SQL = "INSERT INTO members (Login, Password, Email, Lag, Position, Kommentar, Goals, Matcher) " & _
"VALUES ('" & Request.Form("namn") &"','" & Request.Form("pass") &"','" & _
Request.Form("epost") &"','" & Request.Form("lag") &"','" & _
Request.Form("pos") &"','" & Request.Form("comment") &"','" & Request.Form("goal") &"','" & Request.Form("match") &"')" 
On Error Resume Next 

Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("falala.mdb") 
Connection.Execute(SQL) 
If err.Number <> 0 Then
Response.Write "<P>" & err.Number & "<BR>" & err.Description & "</P>"
Response.Write "Användarnamnet upptaget."
End If
Connection.Close
Set Connection = Nothing
%>

------------------
It aint over until the fat lady sings...

Medlem sedan okt. 20005 273 inlägg
#15
<%
SQL = "INSERT INTO members ([Login], [Password], Email, Lag, Position, Kommentar, Goals, Matcher) " & _
"VALUES ('" & Request.Form("namn") &"','" & Request.Form("pass") &"','" & _
Request.Form("epost") &"','" & Request.Form("lag") &"','" & _
Request.Form("pos") &"','" & Request.Form("comment") &"','" & Request.Form("goal") &"','" & Request.Form("match") &"')" 
On Error Resume Next 
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("falala.mdb") 
Connection.Execute(SQL) 
If err.Number <> 0 Then
Response.Write "<P>" & err.Number & "<BR>" & err.Description & "</P>"
Response.Write "Användarnamnet upptaget."
End If
Connection.Close
Set Connection = Nothing
%>

testa att klammra dessa som jag har gjort :)

------------------
I like ¼ £ whith cheese

Medlem sedan jan. 20002 453 inlägg
#16

man tackar :D suveränt!

nu kan man inte längre registrera samma användarnamn. har dock ett par frågor till.

  1. hur gör jag för att snygga till meddelandet om att använarnamnet är upptaget? just nu ser det lite skumt ut:

-2147467259
The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.

Användarnamnet upptaget.

  1. om registreringen går bra och använarnamnet är ledigt, var kan jag då lägga in en respone.redirect till en bekräftelse-sida?

------------------
It aint over until the fat lady sings...

Medlem sedan okt. 20005 273 inlägg
#17
<%
SQL = "INSERT INTO members ([Login], [Password], Email, Lag, Position, Kommentar, Goals, Matcher) " & _
"VALUES ('" & Request.Form("namn") &"','" & Request.Form("pass") &"','" & _
Request.Form("epost") &"','" & Request.Form("lag") &"','" & _
Request.Form("pos") &"','" & Request.Form("comment") &"','" & Request.Form("goal") &"','" & Request.Form("match") &"')" 
On Error Resume Next 
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("falala.mdb") 
Connection.Execute(SQL) 
If err.Number <> 0 Then
Response.Write "Användarnamnet upptaget."
Else
Response.redirect "sida2.asp"
End If
Connection.Close
Set Connection = Nothing
%>

tror jag, jag har aldrig använt denna kod själv :)

------------------
I like ¼ £ whith cheese

[Redigerat av icaaq den 15 jul 2001]

Medlem sedan jan. 20002 453 inlägg
#18

fungerar perfekt! stort tack :D

------------------
It aint over until the fat lady sings...

Medlem sedan okt. 20005 273 inlägg
#19

Är du :D *lycklig*, är jag :h *lugn*

------------------
I like ¼ £ whith cheese

Medlem sedan dec. 1999653 inlägg
#20
SQL = "INSERT INTO members ([Login], [Password], Email, Lag, Position, Kommentar, Goals, Matcher) " & _
"VALUES ('" & [b]Trim(Request.Form("namn"))[/b] &"','" & Request.Form("pass") &"','" & _
Request.Form("epost") &"','" & Request.Form("lag") &"','" & _
Request.Form("pos") &"','" & Request.Form("comment") &"','" & Request.Form("goal") &"','" & Request.Form("match") &"')"

bara ett tips :)

------------------
stora pojkar gråter också.

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