wake-up-neo.com

SQL - WENN EXISTS UPDATE ELSE INSERT INTO

Was ich versuche, ist INSERT Abonnenten in meiner Datenbank, aber IF EXISTS es sollte UPDATE die Zeile, ELSE INSERT INTO eine neue Zeile.

Natürlich verbinde ich mich zuerst mit der Datenbank und GET dem $name, $email und $birthday aus der URL-Zeichenfolge.

$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'];

Dies funktioniert, fügt jedoch nur die neue Zeile hinzu.

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

mysqli_close($con);

Folgendes habe ich versucht:

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

und

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

und

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

Aber keiner von ihnen arbeitet, was mache ich falsch?

Jede Hilfe wird sehr geschätzt!

73
Laurence Cooper
  1. Erstelle eine UNIQUE Einschränkung auf deinem subs_email Spalte, falls noch nicht vorhanden:

    ALTER TABLE subs ADD UNIQUE (subs_email)
    
  2. Verwenden 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)
    

Mit der Funktion VALUES (col_name) in der UPDATE-Klausel können Sie auf Spaltenwerte aus dem INSERT-Teil des INSERT ... ON DUPLICATE KEY UPDATE - dev.mysql.com verweisen

  1. Beachten Sie, dass ich anstelle von String-Literalen Parameter-Platzhalter verwendet habe, da man eigentlich parametrisierte Anweisungen verwenden sollte, um gegen SQL-Injection-Angriffe zu verteidigen) .
184
eggyal