Sql 我想在注册时阻止使用相同的电子邮件地址
我在登记时停了下来。我只想验证注册时是否已经使用了电子邮件地址 这是我的密码。Sql 我想在注册时阻止使用相同的电子邮件地址,sql,asp-classic,sql-insert,Sql,Asp Classic,Sql Insert,我在登记时停了下来。我只想验证注册时是否已经使用了电子邮件地址 这是我的密码。 我认为最好使用RecordSet对象的RecordCount属性,并确保它不大于0,但您所拥有的应该可以工作 我将使用动态SQL字符串,如: sql = "SELECT user_email FROM regis WHERE user_email='" & varemail & "'" 如果执行此操作并使用RecordSet对象的RecordCount属性,则代码速度会更快,对数据库的征税也会更少
我认为最好使用RecordSet对象的RecordCount属性,并确保它不大于0,但您所拥有的应该可以工作 我将使用动态SQL字符串,如:
sql = "SELECT user_email FROM regis WHERE user_email='" & varemail & "'"
如果执行此操作并使用RecordSet对象的RecordCount属性,则代码速度会更快,对数据库的征税也会更少。如果执行If-else循环,则无法对电子邮件进行检查 更改:
elseif varemail = "" then
response.write("Please provide your email")
do until rs.eof
if varemail = rs.fields("user_email")
response.write("Email address is already used")
rs.movenext
loop
致:
编辑:您还应该删除插入函数中的空格,以查看这是否导致错误。将其更改为:
register = "INSERT INTO regis(user_first_name,user_last_name,user_email,user_password) VALUES( '"&varfname&"','"&varlname&"','"&varemail&"', '"&varpass&"')"
编辑:为了完整起见,我添加了一个版本的代码,它使用参数化查询和一切帮助您避免SQL注入等。
编辑2:通过添加第二个选择修复了一些问题
<%
set MyConn = Server.CreateObject("ADODB.Connection")
MyConn.Provider="Microsoft.Jet.OLEDB.4.0"
MyConn.Open "C:\inetpub\wwwroot\Asp\admin\reg.mdb"
' add for parameterized query '
set objCommand = Server.CreateObject("ADODB.Command")
objCommand.ActiveConnection = MyConn
set rs=server.CreateObject("ADODB.Recordset")
' second record Set for inserting '
set insertRS=server.CreateObject("ADODB.Recordset")
dim varfname,varlname,varemail,varpass
varfname=request.form("txtfname")
varlname=request.form("txtlname")
varemail=request.form("txtemail")
varpass=request.form("txtpass")
' change query to use a parameter '
sql = "SELECT user_email FROM regis WHERE user_email=?;"
objCommand.CommandText = sql
' create parameter and append value '
set objParameter = objCommand.CreateParameter("useremail", adVarChar, adParamInput, 50, varemail)
objCommand.Parameters.Append objParameter
' open record set '
rs.Open objCommand, MyConn
if varfname = "" then
response.write("Please provide your first name")
elseif varlname = "" then
response.write("Please provide your last name")
elseif varemail = "" then
response.write("Please provide your email")
do until rs.eof
if varemail = rs.fields("user_email") then
response.write("Email address is already used")
end if
rs.movenext
loop
elseif varpass = "" then
response.write("Please provide your password")
else
' create initial record set '
' note change ID to your primary key name '
sql = "SELECT * FROM regis WHERE ID = 0"
insertRS.Open sql, MyConn
' adds a new record to the record set '
' which you will insert into '
With insertRS
.addnew()
' sets each field in the record set '
.Fields("user_first_name") = varfname
.Fields("user_last_name") = varlname
.Fields("user_email") = varemail
.Fields("user_password") = varpass
' batch updates all changes made to this record set '
.Resync adAffectAllChapters, adResyncUnderlyingValues
.MarshalOptions = adMarshalModifiedOnly
.UpdateBatch
' close record set '
set .ActiveConnection = Nothing
End With
end if
%>
我认为重复使用电子邮件是你最不关心的问题。你真的不想被列入这个名单,是吗?请描述一下你在这里面临的实际问题。你的代码没有达到你期望的效果吗?它会做什么呢?你的方法效率很低。您将获得所有可用的电子邮件地址,然后使用循环查看输入的值是否在该数据集中。更好的方法是先获取输入的值,然后使用sql查看是否存在记录。我的代码可能吗?这里不是一个有效的问题。当然你的代码是可能的;你已经写好并贴在这里了。请输入标题,以表明您遇到的问题,以便对在搜索中找到该问题的未来读者有所帮助。谢谢。这是个糟糕的建议。您鼓励使用允许SQL注入的代码,但这是错误的。如果你打算为没有经验的程序员发布答案,不要从一开始就教他们错误的方法。使用参数化查询-永远不要连接SQL,尤其是在使用用户输入的面向公众的网站中。他不允许用户查看输出。这不是一个搜索字段。如果他的代码使用SQL注入攻击,那么插入或更新时就会出错。还是我是唯一一个读代码的人?不,他使用用户输入的电子邮件地址可以是任何文本,你的建议是盲目地将其与SQL连接起来并执行它。这正是SQL注入漏洞的定义。如果你看不到它是如何被这样使用的,你需要谷歌SQL注入和做一些研究。在小Bobby表上尝试谷歌搜索。@KenWhite,你看到我在字符串中特别添加了单引号了吗?或者你认为这不起作用?我使用的字符串通过了sqlmap漏洞测试。你觉得你比他们聪明吗?这意味着输入该变量的任何内容都将被视为字符串,因此不会作为命令执行。无论如何,在这种情况下,他使用一个独立的逻辑循环来插入或更新数据库;在我看来,您的答案是错误的,因为它教给我们的是糟糕的实践,而不是正确的方法,在所有情况下,正确的方法都是参数化查询,而不是SQL连接。仅仅因为你认为你可以在报价位置上胜过别人并不意味着你可以,你提供的报价也毫无意义。例如,尝试传递一个包含以Jones'开头的SQL的字符串;一些SQL语句;选择“SMIT”;您的尝试将愉快地追加前导引号,插入SQL语句,然后追加结束引号。使用参数化SQL。感谢您对该循环的帮助。我有点搞砸了,您的版本似乎正常工作,在使用电子邮件时会发出错误消息。但即使有新的电子邮件地址,它也不会注册新用户。似乎其他部分没有完成它的工作。这不是最好的方法-你真的需要遵循Dan Bracuk的方法。@Paul我知道,但他只是选择帮助micmat更正他提供的代码。
register = "INSERT INTO regis(user_first_name,user_last_name,user_email,user_password) VALUES( '"&varfname&"','"&varlname&"','"&varemail&"', '"&varpass&"')"
<%
set MyConn = Server.CreateObject("ADODB.Connection")
MyConn.Provider="Microsoft.Jet.OLEDB.4.0"
MyConn.Open "C:\inetpub\wwwroot\Asp\admin\reg.mdb"
' add for parameterized query '
set objCommand = Server.CreateObject("ADODB.Command")
objCommand.ActiveConnection = MyConn
set rs=server.CreateObject("ADODB.Recordset")
' second record Set for inserting '
set insertRS=server.CreateObject("ADODB.Recordset")
dim varfname,varlname,varemail,varpass
varfname=request.form("txtfname")
varlname=request.form("txtlname")
varemail=request.form("txtemail")
varpass=request.form("txtpass")
' change query to use a parameter '
sql = "SELECT user_email FROM regis WHERE user_email=?;"
objCommand.CommandText = sql
' create parameter and append value '
set objParameter = objCommand.CreateParameter("useremail", adVarChar, adParamInput, 50, varemail)
objCommand.Parameters.Append objParameter
' open record set '
rs.Open objCommand, MyConn
if varfname = "" then
response.write("Please provide your first name")
elseif varlname = "" then
response.write("Please provide your last name")
elseif varemail = "" then
response.write("Please provide your email")
do until rs.eof
if varemail = rs.fields("user_email") then
response.write("Email address is already used")
end if
rs.movenext
loop
elseif varpass = "" then
response.write("Please provide your password")
else
' create initial record set '
' note change ID to your primary key name '
sql = "SELECT * FROM regis WHERE ID = 0"
insertRS.Open sql, MyConn
' adds a new record to the record set '
' which you will insert into '
With insertRS
.addnew()
' sets each field in the record set '
.Fields("user_first_name") = varfname
.Fields("user_last_name") = varlname
.Fields("user_email") = varemail
.Fields("user_password") = varpass
' batch updates all changes made to this record set '
.Resync adAffectAllChapters, adResyncUnderlyingValues
.MarshalOptions = adMarshalModifiedOnly
.UpdateBatch
' close record set '
set .ActiveConnection = Nothing
End With
end if
%>