CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

通常、PHPで送信フォームなどを組んだ場合に、画面の遷移は
「入力画面」→「確認画面」→「完了画面」
となるのが基本だと思います。
例えば、確認画面から「送信」アクションを発行すると、DBなどに情報を書き込み完了画面を表示するという単純なプログラムを組んだとします。
このとき、完了画面でページリロードをかけられると、再度DBへの書き込み処理が実行され、二重送信となってしまうことがあります。
プログラミング不備の問題ですが、私も結構やっちゃいます。


原因としては「完了画面」にもかかわらずPOSTデータが残っているからです。
処理中にリロードすると
「このページを表示するにはフォームデータを再度送信する必要があります。フォームデータを再送信すると以前実行した検索、投稿や注文などの処理が繰り返されます。」
などのメッセージが表示されますね。

これを防止しようと、POSTデータをクリアするために「完了画面」表示の処理で、

unset($_POST);

とやってみますが、改善されません。理由はわかりませんが、できないものはできないみたいです。。。

調べてみたところ、情報の送信処理後の画面遷移は、静的ページへのリダイレクトを利用するのが一般的みたいです。

/* DB書き込みなどの送信処理 */
header("Location: ./complete.html");

「complete.html」は単なる静的ページなので、何度リロードされても大丈夫です。

しかし、ブラウザで「戻る」ボタンを押して再度送信された場合、この方法では二重押下は防げません。
対応するにはセッションを管理するとかなんとか、ちょっと難しそう。。。

更新:2009/4/6

このエントリーをはてなブックマークに追加

Comment

Monthly Archives

Search