我不知道为什么我的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();
}
答案 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循环之后),您可以处理失败的登录。
至于一些建议:
不是从数据库中获取整个用户表并在循环中检查每个用户,而是使用查询立即检查您正在查找的用户。数据库针对搜索进行了优化,使您的代码更快。
类似的东西:
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.Text
和if
。要进行正确的字符串比较
您应该将else
部分移到循环之外。如果用户名和密码正确,则添加break;
作为if条件中的最后一个语句。
你可以维护一个布尔变量让我们说isLogin=false;
当登录成功时将此变量设置为true。循环后,检查标志并决定是否显示登录错误对话框。