password = md5Crypt(password);
User u = null;
String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'";
try
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
Console.WriteLine(reader.Read());
if (reader.HasRows)
{
u = new User(reader["username"].ToString(), reader["password"].ToString(), reader["name"].ToString(), reader["role"].ToString());
}
else
{
u = null;
}
conn.Close();
}
catch (MySqlException e)
{
Console.WriteLine(e.Message);
conn.Close();
return null;
}
return u;
答案 0 :(得分:4)
从不使用字符串连接来构建您的SQL查询。而是使用参数化查询来防止sql注入和其他问题。这是真正的问题。
但要修复你的错误,你要连续两次调用MySqlDataReader.Read
。这将使读者进入下一个记录。而只做一次:
if(reader.Read())
{
u = new User(reader["username"].ToString(), reader["password"].ToString(), reader["name"].ToString(), reader["role"].ToString());
}
else
{
u = null;
}
if(reader.Read())
{
// bug detected, two user with same name and password, log this/throw an exception
}
同样使用using
statemennt(或try-catch-finally)进行连接,以确保每次都处理/关闭它,即使出现错误。