Mysql
 sql >> база данни >  >> RDS >> Mysql

Актуализирайте колоните, ако входните стойности не са нулеви, в противен случай игнорирайте и запазете съществуващите стойности на колоната в базата данни

Вие вмъквате потребителското име направо в SQL, без да избягвате или дори да цитирате. Мисля, че просто си пропуснал апострофите.

За да предотвратите проблеми с инжектирането на SQL, НИКОГА не вмъквайте константи на SQL низ от динамични данни, ВИНАГИ използвайте PreparedStatement и вмъквайте маркери.

Като алтернатива, избягвайте стойностите, но използването на маркери е много по-безопасно и подобрява производителността на SQL, като позволява на базата данни да кешира компилирания SQL израз.

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

Забележка: Отговорът е разширен, за да покрие проблема с нулевата проверка.

Когато използвате просто инжектиране на низ, "A='" + name + "'" става A='Joe' за стойност, различна от нула, но A='null' за нулева стойност, което определено не е това, което искате.

Чрез използване на маркери на параметри, стойността на ? може да бъде null , което означава, че IFNULL(?, Name) ще даде точното необходимо поведение, т.е. използвайки стойността на ? когато не е нула, и стойността на NAME когато ? е нула.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сигналът за запис на Django пост се извиква два пъти въпреки uid

  2. MySQL:ALTER IGNORE TABLE дава нарушение на ограничението за целостта

  3. Какъв е типът на този низ? a:1:{s:2:en;}

  4. Как да получите данни за продажбите за последните 3 месеца в MySQL

  5. Как да разрешите пълнотекстово търсене с тирета в заявката за търсене