下記のようなコードを用意します。
<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でない時の処理
}
?>
コメントを残す