U voegt de gebruikersnaam rechtstreeks in de SQL in zonder te escapen of zelfs maar te citeren. Ik denk dat je gewoon de apostrofs hebt gemist.
Om problemen met SQL-injectie te voorkomen, mag u NOOIT SQL-tekenreeksconstanten uit dynamische gegevens invoegen, ALTIJD PreparedStatement gebruiken en markeringen invoegen.
U kunt ook ontsnappen aan de waarden, maar het gebruik van markeringen is veel veiliger en verbetert de SQL-prestaties doordat de database de gecompileerde SQL-instructie in de cache kan opslaan.
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());
Opmerking: Antwoord uitgebreid om het probleem met de nulcontrole te dekken.
Als u eenvoudige tekenreeksinjectie gebruikt, "A='" + name + "'"
wordt A='Joe'
voor een niet-null-waarde maar A='null'
voor een null-waarde, wat absoluut niet is wat je wilt.
Door parametermarkeringen te gebruiken, wordt de waarde van ?
kan null
zijn , wat betekent dat IFNULL(?, Name)
geeft het exacte gedrag dat nodig is, d.w.z. met behulp van de waarde van ?
wanneer het niet null is, en de waarde van NAME
wanneer ?
is nul.