エスケープしたり引用符を付けたりせずに、ユーザー名をSQLに直接挿入しています。アポストロフィを見逃しただけだと思います。
SQLインジェクションの問題を防ぐために、動的データからSQL文字列定数を挿入しないでください。常に、PreparedStatementを使用してマーカーを挿入してください。
または、値をエスケープしますが、マーカーを使用する方がはるかに安全であり、データベースがコンパイル済みのSQLステートメントをキャッシュできるようにすることでSQLのパフォーマンスが向上します。
String updateQuery = "UPDATE " + USER_TABLE +
" SET " + USER_TABLE_FIRST_NAME + "=IFNULL(? ," + USER_TABLE_FIRST_NAME + ")," +
USER_TABLE_LAST_NAME + "=?," +
USER_TABLE_ABOUT_ME + "=?," +
USER_TABLE_CITY + "=?," +
USER_TABLE_DOB + "=?" +
" WHERE " + USER_TABLE_ID + "=?";
PreparedStatement stmt = conn.prepareStatement(updateQuery);
stmt.setString(1, user.getFirstName());
stmt.setString(2, user.getLastName());
stmt.setString(3, user.getAboutMe());
stmt.setString(4, user.getCity());
stmt.setString(5, user.getDateOfBirth());
stmt.setString(6, user.getUserId());
注: ヌルチェックの問題をカバーするために回答が拡張されました。
単純な文字列インジェクションを使用している場合、"A='" + name + "'"
A='Joe'
になります null以外の値の場合、A='null'
null値の場合、これは間違いなくあなたが望むものではありません。
パラメータマーカーを使用することにより、?
の値 null
にすることができます 、つまりIFNULL(?, Name)
必要な正確な動作を提供します。つまり、?
の値を使用します。 nullでない場合、およびNAME
の値 ?
のとき nullです。