sql >> Base de Datos >  >> RDS >> Mysql

Actualice las columnas si los valores de entrada no son nulos; de lo contrario, ignore y mantenga los valores existentes de la columna en la base de datos

Está insertando el nombre de usuario directamente en el SQL sin escapar o incluso citar. Creo que simplemente te perdiste los apóstrofes.

Para evitar problemas de inyección SQL, NUNCA inserte constantes de cadena SQL de datos dinámicos, SIEMPRE use PreparedStatement e inserte marcadores.

Alternativamente, escape los valores, pero el uso de marcadores es mucho más seguro y mejora el rendimiento de SQL al permitir que la base de datos almacene en caché la instrucción SQL compilada.

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: Respuesta ampliada para cubrir el problema del cheque nulo.

Cuando esté utilizando la inyección de cadena simple, "A='" + name + "'" se convierte en A='Joe' para un valor no nulo pero A='null' por un valor nulo, que definitivamente no es lo que quieres.

Al usar marcadores de parámetros, el valor de ? puede ser null , lo que significa que IFNULL(?, Name) dará el comportamiento exacto necesario, es decir, usando el valor de ? cuando no es nulo, y el valor de NAME cuando ? es nulo.