SQL - IF EXISTS UPDATE ELSE INSERT INTO

То, что я пытаюсь сделать, это INSERT подписчики в моей базе данных, но IF EXISTS она должна UPDATE строка, ELSE INSERT INTO новая строка.

Конечно, я сначала подключаюсь к базе данных и GET $name, $email и $birthday из строки url.

$con=mysqli_connect("localhost","---","---","---");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$name=$_GET['name']; 
$email=$_GET['email'];
$birthday=$_GET['birthday'];

Это работает, но просто добавляет новую строку;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday)
VALUES ('$name', '$email', '$birthday')");

mysqli_close($con);

Вот что я пробовал;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday)
VALUES '$name', '$email', '$birthday'
ON DUPLICATE KEY UPDATE subs_name = VALUES($name), subs_birthday = VALUES($birthday)");
mysqli_close($con);

и

mysqli_query($con,"IF EXISTS (SELECT * FROM subs WHERE subs_email='$email')
    UPDATE subs SET subs_name='$name', subs_birthday='$birthday' WHERE subs_email='$email'
ELSE
    INSERT INTO subs (subs_name, subs_email, subs_birthday) VALUES ('$name', '$email', '$birthday')");
mysqli_close($con);

и

mysqli_query($con,"IF NOT EXISTS(SELECT * FROM subs WHERE subs_email='$email')
Begin
INSERT INTO subs (subs_name, subs_email, subs_birthday)
VALUES ('$name', '$email', '$birthday')
End");
mysqli_close($con);

Но никто из них не работает, что я делаю неправильно?

Любая помощь очень ценится!

Ответ 1

  • Создайте UNIQUE ограничение в столбце subs_email, если он еще не существует:

    ALTER TABLE subs ADD UNIQUE (subs_email)
    
  • Используйте INSERT ... ON DUPLICATE KEY UPDATE:

    INSERT INTO subs
      (subs_name, subs_email, subs_birthday)
    VALUES
      (?, ?, ?)
    ON DUPLICATE KEY UPDATE
      subs_name     = VALUES(subs_name),
      subs_birthday = VALUES(subs_birthday)
    

Вы можете использовать функцию VALUES (col_name) в предложении UPDATE для обратитесь к значениям столбцов из части INSERT INSERT... ON DUPLICATE KEY UPDATE - dev.mysql.com

  1. Обратите внимание, что я использовал местозаполнители параметров вместо строковых литералов, так как действительно нужно использовать параметризованные операторы для защиты от атак SQL-инъекций.