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
%>