1

我正在尝试创建一个登录屏幕,用于检查用户输入的登录名和密码是否与存储在双阵列中的登录名和密码。

我已经修改了几次代码,但似乎无法使其正常工作。

如果我输入了正确的登录名和错误的密码,它就会失败,但是当我输入错误的登录名时,它就会陷入一个永恒的循环。

这是我到目前为止所拥有的:

string[,] loginBD = new string[9,4];    

     private void BtnLogin_Click(object sender, RoutedEventArgs e)
     {
        loginBD[0,0] = "0";
        loginBD[0,1] = "Name";
        loginBD[0,2] = "admin";
        loginBD[0,3] = "123";
        int busca = 0,loginOK = 0, loginFail = 0;
        string login, senha;

        mID = 8;
        loginOK = 0;
        loginFail = 0;
        login = TxtLogin.Text.Trim();
        senha = PsbSenha.Password;

        do{
           if (loginBD[busca, 2].Equals(login))
           {
               if (loginBD[busca, 3].Equals(senha))
               {
                   loginOK = 1;
               }
               else
               {
                   loginFail = 0;
               }
           }
           else if (busca >= mID)
           {
               loginFail = 1;
           }
           else
           {
               busca++;
           }
       } while (loginFail == 0 && loginOK == 0);

       if (loginFail == 1)
       {
           MessageBox.Show("Fail!");
       }else if (loginOK == 1)
       {
           MessageBox.Show("OK!");
       }
}
4

2 回答 2

2

我在这里看到两个问题:

1)如果您的用户名匹配(但密码不匹配),则您永远不会增加阵列计数器(busca)。这用正确的用户名和错误的密码解释了您的无限循环。(您是否尝试过调试代码并逐步执行逻辑?)

2) 你创建了你的数组,但没有初始化它的所有元素......只有第一组。因此,在do循环的第二次迭代中,您将尝试在空值 - loginBD[1,3] 上调用方法 (Equals)。这将引发异常。

不是将 mID 初始化为 8,而是将其初始化为数组中的条目数减一。这样,一旦您达到数组中的实际项目数,将您的索引与数组项的计数 (busca >= mID) 进行比较将导致进程失败。

于 2013-03-21T14:40:18.423 回答
0

答案很简单。您循环评估您输入的数据。但是当评估失败时,您不会重新查询数据。

您不应仅循环评估,而应在身份验证失败时重新查询用户名和密码。

原始代码看起来像这样:

private void Btn_LoginClick(object sender, EventArgs e)
{
    loginBD[0,0] = "0";
    loginBD[0,1] = "Name";
    loginBD[0,2] = "admin";
    loginBD[0,3] = "123";
    int busca = 0,
    boolean loginOK = false;
    string login, senha;
    login = TxtLogin.Text.Trim();
    senha = PsbSenha.Password;
    //Call some method to check if the login is valid
    loginOK = checkLogin(loginBD, login, senha);
    if (loginOK)
    {
       //Do the login
    }
    else
    {
       //Clear the login-form
    }
}

checkLogin 是您在 do-while 循环中的代码的占位符,只有在登录正常时才应返回 true。

private boolean checkLogin(string[] loginBD, string login, string senha)
{
    //Divide the amount of Array-Elements by 4 to get the amount of users
    for (int x = 0; x < loginBD.Length / 4; x++)
    {
        //you can do this in one step
        if(loginBD[x,2].Equals(login) && loginBD[x,3].Equals(senha))
        {
          //this automatically ends the loop and tells the main method that login is correct
          return true;
        }
    }
    //if there is no corresponding login in the array
    return false;
}

有关方法的更多信息(如果您不知道这是什么)请查看此处

至于登录的安全性,你可以暂时看看数据库

于 2013-03-21T14:39:11.930 回答