在C#中使用while循环内的IF条件。假值仍在循环中

时间:2018-04-13 06:13:08

标签: c# android visual-studio xamarin xamarin.android

我不知道为什么我的while循环中的其他值仍在循环中,无论结果是登录还是无效。 alertdialog总是弹出。

这些是我的代码。

MySqlConnection conn = new MySqlConnection();    
string query = "server=sample.com;port=3306;database=sample;user id=sample;password=sample";
conn.ConnectionString = query;

MySqlCommand cmd = new MySqlCommand("select * from wp_users", conn);
try
{
    conn.Open();


    MySqlDataReader myReader = cmd.ExecuteReader();

    string user1 = "";
    string pass1 = "";
    //bool stopLoop = false; // stop looping for false value;
    while (myReader.Read())
    {

        user1 = myReader[1].ToString(); //datacolumn -> user_login
        pass1 = myReader[2].ToString(); //datacolumn -> user_pass

        if ((user1 == txtUsername.Text) && (pass1 == txtPassword.Text))
        {

            Intent myIntent;
            myIntent = new Intent(Activity, typeof(index));

            string a = user1;

            myIntent.PutExtra("myItem", a);
            StartActivity(myIntent);
        }
        else
        {
            Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.App.AlertDialog.Builder(Activity);
            alert.SetMessage("Invalid username or password");
            alert.SetPositiveButton("Ok", (senderAlert, args) =>
            {
                alert.Dispose();
            });
            alert.Show();
        }
    }
    myReader.Close();
}
catch (MySqlException ex)
{
    Android.Support.V7.App.AlertDialog.Builder except = new Android.Support.V7.App.AlertDialog.Builder(Activity);
    except.SetTitle("Please report this to our website(error server timeout)");
    except.SetMessage(ex.ToString());
    except.SetPositiveButton("Ok", (senderAlert, args) =>
    {
        except.Dispose();
    });
    except.Show();
}
finally
{
    conn.Close();
}

4 个答案:

答案 0 :(得分:0)

在你的问题中,你永远不会说要停止阅读数据引导,也不要在找到所需记录时使用中断。

                MySqlDataReader myReader = cmd.ExecuteReader();

                string user1 = "";
                string pass1 = "";
                bool stopLoop = false;
                while (stopLoop == false && myReader.Read())
                {

                    user1 = myReader[1].ToString(); //datacolumn -> user_login
                    pass1 = myReader[2].ToString(); //datacolumn -> user_pass

                    if ((user1 == txtUsername.Text) && (pass1 == txtPassword.Text))
                    {
                        stopLoop = true;

                        //rest of the true if code

                        // If you didnt use a stopLoop flag you could have inserted here a break;
                    }
                    else
                    {
                        // your else code
                    }
                }
                myReader.Close();

你也可以检查我对问题评论的建议,试着让它变得更好,因为我认为没有必要; - )

答案 1 :(得分:0)

问题是你的逻辑有点瑕疵让我用事物来证明。假设你有user1,user2,user3等说10 ..

你有

while reading through list
  if entered user = user item from list
     do happy stuff
  else 
     do unhappy stuff
end while.

所以我输入user3

if user3 = user1 .. nope say unhappy stuff
if user3 = user2 .. nope say unhappy stuff
if user3 = user3 .. yes do happy stuff
if user4 = user3 .. nope say unhappy stuff
....

如果您有2000个用户,那么您将完成1999年的不成功。

你需要一个像这样工作的循环

item found = false
while reading through list
  if entered user = user from list
   item found = true
    do happy stuff
    break; // because theres no point checking another 1999 !
end while

if item found = false do unhappy stuff

答案 2 :(得分:0)

与您的问题相关的代码存在2个问题。

首先,登录成功后不会中断循环。这可以使用break;关键字轻松完成。

所以你会得到:

    [...]
    myIntent.PutExtra("myItem", a);
    StartActivity(myIntent);
    break;                               // <----
}
else [...]

第二个问题是,在每个循环中,如果登录不正确,您也会处理该情况。这意味着如果数据与数据库返回的第一个用户的数据不匹配,代码将立即声明登录失败。

您需要跟踪输入是否与任何用户匹配,并且只有当它们都不匹配时(因此在while循环之后),您可以处理失败的登录。

至于一些建议:

  • 如果这是一个真实用户的应用程序,请不要将密码作为纯文本存储在数据库中,哈希并比较哈希值。有关如何散列密码的信息,请参阅this post
  • 不是从数据库中获取整个用户表并在循环中检查每个用户,而是使用查询立即检查您正在查找的用户。数据库针对搜索进行了优化,使您的代码更快。

    类似的东西:

        using (var cmd = new MySqlCommand("select user_login from wp_users where user_login = @user and user_pass = @pass", conn))
        {
            conn.Open();
    
            // Set parameters
            cmd.Parameters.AddWithValue("@user", user);
            cmd.Parameters.AddWithValue("@pass", pass);
    
            // Get result
            using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
            {
                // If ANY row, there is a user
                if (reader.Read())
                {
                    // Login succesfull
                } 
                else
                {
                    // Login failed
                }
            }
        }
    

答案 3 :(得分:-1)

您应在String.Equals(user1 ,txtUsername.Text.ToString ())中使用String.Equals(pass1 ,txtPassword.Text.ToString ())user1 == txtUsername.Text代替pass1 == txtPassword.Textif。要进行正确的字符串比较

您应该将else部分移到循环之外。如果用户名和密码正确,则添加break;作为if条件中的最后一个语句。

你可以维护一个布尔变量让我们说isLogin=false;当登录成功时将此变量设置为true。循环后,检查标志并决定是否显示登录错误对话框。