mysql создает новую строку вместо обновления существующих

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

if (isset($_SESSION['logged_in']) && $_SESSION['name_of_user'] == $profile_name) { $pageOwner = true; } if (isset($_POST['submit'])) { $bio = $_POST['bio']; if (empty($bio)) { $error = "Missing Bio"; } else { if ($member_bio->num_rows == 1) { if ($query = $db->query("UPDATE user_account SET 'bio'='$bio' WHERE 'id_user'='$id'")) { $ok_mesg = "Profile has been updated!!!"; } else { $error = "ERROR on our end"; } } else { if ($query = $db->query("INSERT INTO user_account (bio) VALUES('$bio')")) { $ok_msg = "Profile has been updated"; } else { $error = "Error on our end"; } } } } 

Вы можете напрямую UPDATE если значение уже существует или INSERT если оно не существует, используя INSERT...ON DUPLICATE KEY UPDATE

Но сначала вам нужно указать уникальный столбец,

 ALTER TABLE user_account ADD CONSTRAINT tb_uq UNIQUE (id_user) 

если столбец ID_USER уже является первичным ключом, то пропустите первый метод. После того, как он был реализован, вы можете использовать следующий синтаксис

 INSERT INTO user_account (id_user, bio) VALUES($id, '$bio') ON DUPLICATE KEY UPDATE bio = '$bio'; 
  • INSERT … ON DUPLICATE KEY UPDATE Синтаксис

В качестве побочного элемента запрос уязвим с помощью SQL Injection если значение (значения) переменных было получено извне. Пожалуйста, ознакомьтесь с приведенной ниже статьей, чтобы узнать, как ее предотвратить. Используя PreparedStatements вы можете избавиться от использования одинарных кавычек вокруг значений.

  • Как предотвратить SQL-инъекцию в PHP?