ブラウザーの更新・移動ボタンをクリックすると、フォームデータの再送信をするか確認が表示される場合がある。
原因は、POSTメソッドでパラメータが送信されているため、ページの表示にパラメータが必要とブラウザーが判断するためだ。
PHPでこれを表示させないためには、パラメータをセッション変数に保存し、Location ヘッダーに自分自身を指定して送信するのが一般的だ。
少し前は、以下の様に実装していた。
if ( isset( $_POST[ 'command' ] ) ) { パラメータの処理 ... header( 'Location: ' . $_SERVER[ 'PHP_SELF' ] ) ; exit ; }
しかし、これだと以下のようなフォームでページが呼び出された場合にうまく行かない。
<form method="POST" action="reload.php"> <input type="submit" value="戻る" /> </form>
上記実装では command パラメータが与えられる事を前提としているのに、パラメータは何も渡って来ない。
正しい実装は以下の様にするべきだ。
if ( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' ) { パラメータの処理 ... header( 'Location: ' . $_SERVER[ 'PHP_SELF' ] ) ; exit ; }
さらにHTMLではJavaScriptで送信ボタンを無効化しておくとよい。
<script type="text/javascript"><!-- var submitted = false ; function form_submit() { if ( submitted ) return false ; submitted = true ; return true ; } // --> </script> ... <form name="form_send" onsubmit="return form_submit();"> ... </form>