リロード時の二重送信対策

発生する問題
自分で簡単なPHPを書いて投稿フォームを作った場合、
送信ボタンを押した後、リロードすると「フォームデータ再送信」メッセージが出て二重にデータが投稿される事があります。


問題がおきる理由
この問題はデータ送信後「更新、リロード」処理を行いPOSTのメッセージが再送されるために発生します。


ブラウザの「更新」ボタンは、直前に行ったメッセージを再実行するため、
直前に普通に表示する場合は「GET」が再送され最新のページが取得でき、
直前にデータを投稿していれば「POST]が再送され、二重投稿になります。

二重投稿対策
二重投稿の対策は、ページ遷移による対策、セッションを使った対策、リファラーを使った対策などがあります。

ページ遷移による対策
ページ遷移による対策は、POSTでデータを登録後、header関数を用いて違うページに飛ばす(GETを実行する)ことで対策します。
これで、リロードしても最後に実行されたGETを行うため二重投稿が起こらなくなります。
2009-07-16
問い合わせ完了ページでの二重送信防止法 -過去の投稿で同内容のものが- PHP | 教えて!goo

セッションによる対策
セッションによる対策は、送信時にセッション(クッキー)で投稿の確認をする時にチケットを渡しておいて、DBに登録する際にそのチケットを使用する手法です。チケットを一度使ってしまえば、リロードしてもデータの二重投稿ができないという事になります。
58. すごいリロード対策 | 日経 xTECH(クロステック)
http://d.hatena.ne.jp/p4life/20071021/1192960112


リファラーによる対策
リファラーによる対策は、直前のページをチェックし正しいページから飛んできていない場合は処理を行わない対策です。


どの手法で対策するか
対策方法は以下のページに書いてあるように、端末の使用やサービスの仕様によって、セッションやリファラーがうまく機能しない事があることを考えなければいけません。
ふつうのリロード対策 - to-R
http://cakephp-saboten.blogspot.com/2008/04/blog-post.html
ヘッダー関数を使った対策は一番簡単に実装でき、いろんな端末に使えるためまずはこれで実装してみるのがよさそうです。