PHPのリロード対策を誤っていました!

ブラウザーの更新・移動ボタンをクリックすると、フォームデータの再送信をするか確認が表示される場合がある。

原因は、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>

コメントを残す

メールアドレスが公開されることはありません。

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください