ウェブサイトでフォームを設置すると、自ずとぶち当たるリロード問題についてです。
フォームでテキストボックスのデータを送信して同じページへ戻ってくる場合、送信後にリロード(再読み込み)すると多重に送信されてしまう問題です。リロードの度に送信されてしまいます。
フォームに入力されたデータは PHP の場合「$_POST」という変数に格納されて送信先のページへ移動します。「$_POST」のデータは送信後も保持されているわけですから、リロードしたらもう一度送信されるのは仕様です。でもシステム的にはとても困ります。
リロードしたらデータがもう一度送信されてしまいますが、手動で URL をブラウザで入力して同じページにアクセスしリロードするとデータは送信されません。対策としてこれを php プログラミングで実現できないかと思いました。
phpのリロード対策
- データを送信したら「$_POST」を初期化すればいいのでは? → 無理
- データを送信したら javaScript の location href で再読み込み → 無限ループ
色々試してたどり着いたのは、とてもシンプルなコードでした。
POST でデータが送信された場合、1回だけページを再読み込みします。
if ($_SERVER['REQUEST_METHOD'] == 'POST') { header("Location:URL"); exit; }
$_SERVER['REQUEST_METHOD'] はページがリクエストされた際に POST で送信されたか GET で送信されたか判定します。
全てのアクセスで再読み込みされたら困るので POST で送信された場合にのみ再読み込みします。
header 関数でページ遷移します。URL の部分に読み込みたいページの URL を絶対パスで記入してください。
exit で php のプログラムを終了します。
よくあるheader関数のエラー
ページ遷移できる header 関数で上記のようなエラーが出る事があります。直訳すると「ヘッダー情報を変更できません」
これは header 関数を記述する場所が問題です。php の仕様で header 関数は html の出力より前に記述する必要があります。
つまり最初の html タグよりも前に記述する必要があります。