卡在密码更改代码中
Got stuck in password change code
我制作了这个修改密码验证码。问题是,当我单击 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");
当然你的用户名和密码不匹配所有行(因为你会在你的循环中看到你数据库中的所有用户)所以你总是得到一个错误每行的消息,但包含您的用户的那一行除外。
您应该将查询更改为仅 return 您要为其更改密码的用户所在的行。但是,这需要您使用 PreparedStatement。 (如果您只是在查询中使用 user_id 进行常规 Statement
而没有转义,您将使自己受到 SQL 注入攻击。请注意,这也适用于您更新的地方密码 - 你还应该为此使用 PreparedStatement,否则当有人将他的密码更改为 '; DROP TABLE tch_data; SELECT * FROM tch_data 'foobar
或类似的东西时,你会感到非常惊讶)
所以你应该用这 3 行替换上面两行:
PreparedStatement st = c.prepareStatement("SELECT * from tch_data WHERE user_id = ?");
st.setString(1, user_id);
ResultSet rs = st.executeQuery();
请注意,您还忘记关闭 ResultSet、Statement 和 Connection。您应该关闭所有这些(但最重要的是连接),否则您将泄漏它们并且您的应用程序将很快 运行 耗尽资源。
密码更改成功后,您应该使用 break 语句跳出 while 循环。 while 循环中的 else 语句也应该删除并放在循环之外。应设置布尔标志以确定是否已成功更改密码并在循环外检查该条件,例如:
try {
Connection c = DBConnection.dbconmethod();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");
boolean success = false; // **** Added Code ****
while(rs.next() && success == false) {
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+"'");
success = true; // **** Added Code ****
JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Password Succesfully Changed!", null, JOptionPane.INFORMATION_MESSAGE);
break; // **** Added Code ****
}
}
// **** Added Code ****
if (!success) {
JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Error : Invalid Data.", "Error Message", JOptionPane.ERROR_MESSAGE);
}
} catch (Exception e) { e.printStackTrace(); }
我完全同意 Erwin Bolwidt 的回答,恕我直言,这是正确的答案。
因为您还问过为什么最后会出现消息对话 --> 因为您正在加载所有用户!!!
而您的 if-else 块是错误的。如果您只是 changing/checking 一个用户的密码!
// make sure that it's the correct user
if(user_id.equals(userid)) {
// check if password was changed successfully
if(cur_pass.equals(pass)) {
// successful password change
} else {
// something went wrong with the password change
}
} else {
// this else is just to help you see your mistake
// in your code you raised the error here!
}
我制作了这个修改密码验证码。问题是,当我单击 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");
当然你的用户名和密码不匹配所有行(因为你会在你的循环中看到你数据库中的所有用户)所以你总是得到一个错误每行的消息,但包含您的用户的那一行除外。
您应该将查询更改为仅 return 您要为其更改密码的用户所在的行。但是,这需要您使用 PreparedStatement。 (如果您只是在查询中使用 user_id 进行常规 Statement
而没有转义,您将使自己受到 SQL 注入攻击。请注意,这也适用于您更新的地方密码 - 你还应该为此使用 PreparedStatement,否则当有人将他的密码更改为 '; DROP TABLE tch_data; SELECT * FROM tch_data 'foobar
或类似的东西时,你会感到非常惊讶)
所以你应该用这 3 行替换上面两行:
PreparedStatement st = c.prepareStatement("SELECT * from tch_data WHERE user_id = ?");
st.setString(1, user_id);
ResultSet rs = st.executeQuery();
请注意,您还忘记关闭 ResultSet、Statement 和 Connection。您应该关闭所有这些(但最重要的是连接),否则您将泄漏它们并且您的应用程序将很快 运行 耗尽资源。
密码更改成功后,您应该使用 break 语句跳出 while 循环。 while 循环中的 else 语句也应该删除并放在循环之外。应设置布尔标志以确定是否已成功更改密码并在循环外检查该条件,例如:
try {
Connection c = DBConnection.dbconmethod();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");
boolean success = false; // **** Added Code ****
while(rs.next() && success == false) {
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+"'");
success = true; // **** Added Code ****
JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Password Succesfully Changed!", null, JOptionPane.INFORMATION_MESSAGE);
break; // **** Added Code ****
}
}
// **** Added Code ****
if (!success) {
JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Error : Invalid Data.", "Error Message", JOptionPane.ERROR_MESSAGE);
}
} catch (Exception e) { e.printStackTrace(); }
我完全同意 Erwin Bolwidt 的回答,恕我直言,这是正确的答案。
因为您还问过为什么最后会出现消息对话 --> 因为您正在加载所有用户!!!
而您的 if-else 块是错误的。如果您只是 changing/checking 一个用户的密码!
// make sure that it's the correct user
if(user_id.equals(userid)) {
// check if password was changed successfully
if(cur_pass.equals(pass)) {
// successful password change
} else {
// something went wrong with the password change
}
} else {
// this else is just to help you see your mistake
// in your code you raised the error here!
}