1. ホーム
  2. mysql

[解決済み] sql - if exists update else insert into

2023-04-04 02:02:20

質問

私が行おうとしていることは 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)
    
    
  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のINSERT部分からカラムの値を参照することができます。 INSERT ... ON の INSERT 部分からカラム値を参照することができます。 重複キー更新 dev.mysql.com

  1. 文字列リテラルの代わりにパラメータ・プレースホルダを使っていることに注意してください。 本当に にはパラメータ化されたステートメントを使うべきでしょう。 SQL インジェクション攻撃に対する防御 .