Обновлять уже существующие значения при добавлении новых

#php #mysql #sql #mysqli

#php #mysql #sql #mysqli

Вопрос:

Я вставляю некоторые значения в свою базу данных.

 $stmt = $conn->prepare("INSERT INTO `members` (`id`, `name`, `nickname`, `prefix`, `suffix`) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("sssss",$row['member_id'], $row['name'], $row['nickname'], $row['prefix'], $row['suffix']);
$stmt->execute();
  

Это делает то, что я хочу: если присоединился новый пользователь, это добавит их в участники. Однако, если уже существующий участник изменил свой ник, эта информация не обновляется. Я хотел бы 1) добавить новых участников, как это делается в настоящее время, но также 2) обновить псевдонимы для уже существующих участников, если есть какие-либо изменения.

Я попытался добавить следующий код после приведенного выше (сначала добавить участников, а затем обновить), но, похоже, он работает не так, как я хотел.

 $stmt = $conn->prepare("UPDATE members SET nickname = '?' WHERE id = '?'");
$stmt->bind_param("ss",$row['nickname'], $row['id']);
$stmt->execute();
  

Комментарии:

1. просто избавьтесь от кавычек как .... nickname = ? WHERE id = ?

2. Хм. Похоже, это сработало, и теперь я задаюсь вопросом, почему они у меня там были… Спасибо!

Ответ №1:

Вы можете использовать REPLACE INTO вместо INSERT INTO вашей prepare(), которая имела бы

 REPLACE INTO `members` (`id`, `name`, `nickname`, `prefix`, `suffix`) VALUES (?, ?, ?, ?, ?)
  

REPLACE обновляет новые данные, если значение первичного ключа уже существует.
Более подробная информация здесь:https://dev.mysql.com/doc/refman/5.5/en/replace.html

Комментарии:

1. Спасибо за ответ. Проблема с этим заключается в том, что REPLACE INTO удаляет строку перед вставкой. У меня есть некоторые другие значения в базе данных, и я хотел бы заменить только один столбец, который меняется, а не всю строку. ON DUPLICATE KEY UPDATE Справился бы с этой задачей?

2. ДА. В этом случае вы можете использовать INSERT.. ON DUPLICATE KEY UPDATE .