从JTextField读取带有撇号的字符串并将其保存在数据库中

时间:2015-12-19 16:58:27

标签: java mysql sql database jtextfield

我有很多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等是全球变量。

1 个答案:

答案 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注入,有大量信息,它们是黑客攻击的主要载体之一。