web-dev-qa-db-ja.com

SQL-UPDATE ELSE INSERT INTOが存在する場合

私がやろうとしているのは、データベースのINSERTサブスクライバーですが、IF EXISTSそれはUPDATE行、ELSE INSERT INTO新しい行でなければなりません。

もちろん、最初にデータベースに接続し、URL文字列からGET$name$email$birthdayに接続します。

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

しかし、それらのどれも動作しません、私は何を間違っていますか?

どんな助けも大歓迎です!

73
Laurence Cooper
  1. subs_email列に UNIQUE制約 を作成します(まだ存在しない場合):

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

UPDATE句でVALUES(col_name)関数を使用して、INSERT ... ON DUPLICATE KEY UPDATEのINSERT部分の列値を参照できます- dev.mysql.com

  1. 1つreallyがパラメーター化されたステートメントを使用して SQLインジェクション攻撃から防御する必要があるため、文字列リテラルの代わりにパラメータープレースホルダーを使用していることに注意してください
184
eggyal