2007年09月02日(日)
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>
Posted by あきら at 19時50分 トラックバック ( 0 ) コメント ( 0 )
トラックバック
トラックバックURL
http://akira.matrix.jp/tb.php?ID=143