执行代码后,我得到了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);
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么
好吧,你是通过连接值来构建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!");
Run Code Online (Sandbox Code Playgroud)st.executeUpdate在显示对话框之前调用.(理想情况下,您不应该在同一方法中混合UI和数据访问,但......)
请更改的顺序,但-你不只是添加一个电话st.executeUpdate,或者你有在你的应用程序一个可怕的安全漏洞.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |