我使用验证更改密码的代码。问题是,当我单击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();
}
}
答案 0 :(得分:1)
您正在使用SQL查询所有用户检索所有数据库中的行
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");
当然,您的用户名和密码与所有行不匹配(因为您将在循环中看到数据库中的所有用户),因此您总是会收到每行的错误消息,除了对于那个有你的用户的那个。
您应该将查询更改为仅返回您要更改密码的用户的行。但是,这需要您使用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。你应该关闭所有这些(但最重要的是Connection),否则你就会泄漏它们,你的应用程序很快就会耗尽资源。
答案 1 :(得分:0)
成功完成密码更改后,您应使用中断语句突破 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(); }
答案 2 :(得分:0)
我完全同意Erwin Bolwidt的回答,这是恕我直言的正确答案。
既然你也问过为什么你最终得到了messagedialogues - >因为你正在加载所有用户!
你的if-else块错了。如果您只是为一个用户更改/检查密码!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/imgBtnItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:background="@android:color/transparent"
android:src="@mipmap/ic_launcher">
</ImageButton>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<TextView
android:id="@+id/txtName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="9sp"
android:layout_below="@+id/imgBtnItem"
android:text="Hello"
android:layout_weight="0.7">
</TextView>
<ImageButton
android:id="@+id/imgBtnAdd"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@+id/imgBtnItem"
android:layout_toRightOf="@+id/txtName"
android:background="@android:color/transparent"
android:src="@drawable/abc_btn_check_to_on_mtrl_015"
android:layout_weight="0.3">
</ImageButton>
</LinearLayout>
</LinearLayout>
</RelativeLayout>