ブラウザーの更新・移動ボタンをクリックすると、フォームデータの再送信をするか確認が表示される場合がある。
原因は、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>