执行代码后,我得到了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); }
Jon Skeet.. 6
我究竟做错了什么
好吧,你是通过连接值来构建SQL语句.这会导致SQL注入攻击 - 以及其他问题.幸运的是,这实际上还没有产生问题 - 因为你永远不会执行你的陈述.
你需要:
参数化您的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
,或者你有在你的应用程序一个可怕的安全漏洞.
我究竟做错了什么
好吧,你是通过连接值来构建SQL语句.这会导致SQL注入攻击 - 以及其他问题.幸运的是,这实际上还没有产生问题 - 因为你永远不会执行你的陈述.
你需要:
参数化您的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
,或者你有在你的应用程序一个可怕的安全漏洞.