登录屏幕,无限循环和数组检查错误

时间:2013-03-21 14:24:35

标签: c# silverlight login multidimensional-array

我正在尝试创建一个登录屏幕,该屏幕根据双数组中存储的登录名和密码检查用户键入的登录名和密码。

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

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

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

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!");
       }
}

2 个答案:

答案 0 :(得分:2)

我在这里看到两个问题:

1)如果您的用户名匹配(但密码没有),那么您永远不会递增数组计数器(busca)。这解释了您使用正确的用户名和错误密码的无限循环。 (您是否尝试过调试代码并逐步完成逻辑?)

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

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

答案 1 :(得分: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;
}

有关方法的更多信息(如果您不知道这是什么),请检查here

关于登录的安全性,您暂时可以查看databases