在将数据插入mysql表时我做错了什么?

时间:2013-11-29 22:02:37

标签: java mysql

执行代码后,我收到Data saved消息,但我的clients表中没有记录任何数据?我是Java的数据库的新手,我做错了什么或如何修复我的代码?

    String sqlUrl = "jdbc:mysql://localhost:3306/clientinformation";
    String user = "root";
    String pass = "root";
    String name = firstName.getText();
    String lname = lastName.getText();
    String cEmail = email.getText();
    String rate = rateDbl.getText();
    String cUrl = url.getText();
    try {
        Connection con = DriverManager.getConnection(sqlUrl, user, pass);
        PreparedStatement st = con.prepareStatement("insert into clients 
                values('"+name+"', '"+lname+"', "
                + "'"+cEmail+"', '"+rate+"', '"+cUrl+"')");
        JOptionPane.showMessageDialog(null, "Data saved!");
    } catch (SQLException ex) {
        Logger.getLogger(newClient.class.getName()).log(Level.SEVERE, null, ex);
    }    

2 个答案:

答案 0 :(得分:6)

  

我做错了什么

嗯,您正在通过连接值来构建SQL语句。这导致SQL injection attacks - 以及其他问题。幸运的是,这实际上还没有产生问题 - 因为你永远不会执行你的陈述。

你需要:

  • 参数化您的SQL,以避免SQL注入攻击 - 使用参数的问号,然后使用st.setString设置每个参数:

    Connection con = DriverManager.getConnection(sqlUrl, user, pass);
    PreparedStatement st = con.prepareStatement(
        "insert into clients values (?, ?, ?, ?, ?)");
    st.setString(1, name);
    st.setString(2, lname);
    st.setString(3, cEmail);
    st.setString(4, rate); // Should this really be a string?
    st.setString(5, cUrl);
    st.executeUpdate();
    JOptionPane.showMessageDialog(null, "Data saved!");
    
  • 在显示对话框之前调用st.executeUpdate。 (理想情况下,您不应该使用相同的方法混合UI和数据访问,但是......)

请按顺序进行更改 - 执行而不是只是添加对st.executeUpdate的调用,或者您的安全漏洞可能很严重应用

答案 1 :(得分:3)

您没有看到数据的原因是您准备该语句但从未执行它。请致电st.execute();st.executeUpdate();执行此操作。


另外,但是:该代码受SQL injection(攻击或其他)的约束; fun illustration here。准备好的陈述的一半是防止它们。使用预备语句为您提供的参数:

PreparedStatement st = con.prepareStatement("insert into clients values(?, ?, ?, ?, ?)");
int n = 1;
st.setString(n++, name);
st.setString(n++, lname);
st.setString(n++, cEmail);
st.setString(n++, rate);
st.setString(n++, cUrl);
// And then the missing execute
st.execute();