0

我一直在连接到 mySQL 数据库的登录页面上工作,它一直在触发“不正确的用户名或密码警报”。

我打印了它获得的所有值,但无法找出我错在哪里。

我的表的设置方式是 bcsapril 是表中的第一个条目,它打印出来自文本字段的用户名不等于从数据库中检索到的值。我试图将 if(rs2.next()) 更改为 while(rs2.next())

下一帧出现了,但我收到“不正确”消息的次数与数据库中的条目数相同。

我唯一的问题是为什么“bcsapril”总是我的代码正在检索的用户名。任何帮助都会很棒。

if(evt.getKeyCode() == KeyEvent.VK_ENTER){
  String user = userTx.getText();
  String pwd = new String (passTx.getPassword());
  String sql = "SELECT * FROM accounts";
  boolean loggedIn = false;

  try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/dardb","root","1234");
            PreparedStatement stmt = con.prepareStatement(sql);
            ResultSet rs2 = stmt.executeQuery(sql);
        while(rs2.next()) {
            String uname = rs2.getString("username");
            String password = rs2.getString("password");
                if((user.equals(uname)) && (pwd.equals(password))){
                    loggedIn = true;
                }
        }

        if(loggedIn){
             DarDBMainFrame x = new DarDBMainFrame();
                    x.setVisible(true); 
                    java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
                    setBounds(0,0,screenSize.width, screenSize.height);
                    setVisible(true);
                    x.setUsername(user);
                    pack();      
                    setUser(user);
                    dispose();
        }else{
                    JOptionPane.showMessageDialog(this, "Incorrect Username or Password!", "Login Error", JOptionPane.ERROR_MESSAGE);
                    System.out.println(user);
                    System.out.println(pwd);
             } 
    }catch (ClassNotFoundException | SQLException | HeadlessException e){
        JOptionPane.showMessageDialog(this, e.getMessage());
    }
    } 
4

3 回答 3

0

如果不运行代码,我怀疑问题是因为您没有向whereSQL 提供子句以将结果限制为提供的用户名。

相反,您从表中选择所有结果,并且只检索第一个结果(通过rs2.next())。

更常见的方法是:

  1. 创建一个准备好的表单语句:

    SELECT * FROM accounts WHERE username = ? and password = ?

  2. 将prepared statement中的第一个参数设置为用户输入的用户名,第二个参数设置为用户的密码

  3. 确定返回多少行——如果有一个结果,那么你可以认为认证成功

准备好的语句的示例(未经测试)代码提取可能是:

String sql = "SELECT * FROM accounts WHERE username=? AND password=?";  
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/dardb","root","1234");
PreparedStatement statement = con.prepareStatement(sql);

statement.setString(1, uname);
statement.setString(2, password);

ResultSet resultSet = statement.executeQuery();

旁注一旦你得到这个工作 - 你真的不应该在数据库中存储纯文本密码 - 至少尝试使用类似 SHA-1 的值。

请注意,我建议使用准备好的语句,而不是将用户名和密码直接放入 SQL 以防止 SQL 注入攻击。

于 2013-04-23T03:03:46.147 回答
0

while(rs2.next)这不应该是if(rs2.next)因为您要从Accounts表中检索所有记录。

如果您在 SQL 语句中提供where子句,那么If条件就可以了。

于 2013-04-23T03:11:24.090 回答
0

继@Ravi 的回答之后,如果您必须循环,我会建议以下内容(为清楚起见,删除了无关代码):

boolean loggedIn = false;

while(rs2.next()) {
    if((user.equals(uname)) && (pwd.equals(password))){
        loggedIn = true;
        break;
    }
}

if (!loggedIn) {
    JOptionPane.showMessageDialog(this, "Incorrect Username or Password!", "Login Error", JOptionPane.ERROR_MESSAGE);
}
于 2013-04-23T03:29:50.713 回答