2016-07-18 104 views
1

我想從hibernate中的基本DELETE列插入-regBroj參數是一樣的基地。無法刪除表單數據庫SQLGrammarException

這是我在控制方法deleting.But我不斷得到 SQLGrammarException: 產生的原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列 'BG026CH' 在 'where子句'

這個'BG026CH'是regBroj的值,我用它作爲參數來查找數據庫中的車輛並刪除它。並且我將它插入到adminPage中的文本區域。

public String izbrisi(String regBroj) { 
    List<Vozilo> lista = listaj(); 
     Session s = HibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction t = s.beginTransaction(); 

     for (int i = 0; i < lista.size(); i++) { 
      if (regBroj .equals(lista.get(i).getRegBroj())) { 
       String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk=" + regBroj + ""; 
       Query q = s.createQuery(izbrisiquery); 
       int a = q.executeUpdate(); 
       t.commit(); 
       return "adminPage"; 
      } 
     } 
     t.commit(); 
     return "error"; 


    } 
+0

下面的@Dhaval給出的答案應該可以解決您的直接問題,但是您應該嚴格考慮使用預準備語句來避免SQL注入。 –

回答

2

請與其中之一

String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk='" + regBroj + "'"; 
+0

偉大的作品,我忘記添加 - '' - 在我的查詢。 – Stanimir

2

您應該考慮使用準備好的陳述,因爲它們會自動照顧引號轉義字段值替換下面的字符串,而他們也將保護您免受SQL注入。

// obtain a Connection object using your Hibernate session, or through some other means 
Connection conn = getDBConnection(); 

for (int i = 0; i < lista.size(); i++) { 
    if (regBroj .equals(lista.get(i).getRegBroj())) { 
     String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk = ?"; 
     PreparedStatement ps = conn.prepareStatement(izbrisiquery); 
     ps.setString(1, regBroj); 
     ps.executeUpdate(); 
     t.commit(); 

     return "adminPage"; 
    } 
} 

要查看惡意用戶可以注入SQL如何工作,或如何破壞了Korisnik表,假設有人黑客的UI傳遞的'' OR TRUE一個值brojLK。這是導致DELETE聲明會是什麼樣子:

DELETE FROM Korisnik WHERE brojLk = '' OR TRUE 

換句話說,這種注射查詢會放棄你的整個表!準備好的語句會扼殺這個輸入,黑客不會執行查詢。

+0

這可能是一個愚蠢的問題。你知道一些好的教程準備好的聲明 – Stanimir

+0

從[MKYong]開始(http://www.mkyong.com/jdbc/jdbc-preparestatement-example-select-list-of-the-記錄/),他們通常很擅長解釋事情。 –

+0

@Stanimir除此之外,準備好的語句更適合緩存它。 –