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

ここに2つの問題があります。

1)ユーザー名が一致する場合(ただしパスワードが一致しない場合)、配列カウンター(busca)をインクリメントすることはありません。これは、正しいユーザー名と間違ったパスワードでの無限ループを説明しています。(コードをデバッグしてロジックをステップ実行してみましたか?)

2)配列を作成しますが、そのすべての要素を初期化するのではなく、最初のセットのみを初期化します。したがって、doループの2回目の反復で、null値(loginBD [1,3])でメソッド(Equals)を呼び出そうとします。これにより、例外がスローされます。

mIDを8に初期化する代わりに、配列内のエントリ数から1を引いた数に初期化します。このように、インデックスを配列アイテムの数(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 に答える