我制作此代码用于通过验证更改密码。问题是,当我单击 jbutton
更改密码时,它起作用并成功更改了数据库上的密码,并显示了 jOptionpane
信息消息。
但执行完此步骤后,jOptionpane
运行的错误消息不断显示。我尝试找出代码哪里错了。但还不能。
private void jBtn_UpdateActionPerformed(java.awt.event.ActionEvent evt) {
String user_id = txt_UserID.getText();
String cur_pass = txt_CurrentPassword.getText();
String new_pass = txt_NewPassword.getText();
try {
Connection c = DBConnection.dbconmethod();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");
while(rs.next()) {
String userid = rs.getString("user_id");
String pass = rs.getString("password");
if(user_id.equals(userid) && cur_pass.equals(pass)) {
Statement s1 = c.createStatement();
s1.executeUpdate("UPDATE tch_data SET password='"+new_pass+"' WHERE user_id='"+user_id+"'");
JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Password Succesfully Changed!", null, JOptionPane.INFORMATION_MESSAGE);
}else {
JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Error : Invalid Data.", "Error Message", JOptionPane.ERROR_MESSAGE);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
最佳答案
您正在使用 SQL 查询检索数据库中所有用户的所有行
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");
当然,您的用户名和密码与所有行不匹配(因为您将在循环中看到数据库中的所有用户),因此您总是会收到每行的错误消息,除了对于其中包含您的用户的那个。
您应该更改查询以仅返回您要更改密码的用户的行。然而,这需要您使用PreparedStatement。 (如果您只是在常规 Statement
的查询中使用 user_id 而不进行转义,您就会遭受 SQL 注入(inject)攻击。请注意,这也适用于您更新密码的地方 - 您应该也为此使用PreparedStatement,否则当有人将密码更改为 '; DROP TABLE tch_data; SELECT * FROM tch_data 'foobar
或类似的内容时,您会感到非常惊讶)
因此您应该将上面两行替换为以下三行:
PreparedStatement st = c.prepareStatement("SELECT * from tch_data WHERE user_id = ?");
st.setString(1, user_id);
ResultSet rs = st.executeQuery();
请注意,您还忘记关闭结果集、语句和连接。您应该关闭所有它们(但最重要的是连接),否则您将泄漏它们并且您的应用程序将很快耗尽资源。
关于java - 被困在密码更改代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918271/