mysqli подготовленный оператор – не обновлять значения NULL

У меня есть подготовленное заявление для обновления нескольких полей. Я получаю данные из формы, но не все поля обязательны. Поэтому возможно, что некоторые поля не установлены. Я установил для них по умолчанию значение NULL. Теперь я не хочу перезаписывать старое значение с помощью NULL. Как я могу сказать MySql не обновлять значение, если оно NULL?

$insert_stmt = $mysqli->prepare(" UPDATE members SET username=?, email=?, $password=?, $random_salt=?, level=?, customerID=?, name=?, surname=?, phone=?, quantities=? WHERE id=? "); $insert_stmt->bind_param('ssssissss', $username, $email, $password, $random_salt, $level, $customerID, $firstname, $surname, $phone); $insert_stmt->execute(); 

В моем случае это значение пароля и random_salt, которое может быть NULL. Будет очень плохо перезаписать пароль только с помощью NULL;)

Вы можете изменить свой запрос следующим образом:

 UPDATE members SET username = IFNULL(?, username), email = IFNULL(?, email) -- and so on for all fields WHERE... 

Также может быть более эффективным сначала проверить значение ваших параметров и динамически строить запрос, включая только те поля, для которых у вас есть ненулевое значение для обновления.

Вы можете попробовать следующее:

 $insert_stmt = $mysqli->prepare("UPDATE members SET username=?, email=?, password=IF(LENGTH('?')=0, password, '?'), random_salt=IF(LENGTH('?')=0, random_salt, '?'), level=?, customerID=?, name=?, surname=?, phone=?, quantities=? WHERE id=?"); 

условие If преобразуется в: IF (<YOUR_CONDITION>, <VALUE_IF_TRUE>, <VALUE_IF_FALSE>).

Предполагая, что id – это PK, вы можете использовать:

 INSERT INTO members ( id, username, email, password, random_salt, level, customerID, name, surname, phone, quantities ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE username = IF(username <> '',VALUES(username),username), email = IF(email <> '',VALUES(email),email), password = IF(password <> '',VALUES(password),password) ... 

Внимательно прочитайте поля запроса и данные. Набор полей и набор данных в привязке не совпадают.

 UPDATE members SET username=?, email=?, $password=?, $random_salt=?, level=?, customerID=?, name=?, surname=?, phone=?, quantities=? WHERE id=? $insert_stmt->bind_param('ssssissss', $username, $email, $level, $customerID, $firstname, $surname, $phone); 

В списке привязок нет: password, random_salt, id