質問: 下記のようなformを設置しているlogin.phpがあるのですが、 if($login_username==""||$login_pw=="")のようにサーバーサイドでも入力がない場合に バリデーションをかけてエラーメッセージを吐き出すようにしています。 ここで、本ページ上に諸々の操作をした後にページを更新(リロード)するとの 値がリフレッシュされておらずリロード=submitのような挙動を示していることがわかりました。 本来の動作としては if((/*リロードではなくformをsubmitした場合*/) && ($login_username==""||$login_pw=="")) と言う形で処理させたいのですが、このように動作してしまう原因と解決方法がわかりません。 調べたところ、このような記事を見つけました。 原因はブラウザ側の仕様とされているのですが詳細は載っていなく、また対処法の if($_POST['submit']) { /* 処理 */ header("Location: {$_SERVER['PHP_SELF']}"); exit; } についてもどの要素にname="submit"を設定すれば意図した動作なのかがわからず、解決に至ることができませんでした。buttonタグ等にname="submit" value="XX"等を設定しても、結局リロードがsubmitのような挙動をするので 実際にPOSTでもリロードでも$_POST['submit']は"XX"を返すので意図した動作になりません。 お力添えをお願い申し上げます。 ``` > ログインする メールアドレスとパスワードを記入して下さい'; }/*here*/?> 無料でアカウントを作成する ```
回答: リロードで再送信するのはformの仕様といっても良いです。 この多重送信(サブミット)という現象、よくあるのがセッションを利用した対策です。 「ワンタイムトークンを発行し、そのトークンと照合する」というのが概要。 下記のような記事を参考に対応してみてください。 * さいきょうの二重サブミット対策 * PHPでの二重送信対策が、効いていない?(追記あり)