我在我的数据库类中使用此方法检查密码和yahooId,如果它们是正确的,它允许用户转到下一帧。我在我的sql中添加了很多yahooId和密码但是这个方法只是检查最后一排,允许最后一个人去下一帧。你能帮帮我吗?感谢。
public static boolean Test(String userName, String password) {
boolean bool = false;
Statement stmt = null;
try {
stmt = conn.createStatement();
ResultSet rst = null;
rst = stmt.executeQuery("SELECT yahooId , password FROM clienttable");
while (rst.next()) {
if (rst.getString(1).equals(userName) && rst.getString(2).equals(password)) {
bool = true;
break;
} else {
bool = false;
}
}
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(bool);
return bool;
}
答案 0 :(得分:7)
当您只对其中一行感兴趣时,请勿选择所有行。使用WHERE子句,这是它的存在理由:
SELECT yahooId , password FROM clienttable WHERE yahooId=? AND password=?
如果结果集为空,则身份验证失败。如果只有一个结果,则身份验证成功。如果有多个结果,那么您的数据集就会被清除(yahooID
上的UNIQUE索引是防止这种情况发生的正确方法。)
顺便提一下,问题来自于使用prepared statements,如果您之前没有看到过。
答案 1 :(得分:0)
问题是你正在阅读整个clienttable,只是为了找到特定用户的匹配项。
相反,您的查询非常具体,只能查找匹配的特定记录:
SELECT yahooId, password FROM clienttable WHERE yahooid = "UserName"
如果该查询返回记录,则表示该用户存在。然后,您可以检查密码是否与您的方法提供的密码匹配(我希望您不以明文形式存储密码......)。
这种方法可以让您在将来想要跟踪用户帐户的登录尝试失败。并且比每个记录循环更高性能/可扩展性以找到一个匹配。