У меня есть подготовленное заявление для обновления нескольких полей. Я получаю данные из формы, но не все поля обязательны. Поэтому возможно, что некоторые поля не установлены. Я установил для них по умолчанию значение 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