2016-12-29 4 views
-3

나는 더비 데이터베이스에서 환자를 업데이트하기 위해이 코드를 작성했지만 SQLSyntaxErrorException을 던졌습니다. 내가 놓친 게 있니?Derby 데이터베이스 예외 업데이트

public void updateInDatabase(int ID,String sex, String firstName, String familyName, String eMail) { 
    try { 
     String sql = "UPDATE PATIENT SET sex = "+ sex +" WHERE NR = "+ID; 
     st.executeUpdate(sql); 
     String sq2 = "UPDATE PATIENTEN SET FIRSTNAME=" + firstName + "WHERE NR=" + ID; 
     st.executeUpdate(sq2); 
     String sq3 = "UPDATE PATIENTEN SET FAMILYNAME=" + familyName + "WHERE NR=" + ID; 
     st.executeUpdate(sq3); 
     String sq4 = "UPDATE PATIENTEN SET EMAIL=" + eMail + "WHERE NR=" + ID; 
     st.executeUpdate(sq4); 
    } catch (SQLException ex) { 
     Logger.getLogger(DbManagerPatienten.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
+1

예, 당신은 구문 오류 및 [SQL 주입을 방지하기 위해 PreparedStatement''의 사용을 놓치고 :

은 자세한 내용은 다음을 참조하십시오 ] (https://en.wikipedia.org/wiki/SQL_injection) 공격을 통해 해커가 데이터를 도용하고 테이블을 삭제합니다. – Andreas

+2

질문 자체에 관해서는 전체 오류 메시지를 표시하는 부분과 누락 된 부분이 누락되었습니다. 일반적으로 전체 스택 추적을 게시하는 것이 가장 좋습니다. – Andreas

+1

질문 : 두 개의 서로 다른 테이블 ('환자'와 '환자')을 업데이트하는 것을 숙고합니까? 왜 3 개의 다른 UPDATE 문을 실행하여 같은 테이블의 3 개의 다른 열을 업데이트할까요? 한 문장으로 그렇게하는 것이 더 낫습니다. – Andreas

답변

2

주요 실수는 당신이 당신에게 SQL Injection 공격에 취약를 떠나 문자열 연결을 사용하는 것입니다.

귀하의 실수는 텍스트 값을 인용하지 않았기 때문입니다.

UPDATE PATIENT SET sex = male WHERE NR = 42 

가 문 있었어야 :

UPDATE PATIENT SET sex = 'male' WHERE NR = 42 

그러나, 자바에서이 작업을 수행하는 올바른 방법입니다 sql 자바 문 결과는 다음과 같은 SQL 문을 갖는

String sql = "UPDATE PATIENT SET sex = "+ sex +" WHERE NR = "+ID; 

PreparedStatement을 사용하고 try-with-resources를 사용하십시오.

String sql = "UPDATE PATIENT" + 
       " SET SEX = ?" + 
        ", FIRSTNAME = ?" + 
        ", FAMILYNAME = ?" + 
        ", EMAIL = ?" + 
      " WHERE NR = ?"; 
try (PreparedStatement stmt = conn.prepareStatement(sql)) { 
    stmt.setString(1, sex); 
    stmt.setString(2, firstName); 
    stmt.setString(3, familyName); 
    stmt.setString(4, eMail); 
    stmt.setInt (5, ID); 
    int updateCount = stmt.executeUpdate(); 
    if (updateCount == 0) 
     throw new IllegalArgumentException("Patient not found: " + ID); 
}