卡在密码更改代码中

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!
}