我一直在处理连接到mySQL数据库的登录页面,并且它一直在试图“不正确的用户名或密码警报”。
我已经打印了所有正在获得的值,但无法找出我错在哪里。
我的表的设置方式是bcsapril是表中的第一个条目,它打印出textfield中的用户名不等于数据库中检索到的值。 而且我试图改变 如果(rs2.next()) 成 而(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());
}
}
答案 0 :(得分:0)
如果不运行代码,我怀疑问题是因为您没有向SQL提供where
子句以将结果限制为提供的用户名。
相反,您要从表中选择所有结果,只检索第一个(通过rs2.next()
)。
更常见的方法是:
创建表格的预备声明:
SELECT * FROM accounts WHERE username = ? and password = ?
将预准备语句中的第一个参数设置为用户输入的用户名,将第二个参数设置为用户的密码
准备好的声明的示例(未经测试)代码提取可以是:
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注入攻击。
答案 1 :(得分:0)
它应该是while(rs2.next)
而不是if(rs2.next)
,因为您正在从帐户表中检索所有记录。
如果您在SQL语句中提供 where 子句,那么如果条件就可以了。
答案 2 :(得分: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);
}