即时通讯试图做的是选择一个我的用户名所在的单元格,并将密码与在统一c#中完成的文本进行比较,但是即时通讯使用Mysql Reference,它应该像任何类型的c#。现在我试图在vb中做类似的事情,当您在阅读器中读取值时,它将在vb中看起来像这样 rdr(0),但我似乎无法在C#中执行此操作,这是我的代码。对于任何担心密码会流到哪里的人,我计划稍后再添加加密。
void Login_Data(string un, string pw) {
con = new MySqlConnection(connectionString);
con.Open();
Debug.Log("Mysql state: " + con.State);
string sql = "SELECT * FROM `users` WHERE '" + un + "'";
cmd = new MySqlCommand(sql, con);
rdr = cmd.ExecuteReader();
while (rdr.Read()) {
if (rdr[3] == pw) // this is the problem it keeps warning
//me i like my stuff clean but i dont risk errors if (rdr[3] == pw) also
//it did give me an error but not here.
{
username = un;
MessageBox.Show(username + ", Has Logged in!", "API");
usertext.text = "User: " + username;
m_uid.text = "UserID: " + rdr.GetString("uid");
}
}
}
警告CS0252可能的非预期参考比较;要进行值比较,请将左侧的文字键入“ string”
我不了解此警告,也不知道为什么发生
答案 0 :(得分:0)
这里是单行修复:
.... if (rdr[3].ToString() == pw).....
出现错误的原因是因为您正在将数据单元与数据类型进行比较...
但是让我们学点更多吧?
首先,您的SQL语句没有任何意义。让我们来看一下:
"SELECT * FROM `users` WHERE '" + un + "'"
因此,您正在使用Where
子句。让我们谈谈一般语法。当我们使用与WH
相关的任何单词时,我们是否应该提供有关某物的信息?就像,你不能只说:
布莱恩去了新泽西州……
相反,您可以说:
Brian去了新泽西州,在那里他留下了浏览器cookie。
相同的规则适用于SQL语句。当您使用Where
子句时,实际上是在检查某些值是否与给定值匹配。...
这是Where
语句的正确用法:
Select * From Table Where Column1 = 'Some Value'
继续...
您在这里使用IDataReader
,这几乎是不必要的。为什么不只比较SQL语句本身中的所有值?只需使用AND
进行多次比较...
正如您提到的,您正在将用户名和密码存储在数据库中。最佳做法是存储用户名和密码的哈希。为此,您可以选择很多选项,例如 Argon2,bcrypt,scrypt或PBKDF2 。
最后但并非最不重要的是,您的代码最大的问题是以下行:
MessageBox.Show(username + ", Has Logged in!", "API");
经过多年的努力,开发人员带来了诸如MVVM之类的模式,以实现可伸缩性,性能以及其他方面。那你为什么生活在17世纪?永远记住:
您将花费20%的时间编写代码,并花费80%的时间维护代码。
因此,请勿在UI线程本身中编写此类与UI相关的代码。如果您熟悉MVVM模式,您已经知道我在说什么...
无论如何,希望您能学到一些...如果我在某个地方出错,请随时进行纠正。 Kapeesh?
答案 1 :(得分:0)
我现在知道,如果(rdr [3] == pw)
,就不能这样包含像pw.Equals(rdr [3])这样的字符串。void Login_Data(string un, string pw) {
try {
con = new MySqlConnection(connectionString);
con.Open();
Debug.Log("Mysql state: " + con.State);
string sql = "SELECT * FROM `users` WHERE uname='" + un + "'";
cmd = new MySqlCommand(sql, con);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
if (pw.Equals(rdr[3]))
{
username = un;
MessageBox.Show(username + ", Has Logged in!", "API");
usertext.text = "User: " + username;
m_uid.text = "UserID: " + rdr.GetString("uid");
}
}
}
感谢draco18s和zack raiyan,他们给了我一些新知识。