Вие вмъквате потребителското име направо в 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'
за стойност, различна от нула, но A='null'
за нулева стойност, което определено не е това, което искате.
Чрез използване на маркери на параметри, стойността на ?
може да бъде null
, което означава, че IFNULL(?, Name)
ще даде точното необходимо поведение, т.е. използвайки стойността на ?
когато не е нула, и стойността на NAME
когато ?
е нула.