为什么会出现 JavaSQLException: No value specified for parameter 1?

问题描述

我正在编写一个代码,如果按下 jButton1,它应该更新数据库中的密码,但它抛出错误 JavasqlException: No value specified for parameter 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-Injection-Attacks 的攻击。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...