• 締切済み

セッションを使用したページ遷移

こんにちは、質問です。 現在趣味で制作しているPHPを利用したシステムで フォームからDBへ多くのデータを登録する処理を記述しています。 計4Pのページをフォームにより遷移しながら最終ページでデータ挿入をする風に考えているのですが セッションとPOSTメソッドを使用してデータの引継ぎを行っていると、ブラウザの「戻る」ボタンを押した時に以前のページが有効期限切れとなってしまい、データを戻って入力しなおしたい時に最初からやり直さなければならない状態になっています。 こういった状況を回避するにはどのような手段がスタンダードなのでしょうか? 確かセッションを使用せずにPOSTメソッドのみで行った場合はブラウザの「戻る」ボタンを使用してもデータが保持されていました よろしくおねがいします 環境はPHP4 MySQL3です!

みんなの回答

noname#30334
noname#30334
回答No.5

No.4です。簡単に概略だけを説明してしまっていたので、もう少し具体的に書きます。 入力フォーム(2ページ)→ 登録確認 → DB等への登録処理 の場合を例にします。 [form-a.html] ※入力フォームの1ページ目 (入力項目) ・<INPUT type="text" name="a1" value=""> ・<INPUT type="text" name="a2" value=""> ・<INPUT type="submit" name="Submit" value="次へ"> ↓ ↓ [post2session-a.php] ※1ページ目で入力されたデータをPOSTで受けて、SESSION変数に代入する ※画面表示は、行わず、次の入力ページにリダイレクトする。つまり、HTMLタグは一切なし。 <?PHP session_start(); $_SESSION["sess_a1"] = $_POST["a1"]; $_SESSION["sess_a2"] = $_POST["a2"]; header("Location: form-b.html"); ?> ↓ ↓ [form-b.html] ・<INPUT type="text" name="b1" value=""> ・<INPUT type="text" name="b2" value=""> ・<INPUT type="submit" name="Submit" value="確認画面へ"> ↓ ↓ [post2session-b.php] <?PHP session_start(); $_SESSION["sess_b1"] = $_POST["b1"]; $_SESSION["sess_b2"] = $_POST["b2"]; header("Location: confirm.php"); ?> ↓ ↓ [confirm.php] ※SESSION変数の値で登録確認画面を表示する。 ※登録ボタンで登録処理へ ※修正ボタンで入力フォームに戻す POSTで受信した[ post2session-*.php ]では、画面出力が無いので、 クライアントへ何も送信されず、ブラウザの履歴には残りません。 よって、ブラウザの進む・戻るボタンでの「有効期限切れ」は回避出来ます。 ページを戻った時、既に登録されたデータを保持させる事は、 下記のように、valueにsession値を挿入すれば、可能になります。 <INPUT type="text" name="a1" value="<?PHP print $_SESSION["sess_a1"]; ?>"> 入力チェック等の処理は省いてますので、適切な箇所に挿入する形にして下さい。

noname#30334
noname#30334
回答No.4

横やりになるかもしれませんが、 POSTで呼び出した中でSESSIONを使って、 なおかつ、何らかをページを表示した場合にこの現象が発生します。 POSTで呼び出してSESSION変数に代入したら、 何も表示させず、header("Location:~~~");で 別のページに遷移させましょう。 GETとSESSIONの併用なら問題ないです。

hepin
質問者

補足

ありがとうございます。 フォームでの入力をポスト、それをその先の先のページなどにも配列として引き継ぐ場合にセッションを使っています。 併用はやめたほうがいいのでしょうか?

回答No.3

>具体的に戻る用の機能を盛り込むというとクッキーなどを使用する形になるのでしょうか? フォームの各画面で入力された値を、セッションに保存しているわけですよね? 戻り先で、セッションからデータを引っ張り出して、表示するだけでよいと思います。 あるいは、必要な値をフォームのhiddenに入れておいて、戻るボタンを押した際に、それらの値が戻り先のプログラムに渡るようにしてもよいと思います。

回答No.2

>恥ずかしながらこの関数の意味はよく理解できていないのですが・・・ セッションを使うページは、多くの場合(ログイン後のページなど)何らかのユーザの識別を行なって、動的に生成するページなので、他人に見られては困るものです。ページがキャッシュされた場合、ある状況下においては、他人がそのキャッシュを見ることができてしまいます。 そのため、デフォルト設定のPHPはセッションを使うページのキャッシュを自動的に禁止します(Expires、Cache-Control、Pragmaヘッダをレスポンスに自動的に付加します)。 session_cache_limiter関数は、セッションを使うページの、キャッシュに関するデフォルトの動作を上書きするものです。privateに設定すると、プロキシのキャッシュは禁止、クライアントへのキャッシュは許可することになります。クライアントにキャッシュされると、同じクライアントPCを他人と共有する際に、他人が情報を参照できる問題が生じます。ただ、多くのサイトでは、そのようなリスクは許容できると思います。 なお、session_cache_limiter('private, must-revalidate')という書き方がいくつかのサイトで紹介されていますが、PHPマニュアルには書かれていない間違った書き方です。少なくとも私の環境では、意図したとおり動作しません。 >戻るボタンなどを表示する形でも前の画面に戻る事が可能なのでしょうか? >その方がナビゲーション的にも良い気がします 画面上に戻るボタンをつけるのが望ましいと思います。 ただ、ボタンを表示するだけでは、当然それは機能しません。 キャッシュをprivateにしておけば、history.go(-1)だけで戻るかもしれませんが、一般的には「戻る」用の機能を作りこむと思います。

hepin
質問者

お礼

ご丁寧なご説明ありがとうございます。 手元にあるPHPのリファレンスブックなどを参照しても、私が行っているmust-revalidateという引数がのっていなかったので不安に思っていた所でした やはり戻るボタンをつける事で対処しようかと思います。 具体的に戻る用の機能を盛り込むというとクッキーなどを使用する形になるのでしょうか?

回答No.1

さきほど似た質問がありました(参考URLを見てください)。 >こういった状況を回避するにはどのような手段がスタンダードなのでしょうか? 参考URLに書いた方法(session_cache_limiter)が、スタンダードな方法なのかは、判りません。 実は「回避しない」というのが、私の中ではスタンダードだったりします。というのは、キャッシュさせないというのは、セキュリティ的にそれなりの意味があってそうなっているからです。 回避しない時は、ブラウザの戻るボタンではなく、画面上に「戻る」ボタンを設けて、それで戻ってもらいます。私はやったことはありませんが、ツールバーを非表示にしたり、画面上で右クリックを禁止したりすると、ユーザが誤ってブラウザの再読込みや戻るボタンを押す可能性は減ります(ショートカットキー、マウスジェスチャーなどでの不正遷移は抑止できないですが)。オンラインバンキングなどは、そうしています。

参考URL:
http://oshiete1.goo.ne.jp/qa2656128.html
hepin
質問者

お礼

ありがとうございます。 現状は「session_cache_limiter('private, must-revalidate');」 という処理をページ内のsession_start();前に記述する事により解決しています。 恥ずかしながらこの関数の意味はよく理解できていないのですが・・・ 追加で質問になってしまうのですが、戻るボタンなどを表示する形でも前の画面に戻る事が可能なのでしょうか? その方がナビゲーション的にも良い気がします

関連するQ&A

専門家に質問してみよう