ノウハウ

PHPで簡単にフォームのリロード対策で二重送信を防止する

投稿日:

ウェブサイトでフォームを設置すると、自ずとぶち当たるリロード問題についてです。

フォームでテキストボックスのデータを送信して同じページへ戻ってくる場合、送信後にリロード(再読み込み)すると多重に送信されてしまう問題です。リロードの度に送信されてしまいます。

フォームに入力されたデータは 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関数のエラー

Warning: Cannot modify header information – headers already sent by …

ページ遷移できる header 関数で上記のようなエラーが出る事があります。直訳すると「ヘッダー情報を変更できません」

これは header 関数を記述する場所が問題です。php の仕様で header 関数は html の出力より前に記述する必要があります。

つまり最初の html タグよりも前に記述する必要があります。

-ノウハウ

Copyright© ウェブミスト(Webmist) , 2020 AllRights Reserved Powered by STINGER.