2016-07-18 4 views
1

Я хочу УДАЛИТЬ столбец из базы в спящем режиме, где мой вставленный параметр -regBroj - тот же, что и в базе.Не удается удалить базу данных формы SQLGrammarException

Это мой метод в контроллере для deleting.But я постоянно получать SQLGrammarException: Вызванный: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неизвестный столбец «BG026CH» в «где предложение»

Этот «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 ниже, должен исправить вашу непосредственную проблему, но вы должны _seriously_ рассмотреть использование подготовленных инструкций, чтобы избежать 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 таблицу, представьте себе, что кто-то взламывает интерфейс передать значение '' 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 Кроме того, подготовленные утверждения более подходят для его кеширования. –