【问题标题】:Classic ASP nested if else condition not executing经典 ASP 嵌套 if else 条件未执行
【发布时间】:2012-05-19 16:32:37
【问题描述】:

这是我使用经典 ASP 制作的简单登录表单,用户和管理员可以使用相同的表单登录。

在数据库的“用户”表中,我创建了一个名为“状态”的字段,数据类型为 BIT(即“0”或“1”)值被接受。每个新注册用户的默认值为“0”。

我通过了一个查询,如果状态为“0”,则特定用户或管理员应重定向到 Authentication.asp 页面,他将在该页面回答一些问题并单击提交,数据库中的状态值将设置为“1”。 “1”表示用户或管理员已经填写了认证表格,可以重定向到他想要的页面,而不是重定向到Authentication.asp页面。 为此,我使用了 If-elseif-else 语句。我重新检查了很多次,我的 if-else 语句似乎没有任何遗漏。但即使我在数据库的状态列中手动输入“1”作为状态,我总是被重定向到身份验证页面。这是我的代码。

Session("Username")=request.form("user_name")
    if request.Form("sub_but") <> "" then
    sql = "SELECT * FROM Users WHERE UserName='"&request.form("user_name")&"' AND Password='"&request.form("pwd")&"'"
    rs.open sql, con, 1, 2  
    if rs.EOF then
            response.Write("<script language='javascript'>{attention_emp();}</script>")
        else
        if(rs("status")=1 & rs("login_type")="admin") then
                  Response.Redirect ("admin.asp")
        elseif(rs("status")=1 & rs("login_type")="emp") then
                      response.Redirect("leave.asp")
        else
                      response.Redirect("auth.asp") 
        end if  
    end if

    rs.close
    end if 

【问题讨论】:

  • 如果这是一个公共站点(或有真正恶意的内部用户),我真的希望您检查您发布的表单变量是否存在 SQL 注入攻击(至少替换单引号)。

标签: sql asp-classic if-statement vbscript sql-server-2000


【解决方案1】:

不要使用“&”,使用以下:

if(rs("status")=1 AND LCase(rs("login_type"))="admin") then
              Response.Redirect ("admin.asp")
    elseif(rs("status")=1 AND LCase(rs("login_type"))="emp") then
                  response.Redirect("leave.asp")
    else
                  response.Redirect("auth.asp") 
    end if  

在 vbScript 中,"&" 是字符串连接运算符而不是逻辑运算符。这是vbScript operators的列表。

EDIT 还要注意字符串比较区分大小写。我已更改比较以将数据库输出转换为小写。这也可能是您的问题的一个因素。

还要注意@Mirko 的评论!!!

编辑 2 从 cmets 中澄清

如果您仍然总是被重定向到身份验证页面,则需要确定实际原因。对条件语句进行硬编码应该有助于将其排除为原因。另一种调试方法是拆分语句而不是重定向。见下文:

if(rs("status")=1 AND LCase(rs("login_type"))="admin") then
    Response.Redirect ("admin.asp")
elseif(rs("status")=1 AND LCase(rs("login_type"))="emp") then
    response.Redirect("leave.asp")
else
    Response.Write "Status: " & rs("status") & "<br />"
    Response.Write "Is Status 1: " & (rs("status")=1)  & "<br />"
    Response.Write "Login Type: " & rs("login_type") & "<br />"
    Response.Write "Is Login Type admin: " & (rs("login_type") = "admin") & "<br />"
    Response.Write "Is Login Type emp: " & (rs("login_type") = "emp") & "<br />"
end if  

这将帮助您确定 if 和 if/else 语句中的 truefalse。一旦你这样做了,你应该更清楚是什么导致你得到的行为。隔离并解决问题后,放回重定向。

【讨论】:

  • 第二个具有javascript功能的if语句是验证无效的用户名和密码。如果用户输入错误的用户名或密码,它会完美执行。
  • @Mckenzi yes "&" 是 javascript 中的逻辑运算符。您在这里使用 vbScript。你厌倦了我的回答吗?
  • 是的,但输出相同..它仍然重定向到身份验证页面
  • 当你硬编码你的价值观时会发生什么?例如 1 = 1 和 "admin" = "admin"
  • 通过硬编码,我的意思是手动设置 1 = 1 正如您在问题中提到的那样,但将其扩展到 if 1=1 and "admin" = "admin" then
猜你喜欢
  • 2010-12-17
  • 2021-12-21
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多