ユーザアクションの一つとして更新ボタン(リロード)を押すアクションがあります。
フォームなどでPOST/GETを使ったプログラムで更新ボタン(リロード)を押すと同じPOST/GETデータが再送されてしまいます。
例でいえばフォームの確認画面と完了画面でしょうか。
プログラム側でリロードか判別できることができないみたいなので、ユニークな値をセッションとPOST/GETに与えて一度、比較した後、セッションのデータを破棄し、リロードした際は比較できないので重複の処理が防げるというわかりにくいというもの。
コード
session_start(); $action = $_POST[ "action" ]; // 分岐 switch($action){ case "confirmation": //確認画面の処理 break; case "finish": //完了画面の処理 //更新対策 値があるかと値が同等かを判定 if (isset($_SESSION['ticket'], $_POST['ticket']) && $_SESSION['ticket'] === $_POST['ticket']) { unset($_SESSION['ticket']); //セッションのデータを破棄 //一度だけの処理 }else{ //header関数とかでフォーム画面に強制的に戻すとかいいかも } break; default: //フォーム画面の処理 初期化 $_POST = array(); $_SESSION = array(); break; }
僕は分岐処理はswitchi派です。色んな分岐があるのでそこはお好みでカスタマイズしてみてください。
参考
PHPプロ!TIPS+ http://www.phppro.jp/phptips/archives/vol21/2