問題
フォームの完了画面で再読み込みしても重複送信がされないようにしたい。
解決策
入力画面で特定のセッションキーを持たせて、確認画面、完了画面で、そのセッションキーを持っている場合に処理を行うようにする。
フォームの完了画面の再読み込みによる重複処理を防ぐ。
フォームの完了画面では、その前後でメールの送信処理等が行われています。
そのまま完了画面を再読み込みされてしまうと、同じ入力内容でまた処理がされてしまいます。
今回はそんな場合のために、phpでフォームにセッションを用いて、重複送信を防ぐ方法をご紹介します。
入力画面で特定のセッションキーを持たせて、認証キーとして使う。
- 入力画面で特定のセッションキーを持たせます。
- 確認画面、完了画面で、そのセッションキーを持っている場合に処理を行うようにします。
- 完了画面の処理の最後でセッションキーを削除します。
入力画面で特定のセッションキーを持たせます。
入力画面で特定のセッションキーを持たせます。
入力画面
session_start();
$_SESSION['authkey'] = "ok";
確認画面、完了画面で、そのセッションキーを持っている場合に処理を行うようにします。
入力画面で持たせた特定のセッションキーを、確認画面、完了画面でちゃんと持っている場合に処理を行うようにします。
確認画面
session_start();
if( !empty( $_SESSION['authkey'] ) && $_SESSION['authkey'] === "ok" ){
// 入力画面を通過した場合
}else{
// 入力画面を通過しなかった場合
}
完了画面
session_start();
$nowhost = $_SERVER["HTTP_HOST"];
if( !empty( $_SESSION['authkey'] ) && $_SESSION['authkey'] === "ok" ){
// 確認画面を通過した場合
}else{
// 確認画面を通過しなかった場合
}
完了画面の処理の最後でセッションキーを削除します。
完了画面の処理の最後に「unset( $_SESSION[‘キー’] )」で、セッションキーを削除する処理を付け加えます。
完了画面
session_start();
$nowhost = $_SERVER["HTTP_HOST"];
if( !empty( $_SESSION['authkey'] ) && $_SESSION['authkey'] === "ok" ){
// 確認画面を通過した場合
// 送信処理
unset( $_SESSION['authkey'] );
}else{
// 確認画面を通過しなかった場合
}
ポイント!
- 最後にセッションキーを削除することで、再読み込みをしても特定のセッションキーは持っていないので、持っていない場合の処理に移行させることができ、重複の送信処理を防ぐことができます。
参考ページ
以下のサイトが、より詳しく解説してくれています。
【リロードによる多重投稿を防止する | GRAYCODE PHPプログラミング】
https://gray-code.com/php/make-the-board-vol23/
コメント