web-dev-qa-db-fra.com

SQL - SI EXISTE UPDATE ELSE INSERT INTO

Ce que j'essaie de faire, c'est INSERT abonnés dans ma base de données, mais IF EXISTS il devrait UPDATE la ligne, ELSE INSERT INTO une nouvelle ligne.

Bien sûr, je me connecte d'abord à la base de données et à GET le $name, $email et $birthday à partir de la chaîne d'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'];

Cela fonctionne, mais ajoute simplement la nouvelle ligne;

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

mysqli_close($con);

Voici ce que j'ai essayé

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);

et

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);

et

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);

Mais aucun d'entre eux ne fonctionne, qu'est-ce que je fais mal?

Toute aide est grandement appréciée!

73
Laurence Cooper
  1. Créez une contrainte UNIQUE sur votre colonne _subs_email_, s'il n'en existe pas déjà une:

    _ALTER TABLE subs ADD UNIQUE (subs_email)
    _
  2. Utilisez 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)
    _

Vous pouvez utiliser la fonction VALUES (nom_colonne) dans la clause UPDATE pour faire référence aux valeurs de colonne de la partie INSERT de la commande INSERT ... ON DUPLICATE KEY UPDATE - dev.mysql.com

  1. Notez que j’ai utilisé des espaces réservés aux paramètres à la place des littéraux de chaîne, car un en réalité devrait utiliser des instructions paramétrées pour se défendre contre les attaques par injection SQL .
184
eggyal