2016-12-29 5 views
-3

私はderbyデータベースの患者を更新するためにこのコードを書いたが、それは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

はい、あなたは構文エラーを防ぐために、PreparedStatement' 'を使用すると、[SQLインジェクションを逃しています](https://en.wikipedia.org/wiki/SQL_injection)攻撃では、ハッカーがあなたのデータを盗んでテーブルを削除します。 – Andreas

+2

質問そのものについては、完全なエラーメッセージを表示する部分とその原因となる行がありません。通常、完全なスタックトレースを送信することをお勧めします。 – Andreas

+1

質問:2つの異なるテーブル( '患者 'と'患者')を更新していることを熟考していますか?なぜ3つの異なるUPDATEステートメントを実行して同じテーブルの3つの異なる列を更新しているのですか? 1つのステートメントでこれを行うのがより効果的*になります。 – Andreas

答えて

2

あなたの主な間違いはSQL Injection攻撃に対して脆弱あなたを残している、あなたは文字列の連結を使用することです。

具体的な間違いは、テキスト値を引用しなかったことです。

次のSQL文を持つ sqlのJava文の結果ということ
String sql = "UPDATE PATIENT SET sex = "+ sex +" WHERE NR = "+ID; 

UPDATE PATIENT SET sex = male WHERE NR = 42 

文がされている必要があります:

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

しかし、Javaでこれを行うには正しい方法があります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); 
} 
関連する問題