質問: 極めて初心者らしい質問になりますがよろしくお願いします。 Webシステムはステートレスとよく言われますが、PHP側の検証が成立せずDBへの登録が進行できなかった場合、送信されてきた状態の画面を維持したい、ということがあると思います。 逆に、DBへの登録まで成立した場合は(他へ遷移せず当該画面で継続して処理していくケース)、 入力されていた内容のほとんどをクリアして画面を再表示したい という仕様を望んでいます。 送信結果を再格納するケースと、送信結果を再格納しないケースに大別できますが、一般的にはどういう解決策で、制御すべきなのでしょうか? 下記は送信された結果を変数に蓄え、それを再格納するようなHTML&PHPです。 ・この仕様では、画面上の項目数分 変数を用意しなければならない。 ・正常にDBへの登録へ進行した場合、これら変数をクリアしなければならない。 ``` ``` と思いました。こういう達成の仕方が一般的なのでしょうか? セッション変数を使うにしても、維持とクリアの制御が必要ですよね?? フレームワークを使わない場合、どういった対策をとるのが一般的なのか知りたいです。 よろしくお願い致します。 <<追記>> $dataに蓄えたい内容は、この中のinput要素 ``` 得意先 納品先 + - + - ```
回答: javascriptでajaxを使って画面を残したままデータを送信して、非同期で処理をさせることで実現可能です。 処理の成否をajaxの結果としてクライアント側に返却し、その結果の内容をjavascriptで確認します。 処理の結果が失敗であれば画面上に失敗を示すメッセージを表示させてそのままにすることで、入力内容はリセットされることがありません。 処理の結果が成功であれば、javascriptで画面をリロードするなどして入力をクリアします。 ajaxは非同期で通信するので、送信ボタンを連打したらその数だけリクエストが飛びます。 送信ボタンが押されたらボタンを無効にするか、画面全体を処理中の画面でオーバーラップするなどでボタンの連打を阻止する必要があります。 この方法をとることのメリットとして、POST後の画面で画面を更新するときに情報の再送信を求められることがないという点もあります。 ・参考)JavaScriptが禁止の場合 最近はあまり聞かないですが、一昔前にJavaScriptの利用が禁忌とされている時代がありました。 その頃でもセッション変数は利用せずに、自身にPOSTして失敗した場合はリクエストの処理後に、送信されてきたデータを利用して画面を再構築していました。 成功した場合はHTTP HeaderのLocationを利用して成功後の画面に遷移させていました。 リクエストの内容を保持するためにセッション変数を利用するとセッションが肥大化したり、画面を直接消すなど、イベントの取れない操作をユーザーがしたときに前に入力していたデータが復活してしまうなどの不具合に悩まされてしまうことがあります。 いかがでしょうか?