Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spalten aktualisieren, wenn Eingabewerte nicht null sind, andernfalls ignorieren und die vorhandenen Werte der Spalte in der Datenbank beibehalten

Sie fügen den Benutzernamen direkt in die SQL ein, ohne Escapezeichen oder gar Anführungszeichen. Ich glaube, Sie haben einfach die Apostrophe übersehen.

Um SQL-Injection-Probleme zu vermeiden, fügen Sie NIEMALS SQL-String-Konstanten aus dynamischen Daten ein, verwenden Sie IMMER PreparedStatement und fügen Sie Markierungen ein.

Alternativ können Sie die Werte mit Escapezeichen versehen, aber die Verwendung von Markierungen ist viel sicherer und verbessert die SQL-Leistung, indem der Datenbank ermöglicht wird, die kompilierte SQL-Anweisung zwischenzuspeichern.

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

Hinweis: Antwort erweitert, um das Problem mit der Nullüberprüfung abzudecken.

Wenn Sie die einfache Zeichenfolgeninjektion verwenden, "A='" + name + "'" wird zu A='Joe' für einen Wert ungleich Null, aber A='null' für einen Nullwert, was definitiv nicht das ist, was Sie wollen.

Durch die Verwendung von Parametermarkierungen wird der Wert von ? kann null sein , was bedeutet, dass IFNULL(?, Name) ergibt genau das benötigte Verhalten, d. h. die Verwendung des Werts von ? wenn es nicht null ist, und der Wert von NAME wenn ? ist null.