Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mettre à jour les colonnes si les valeurs d'entrée ne sont pas nulles, sinon ignorer et conserver les valeurs existantes de la colonne dans la base de données

Vous insérez le nom d'utilisateur directement dans le SQL sans échapper ni même citer. Je pense que vous avez simplement manqué les apostrophes.

Pour éviter les problèmes d'injection SQL, n'insérez JAMAIS de constantes de chaîne SQL à partir de données dynamiques, utilisez TOUJOURS PreparedStatement et insérez des marqueurs.

Vous pouvez également échapper les valeurs, mais l'utilisation de marqueurs est beaucoup plus sûre et améliore les performances SQL en permettant à la base de données de mettre en cache l'instruction SQL compilée.

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

Remarque : Réponse étendue pour couvrir le problème de la vérification nulle.

Lorsque vous utilisez une simple injection de chaîne, "A='" + name + "'" devient A='Joe' pour une valeur non nulle mais A='null' pour une valeur nulle, ce qui n'est certainement pas ce que vous voulez.

En utilisant des marqueurs de paramètre, la valeur de ? peut être null , ce qui signifie que IFNULL(?, Name) donnera le comportement exact nécessaire, c'est-à-dire en utilisant la valeur de ? lorsqu'il n'est pas nul, et la valeur de NAME quand ? est nul.