phpでフォームとか作ってデータを送信できた!!!って喜んでるのもつかの間(笑い)、送信ボタンを押した後、リロードすると「フォームデータ再送信」メッセージが出て二重にデータが投稿される事があります。
まー昔からある内容なんですが、ちょっとPHPを弄ってないんで練習がてらひとこと掲示板的なものを作ってのでPHPのリロード対策をして二重投稿を防止しようってことでメモっておこうかと。
原因と対策
なぜリロードによる二重投稿が起こるのか?
ブラウザ更新ボタンをクリックすると直前の動作を再実行するので、直前にデータを投稿していればPOSTメソッドでパラメータが送信されているため、再度POSTが再送されることになり二重投稿なります。
リロード対策
リロードによる二重投稿防止するには、ページ遷移による対策一般的?な気がしますが、今回もその方法です。(笑)
今回は、ひとこと掲示板のようなものを作りたかったので「keijiban.php」をしています。
//postなら処理を実行する
if($_SERVER['REQUEST_METHOD']==='POST'){
header('Location:http://localhost/keijiban.php');
}
全体のプログラムは端折ってますが、「$_SERVER[“REQUEST_METHOD”]」を調べることでPOSTかGETかどちらで要求が来ているかを調べてPOSTだった場合には以後の処理をするようにしています。
その処理の最後に、header関数で自分自身にリダイレクトしています。
ここでちょっとした注意点ですが、header関数でlocationで指定するファイルのパスは絶対パスではないといけません。
なぜheader関数かというと、header関数を用いて違うページに飛ばすとGETを実行するため、リロードしても最後に実行されたのがGET送信になっています。
そのため、下記のように最初にPOSTで実行されたかどうかを判別しているので、たとえリロードしても最後に実行されたのがGETになっているため二重投稿が起こらなくなるという仕組みです。