为什么会出现 JavaSQLException:没有为参数 1 指定值?
Why do I get the JavaSQLException: No value specified for parameter 1?
我正在编写一个代码,如果按下 jButton1,它应该更新数据库中的密码,但它抛出错误 JavaSQLException:没有为参数 1 指定值。我不知道我没有指定哪个参数。任何帮助将不胜感激。这是代码
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String v0 = lbl_emp.getText();
int x = JOptionPane.showConfirmDialog(null, "Are you sure you want to change your password?", "Update Record", JOptionPane.YES_NO_OPTION);
if(x == 0){
try{
String v1 = txt_password.getText();
String v2 =(cmb_question.getSelectedItem().toString());
String v3 = txt_answer.getText();
String sql = "update users set password = '"+v1+"' , secret_question = '"+v2+"', answer = '"+v3+"' where id = '"+v0+"'";
if(txt_password.getText().isEmpty()){
JOptionPane.showMessageDialog(txt_password, "Password field is empty");
}
else{
pst = conn.prepareStatement(sql);
pst.executeUpdate();
JOptionPane.showMessageDialog(null, "Password updated");
}
}catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
}
您为 SQL (v0 .. v3) 提供了 4 个参数,但只指定了 v1、v2 和 v3。更好的方法也是使用 PreparedStatement 值绑定,在其中用问号 (?
) 替换变量值。
String sql = "update users set password = ? , secret_question = ?, answer = ? where id = ?";
...
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, v1); // preparedStatement-Index is 1-indexed
pst.setString(2, v2);
pst.setString(3, v3);
pst.setString(4, v0);
pst.executeUpdate();
...
因为,您构建 SQL 的方式使其容易受到 SQL-注入攻击,如果有人选择包含转义字符作为其中一个参数的密码,即使用'
.
我正在编写一个代码,如果按下 jButton1,它应该更新数据库中的密码,但它抛出错误 JavaSQLException:没有为参数 1 指定值。我不知道我没有指定哪个参数。任何帮助将不胜感激。这是代码
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String v0 = lbl_emp.getText();
int x = JOptionPane.showConfirmDialog(null, "Are you sure you want to change your password?", "Update Record", JOptionPane.YES_NO_OPTION);
if(x == 0){
try{
String v1 = txt_password.getText();
String v2 =(cmb_question.getSelectedItem().toString());
String v3 = txt_answer.getText();
String sql = "update users set password = '"+v1+"' , secret_question = '"+v2+"', answer = '"+v3+"' where id = '"+v0+"'";
if(txt_password.getText().isEmpty()){
JOptionPane.showMessageDialog(txt_password, "Password field is empty");
}
else{
pst = conn.prepareStatement(sql);
pst.executeUpdate();
JOptionPane.showMessageDialog(null, "Password updated");
}
}catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
}
您为 SQL (v0 .. v3) 提供了 4 个参数,但只指定了 v1、v2 和 v3。更好的方法也是使用 PreparedStatement 值绑定,在其中用问号 (?
) 替换变量值。
String sql = "update users set password = ? , secret_question = ?, answer = ? where id = ?";
...
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, v1); // preparedStatement-Index is 1-indexed
pst.setString(2, v2);
pst.setString(3, v3);
pst.setString(4, v0);
pst.executeUpdate();
...
因为,您构建 SQL 的方式使其容易受到 SQL-注入攻击,如果有人选择包含转义字符作为其中一个参数的密码,即使用'
.