为什么它只检查sql的最后一行?

时间:2010-01-18 13:41:51

标签: java sql

我在我的数据库类中使用此方法检查密码和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;



}

2 个答案:

答案 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"

如果该查询返回记录,则表示该用户存在。然后,您可以检查密码是否与您的方法提供的密码匹配(我希望您不以明文形式存储密码......)。

这种方法可以让您在将来想要跟踪用户帐户的登录尝试失败。并且比每个记录循环更高性能/可扩展性以找到一个匹配。