我有一个简单的表单,用户可以输入促销代码和电子邮件地址,以便注册到电子邮件,如下所示。但目前它没有正确验证电子邮件。
有一个包含文件doreferral.asp;检查他们输入的代码是否存在于促销代码表中,还检查电子邮件地址是否已存在。
我添加了emailValidate以检查电子邮件地址是否有效,如果没有,然后告诉用户<%= sys_message%>。
但是,它正在停止正版电子邮件,因此验证无效。 :S
我的doreferral.asp看起来像这样;
<%
Code = replace(request.Form("Code"),"'","")
Email = replace(request.Form("Email"),"'","")
sys_message = ""
submission = ""
''//Check the submitted code against existing ones in the database
set conn = server.CreateObject("ADODB.connection")
conn.open(application("DATABASE"))
qs = "SELECT COUNT(AgentReferralCode) AS 'CountCodes' FROM Customers WHERE AgentReferralCode = '" & Code & "'"
set rs = conn.Execute(qs)
CountCode = rs("CountCodes")
set rs = nothing
conn.close
set conn = nothing
If(CountCode < 1) Then
sys_message = sys_message & "<p class='err'>The agent code does not exist.</p>"
End If
''//Check to see if the email address is valid
Dim emailValidate
emailValidate = 0 'Initializing goby to 0
''//if the len is less than 5 then it can't be an email
''//(i.e.: a@a.c)
If Len(session("Email")) <= 5 Then
emailValidate = 1
End If
If InStr(1, session("Email"), "@", 1) < 2 Then
'If we find one and only one @, then the
'email address is good to go.
emailValidate = 1
Else
If InStr(1,session("Email"), ".", 1) < 4 Then
'Must have a '.' too
emailValidate = 1
End If
End If
If emailValidate <> 0 then
sys_message = sys_message & "<p class='err'>The email address is not valid.</p>"
End If
''//Check the submitted email against existing ones in the database
set conn = server.CreateObject("ADODB.connection")
conn.open(application("DATABASE"))
qs = "SELECT COUNT(ReferredEmail) AS 'Count' FROM TenantReferral WHERE ReferredEmail = '" & Email & "'"
set rs = conn.Execute(qs)
countEmail = rs("Count")
set rs = nothing
conn.close
set conn = nothing
If(countEmail >= 1) Then
sys_message = sys_message & "<p class='err'>This email address has already been referred.</p>"
End If
''//Only Process the SQL if there is no sys_message
If(sys_message = "") Then
SQLfields = SQLfields & "ReferredCode, "
SQLvalues = SQLvalues & "'"& Trim(Code) &"', "
SQLfields = SQLfields & "ReferredEmail"
SQLvalues = SQLvalues & "'"& Trim(Email) &"'"
SQL = SQL & "INSERT into TenantReferral ("& SQLfields &") VALUES ("& SQLvalues &")"
'response.Write(SQL)
set conn = server.CreateObject("ADODB.connection")
conn.open application("DATABASE")
SET rs = conn.execute(SQL)
[Send email code]
sys_message = sys_message & "<p class='ok'>Thank you for your referral.</p>"
submission = "ok"
'response.Redirect("referral.asp")
End If
%>
我想知道是否有人可以帮助调试emailValidate功能以检查电子邮件地址是否有效?
谢谢。
答案 0 :(得分:8)
像这样的基本正则表达式验证。您可以获得更好的功能并进行dns查找,但在大多数情况下,这已经足够了:
Function validate(eaddr)
dim isValidE
dim regEx
isValidE = True
set regEx = New RegExp
regEx.IgnoreCase = False
regEx.Pattern = "^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$"
isValidE = regEx.Test(eaddr)
validate= isValidE
End Function
正则表达式从这里借来:http://tiffanybbrown.com/2006/12/12/a-better-regex-pattern-for-matching-e-mail-addresses/
答案 1 :(得分:0)
这是一个包含示例电子邮件正则表达式验证程序的页面:http://www.codetoad.com/asp_email_reg_exp.asp。你应该可以使用这样的东西来满足你的需求。
另一件事 - 你会想看看使用参数化的SQL查询,目前你的命令很容易受到SQL注入攻击,因为你只需要将代码和电子邮件附加到查询字符串中。
答案 2 :(得分:0)
这里有一些与我有关的事情。
您没有明确地将表单(“email”)值放入会话中,但您稍后尝试在脚本中使用它。也许你为了简洁而省略了那部分代码,我不知道。
使用变量“emailValidate”并将其设置为0(即false),但在验证失败时将其设置为1(true)。对我来说似乎是一个糟糕的变量。 “失败”应为假,“通过”应为真。
如上所述,为了热爱您的数据库和所有可爱的小型实时电子邮件地址,请重构您的代码以避免SQL注入!
您的评论声明您正在寻找一个@符号,但您的代码却说如果您只找到一个@符号,那么emailValidate = 1(失败(在您的代码中)) - 这导致我认为你自己的变量命名困扰了你!
我不知道你在ASP编写了多长时间,所以我不愿意看到太过道貌岸然,但这种编码方法是不对的。这是啰嗦和困惑。理想的解决方案已经建议使用Regex和一个小助手功能,你传递电子邮件地址,只返回真或假......