質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

1回答

1274閲覧

Laravel 2ページに渡って入力フォームがある場合のバリデーションとリダイレクト処理について

ppphysiccc

総合スコア20

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/05/22 06:10

編集2019/05/22 07:30

お世話になっております。

表題の通りなのですが、Laravelで

情報入力ページ → 画像アップロード画面 → 確認画面 → 完了画面

という4つのページを作成しています。
バリデーションはFormRequestを使っていて、Controllerの引数にTestFormRequest $requestとして機能させています。

1.情報入力ページへはURLでのアクセスで http://aaa.com/?test=123 のような形でアクセスし、
testの値によってバリデーションをかけています。test= のように消したら「見つからない」、 test=aaaaaのように文字列にしたら「不正」と出しています。
時々URLを直接実行するとtestがないとバリデーションに引っかかるときがあります。リロードすると治ります。
入力ページには名前とメールアドレスの入力フォームがあり、必要項目を入力するとボタンが表示されてpostで画像アップロード画面へデータを送信します。

  1. 名前とメールアドレスのバリデートはここで実行していて、もし不備があれば一つ前のページにリダイレクトされます。

FormRequestの機能で自動的にwithErrorsとwithInputが生成され、自動的に1つ前のページに戻るようになっています。

  1. 問題がなければ画像をアップロードフォームが表示され、同じくバリデートでjpegやgif,pngを判定して、確認画面へ飛びます。

pdfをアップロードしたり、画像以外をアップしたり、問題があれば、1つ前の「画像アップロード画面」へリダイレクトし、再度画像の選択を促します。

しかし、画像アップロード画面へリダイレクトされた時点で、POSTデータが消えてしまうので、バリデートを行うデータが空になってしまって続けてバリデートエラー、
さらに「前のページ」にリダイレクトするがPOSTデータが空なのでバリデートエラー。また確認ページへ飛び、リダイレクトしてアップロード画面へ…
の繰り返しで無限ループになってしまいます。

POSTデータを受け渡そうとしてSession::putなどを使ったりしていますが、storage/framework/session以下に作られるデータを見ても、中に登録したデータが書き込まれておらず、結局更新したらデータが消えてしまったりします。

上記のようなページではどのように構成するとよいでしょうか?
少しややこしいので以下に質問内容をまとめさせていただきます。

☆時々URLを実行すると「testがない」とバリデーションに引っかかるときがあるのはなぜ?リロードすると直る。
☆リダイレクトしてもデータをやり取りするには?

情報の過不足があれば追記させていただきますので、ご教示お願い致します。

追記:
新たに作成したFormRequestクラスに以下を追加して、大元のFormRequestのvalidationDataを上書きし、
このようにしてみました。
$this->all()にバリデーションデータが入っており、これをrules等のその後の処理に送るそうなので、ここで空になっているかどうかをチェックし、
リダイレクト前のページで格納したwithInputをSession::get('_old_input');で取得してみました。

PHP

1 protected function validationData() 2 { 3 $data = $this->all(); 4 5 if(empty($data)){ 6 $data = Session::get('_old_input'); 7 8 if($data === null){ 9 $data = []; 10 } 11 } 12 }

こちらだとリダイレクトされたばかりの状態だと挙動としては問題なさそうでした。
しかし、1回目だけ問題ない状態で、この状態でリロードするとSessionからもデータが消えてしまうので
データを取ることができず、だめでした。
引き続き回答をお待ちしております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

上記のvalidationDataに

PHP

1 $data = $this->all(); 2 if(empty($data)){ 3 $data = Session::get('_old_input'); 4 if($data === null){ 5 $data = Session::get('aaaaaaa'); 6 }else { 7 Session::put('aaaaaaa', $data); 8 Session::save(); 9 } 10 }

コントローラ側で

PHP

1$_request = $request->validated();

として受け取ったところ動くようになりました。

投稿2019/05/22 08:33

ppphysiccc

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問