これはブログです

3DCGとかプログラミングとか

二重投稿を禁止する

下記のようなコードを用意します。

<form action="action.php" method="post">
  <input name="input" type="text" />
  <input name="submit" type="submit" value="決定" />
</form>

submitをクリックして移動した先でページを更新すると再度処理されてしまいます。これが二重投稿、二重サブミットです。

いくつかの対策を挙げておきます。

isset関数とsubmit

移動した先でそのボタンが押されたか確認をします。上記の例を使用すると、下記のコードとなります。

<?php
  if(isset($_POST["submit"])){

    // 押された時の処理

  }else{

    // それ以外の処理

  }
?>

いくつかのsubmitを一つのactionで集約する場合、if~elseifを追加していく。

header関数を使用する

submitのisset内にheader関数を入れ、Locationヘッダを使用することでリダイレクトさせます。サイトの再読み込みを行っても「フォームの再送信」のポップアップは表示されなくなります。

ただし、リダイレクト前の結果、例えば処理に成功/失敗したかの結果をリダイレクト後に引き継がせるには工夫が必要になります。
(リダイレクトされると「issetされなかった場合の処理」に分岐すると思うので)

<?php
  if(isset($_POST["submit"])){

    // 押された時の処理

    header('Location: ./action.php'); // リダイレクト
  }else{

    // それ以外の処理

  }
?>

SESSIONを使用する

postする側で$_SESSIONを設定し、postされる側で$_SESSIONを確認します。

$_SESSIONがあれば処理を行い、$_SESSIONを破棄します。次にリロードされた時には$_SESSIONがないので、別処理をさせることができます。

<?php
  session_start();
  $_SESSION["set"] = "on";
?>

// 中略

<form action="action.php" method="post">
  <input name="input" type="text" />
  <input name="submit" type="submit" value="決定" />
</form>
<?php
  if($_SESSION["set"] == "on"){
    // onの時の処理
  $_SESSION["set"] = "off";
  }else{
    // onでない時の処理
  }
?>


Category :

Tags :


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください