こんにちは、質問です。
現在趣味で制作しているPHPを利用したシステムで
フォームからDBへ多くのデータを登録する処理を記述しています。
計4Pのページをフォームにより遷移しながら最終ページでデータ挿入をする風に考えているのですが
セッションとPOSTメソッドを使用してデータの引継ぎを行っていると、ブラウザの「戻る」ボタンを押した時に以前のページが有効期限切れとなってしまい、データを戻って入力しなおしたい時に最初からやり直さなければならない状態になっています。
こういった状況を回避するにはどのような手段がスタンダードなのでしょうか?
確かセッションを使用せずにPOSTメソッドのみで行った場合はブラウザの「戻る」ボタンを使用してもデータが保持されていました
よろしくおねがいします
環境はPHP4
MySQL3です!
A 回答 (5件)
- 最新から表示
- 回答順に表示
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"]; ?>">
入力チェック等の処理は省いてますので、適切な箇所に挿入する形にして下さい。
No.4
- 回答日時:
横やりになるかもしれませんが、
POSTで呼び出した中でSESSIONを使って、
なおかつ、何らかをページを表示した場合にこの現象が発生します。
POSTで呼び出してSESSION変数に代入したら、
何も表示させず、header("Location:~~~");で
別のページに遷移させましょう。
GETとSESSIONの併用なら問題ないです。
この回答への補足
ありがとうございます。
フォームでの入力をポスト、それをその先の先のページなどにも配列として引き継ぐ場合にセッションを使っています。
併用はやめたほうがいいのでしょうか?
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)だけで戻るかもしれませんが、一般的には「戻る」用の機能を作りこむと思います。
ご丁寧なご説明ありがとうございます。
手元にあるPHPのリファレンスブックなどを参照しても、私が行っているmust-revalidateという引数がのっていなかったので不安に思っていた所でした
やはり戻るボタンをつける事で対処しようかと思います。
具体的に戻る用の機能を盛り込むというとクッキーなどを使用する形になるのでしょうか?
No.1
- 回答日時:
さきほど似た質問がありました(参考URLを見てください)。
>こういった状況を回避するにはどのような手段がスタンダードなのでしょうか?
参考URLに書いた方法(session_cache_limiter)が、スタンダードな方法なのかは、判りません。
実は「回避しない」というのが、私の中ではスタンダードだったりします。というのは、キャッシュさせないというのは、セキュリティ的にそれなりの意味があってそうなっているからです。
回避しない時は、ブラウザの戻るボタンではなく、画面上に「戻る」ボタンを設けて、それで戻ってもらいます。私はやったことはありませんが、ツールバーを非表示にしたり、画面上で右クリックを禁止したりすると、ユーザが誤ってブラウザの再読込みや戻るボタンを押す可能性は減ります(ショートカットキー、マウスジェスチャーなどでの不正遷移は抑止できないですが)。オンラインバンキングなどは、そうしています。
参考URL:http://oshiete1.goo.ne.jp/qa2656128.html
ありがとうございます。
現状は「session_cache_limiter('private, must-revalidate');」
という処理をページ内のsession_start();前に記述する事により解決しています。
恥ずかしながらこの関数の意味はよく理解できていないのですが・・・
追加で質問になってしまうのですが、戻るボタンなどを表示する形でも前の画面に戻る事が可能なのでしょうか?
その方がナビゲーション的にも良い気がします
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
閉じるボタン「×」を制御したい
-
VBAで重複チェックの仕方を教え...
-
PHPで名寄せするには?
-
PHPでアクセスログ管理システム
-
ログイン画面から入って、「戻...
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
-
DTOとEntityの差は何ですか。
-
バッチファイルでpingの結果を...
-
EXCEL、マクロ-改ページ行番号...
-
fwriteで改行出来ない
-
http://www.なんとか.com/ に...
-
ローカルのコンピュータ名を取...
-
syntax error, unexpected 'ech...
-
php mysql SELECT文でテーブル...
-
バッチファイルで、全てのウィ...
-
開始と終了を指定して、その間...
-
「次の10件を表示する」のよ...
-
phpでcookieがうまく保存されない
-
逆順表示したい?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
POSTで受け渡したものを保存し...
-
cURL関数を使用したphpからのpo...
-
ログイン画面から入って、「戻...
-
IFRAME内PHPのセッション変数取...
-
【ExcelVBA】検索したデータを...
-
フォームを使わずにPOST送信す...
-
php 入力画面から確認表示画面...
-
会員登録システム 仮登録のメ...
-
VBAで重複チェックの仕方を教え...
-
HTMLエスケープすべき場所につ...
-
セッション使用時のフォームの...
-
HTMLエスケープ処理とデーター...
-
PHPで値を保持する方法
-
データベースの登録失敗の時の...
-
asp.netでのセッションを使用し...
-
会員制サイトを作成しました。...
-
ブラウザバックしてもチェック...
-
検索フォームのセッション管理...
-
GETのメリットについて
-
PHPで返信メールにチェックボッ...
おすすめ情報