(2023.4.10 記)
「リロード(再読み込み)による重複送信をなくして欲しい」という要望を実装た時の忘備録です。
本来はそうならないようなページ構成にすればいい話なのですが、そうできない理由を冒頭で話すと煩わしいのでこれは後述の経緯で述べています。
実走方法は色々ありますが、今回はPHPのみで実装できる簡潔な方法を使いました。
詳細は以下にて説明しています(初、中級者向け解説)。
(全行程の所要時間:コピペで終わり)
0.実行環境
■実行環境
・さくらVPN(メモリ:1GB、CPU:2コア、SSD:100GB)
・LinuxOS:Ubuntu18.04
・Apache:2.4
・MySQL:5.7
・PHP:7.2→7.4(2024.9.11)
1.実装方法
経緯
「Formを別ページに飛ばし、そこでPOST処理した後同じページに留まる。」という仕様が前提にあります。
そこで再度ページを開くと自動リロードされて、同じ内容がPOST処理されてしまうという状態を解消したいという相談内容でした。
当初は、POST処理後にPOSTの中身を「Null」で置き換えていたのですが、リロードの際に一番最初に読み込まれていたPOSTの中身を参照するようで、意味がありませんでした。。。
セッションやスクリプトで対応もできるのですが、「PHPのみ」という制約があったので、次のような対処を行った次第です。
実装
ソースの一番上に、以下のコードを記載。
//POSTリクエストが来たらPOST処理は一度だけ行う //①POSTの中身が入っているか if(isset($_POST['mailsendflg'])){ //②POSTの中身があれば、中身を変数に代入 $mailsendflg = $_POST['mailsendflg']; } else{ //③なければ初期値として0を変数に代入 $mailsendflg = 0; } //④POST(GET)の中身があるか if($mailsendflg != 0){ //⑤中身があればPOST処理 POST(GET)処理(例:DB保存とかCSV保存とか) } //⑥ページリクエストがPOSTだった場合 if($_SERVER['REQUEST_METHOD'] == 'POST'){ //⑦同じページに直接ジャンプ hader("location: 同ページのURL"); exit(); } ⑧以降HTMLやPHPなどの描画処理
これだけ。
説明
流れとしては・・・
1.Formで一番最初にこのページに来た時
※POSTのデータを抱えた状態です
①→②→④→⑤→⑥→⑦ と処理をし、指定したURL(自ページ)へ
2.1.によって2回目読み込まれた時
※Form送信されていないので、POSTのデータは抱えていない状態です
①→③→④→⑥→⑧ と処理し、重複してPOST処理されることなく、本来表示したいページ内容が表示される次第です。
POST情報を抱えていないので、いくらリロードしてもPOSTは送信されません。
2.最後に
冒頭で書いた通り、色々問題を回避するように書くのが理想ではあります。
修正要望などは、既存の要件を損なわないようにしなければならないので、結構頭を抱えることがあります。。。
ピンポイントで悩んでいる方のお役にたてたら幸いです。
以上。
(不明点あればコメント頂ければ、可能な限りお答えします。)
▼オススメ教本▼
コメント