我有很多JTextField
个对象,我想在其中一个中读取一个包含撇号的字符串,然后将它保存在数据库中。问题是当我尝试保存此字符串时,因为我收到此错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error
in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near 'k')' at line 1
我把撇号放在JTextField
和" k"信是在下一个JTextField
。我无法理解谁不能读取这种字符是数据库(我有一个用SQL编写的数据库,我使用MySQL),或JTextField
对象。我该怎么办?
这是保存从JTextField
对象捕获的字符串的代码(我将字符串转换为另一种方法,只需使用方法jTextField.getText();
):
public void setNuovaAzienda(){
try {
int contCliente = 0;
Class.forName(NOMEDRIVER); //avvio il driver
conn = DriverManager.getConnection(SERVERURL, USER, PASSWORD);
Statement st = conn.createStatement();
Statement st1 = conn.createStatement();
Statement st2 = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT MAX(IdCliente) FROM cliente");
while (rs.next())
contCliente = rs.getInt(1);
contCliente++;
int showConfirmDialog = JOptionPane.showConfirmDialog(null,"Vuoi confermare l'inserimento del nuovo cliente?", "Conferma Inserimento", JOptionPane.YES_NO_OPTION);
if (showConfirmDialog == 0) {
try {
st1.executeUpdate("INSERT INTO cliente () VALUES ('"+contCliente+"', '"+citta+"', '"+indirizzo+"', '"+nCivico+"', '"+telefono+"')");
st2.executeUpdate("INSERT INTO personagiuridica () VALUES ('"+contCliente+"', '"+partitaIva+"', '"+nomeAzienda+"', '"+ragSociale+"', '"+fax+"')");
ImageIcon icon = new ImageIcon("C:\\Users\\salva\\Documents\\NetBeansProjects\\JavaApplication10\\src\\javaapplication7\\Icons\\icona v.png");
JOptionPane.showMessageDialog(null, "Cliente Inserito", "Conferma Inserimento", JOptionPane.INFORMATION_MESSAGE, icon);
InserisciOrdine linkInserisciOrdine;
linkInserisciOrdine = new InserisciOrdine();
linkInserisciOrdine.setLocationRelativeTo(null);
linkInserisciOrdine.setVisible(true);
dispose();
} catch (SQLException ex) {
Logger.getLogger(NuovaAzienda.class.getName()).log(Level.SEVERE, null, ex);
}
}
conn.close();
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(NuovaAzienda.class.getName()).log(Level.SEVERE, null, ex);
}
}
contCliente,citta,indirizzo等是全球变量。
答案 0 :(得分:2)
听起来像是将SQL语句构造为String,直接嵌入数据,如
String dataString = ...; //get value from field
String sql = "INSERT INTO `mytable` (`col`) VALUES ('"+dataString+"')";
这是错误的,因为如果你的字符串中有单引号,这将导致无效的语句。尝试将该字符串输出到System.out
并在SQL工作表中执行它,您应该看到出了什么问题。您应该使用Prepared Statements代替:
//Assuming you have jdbc Connection named conn
String dataString = ...; //get value from field
PreparedStatement ps = conn.prepareStatement("INSERT INTO `mytable` (`col`) VALUES (?)");
ps.setString(1, dataString);
ps.execute();
ps.close();
它会为你提供一个体面的防止SQL注入的保护作为奖励。
如果您无法使用预准备语句(例如旧版第三方API)重写代码,那么您应该转义字符串中的单引号,方法是将它们替换为两个单引号({{ 1}} - > '
)。
<强>更新强>
实际上,您确实使用连接构造语句。避免这一点,除非你想有一天被随机脚本小孩攻击。阅读SQL注入,有大量信息,它们是黑客攻击的主要载体之一。