【问题标题】:Using IF condition inside a while loop in C#. False value still looping在 C# 的 while 循环中使用 IF 条件。假值仍在循环
【发布时间】:2018-04-13 06:13:08
【问题描述】:

我不知道为什么我的 while 循环中的 else 值仍在循环,无论结果是登录还是无效。警报对话框始终弹出。

这些是我的代码。

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();
}

【问题讨论】:

  • 但是你没有跳出循环..
  • 我尝试将它插入到我的 else 语句中。但结果总是错误的。但是如果我删除休息;在我的其他声明中。用户将登录,但在系统登录之前将首先显示警报弹出窗口。
  • 首先会弹出误报对话框。我不知道如何打破它:(
  • 按列的名称引用列,以确保您正在检查的列是您想要检查的列myReader["user_login"]。作为一般规则,执行select * from 不是一个好习惯,更难维护,如果您需要来自其他表的额外数据,您将检索到比预期更多的数据。最后,您可以使用 SQL where 子句并摆脱 while。

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


【解决方案1】:

您应该在if 中使用String.Equals(user1 ,txtUsername.Text.ToString ())String.Equals(pass1 ,txtPassword.Text.ToString ()) 而不是user1 == txtUsername.Textpass1 == txtPassword.Text。进行正确的字符串比较

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

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

【讨论】:

  • 感谢您帮助我。我尝试了您的解决方案,但结果仍然相同:(。
  • 我不知道为什么我的 else 语句总是弹出:(。我知道我的条件或我的 while 循环中有问题:(。
  • 他已经在使用 stopLoop 标志,但已对其进行了评论。
【解决方案2】:

在您的问题中,您永远不会说停止读取数据读取或在找到所需记录时使用中断。

                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();

您也可以查看我对问题 cmets 的建议,以尝试使其变得更好,因为我认为没有必要 ;-)

【讨论】:

    【解决方案3】:

    问题是你的逻辑有点缺陷,让我用一些东西来演示一下。假设您有 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
    

    【讨论】:

      【解决方案4】:

      与您的问题相关的代码有 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
                    }
                }
            }
        

      【讨论】:

        猜你喜欢
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2019-10-26
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        相关资源
        最近更新 更多