Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiorna le colonne se i valori di input non sono null, altrimenti ignora e mantieni i valori esistenti della colonna nel database

Stai inserendo il nome utente direttamente nell'SQL senza escape o addirittura virgolette. Penso che ti siano semplicemente sfuggiti gli apostrofi.

Per evitare problemi di SQL injection, NON inserire MAI costanti di stringa SQL da dati dinamici, utilizzare SEMPRE PreparedStatement e inserire marcatori.

In alternativa, eseguire l'escape dei valori, ma l'utilizzo dei marcatori è molto più sicuro e migliora le prestazioni SQL consentendo al database di memorizzare nella cache l'istruzione SQL compilata.

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());

Nota: Risposta estesa per coprire il problema dell'assegno nullo.

Quando utilizzi una semplice iniezione di stringhe, "A='" + name + "'" diventa A='Joe' per un valore non null ma A='null' per un valore nullo, che sicuramente non è quello che vuoi.

Utilizzando gli indicatori di parametro, il valore di ? può essere null , il che significa che IFNULL(?, Name) fornirà il comportamento esatto necessario, ovvero utilizzando il valore di ? quando non è nullo e il valore di NAME quando ? è nullo.