
こんにちは、質問です。
現在趣味で制作している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で質問しましょう!
似たような質問が見つかりました
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
- PHP $_SESSIONに渡した後はそのまま使っても問題ありませんか? 3 2022/11/08 22:17
- PHP 「ログイン機能を持たせる」説明が気難しいです。 2 2022/10/11 02:59
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- HTML・CSS htmlで画面遷移させたい 1 2022/10/28 18:19
- Excel(エクセル) Excel VBAについてです。 少しだけ知識はあるのですが、 うまくいかなかったので 質問させてい 3 2022/09/13 18:40
- PHP PHPのセッション有効期限について 5 2023/06/14 12:40
- au(KDDI) 特定の画面を見るとスマホが固まります ご覧頂き有難うございます。 特定のページを見るとスマホが固まり 1 2023/08/21 19:29
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで家計簿
-
PHPで値を保持する方法
-
php に関して質問です。 各ユー...
-
必須入力項目チェック
-
Dosブロンプトでtabを出力したい
-
コンビニで住民票を取得した場...
-
Yahoo! JAPAN IDを新規取得でき...
-
セッションファイルの有効期限...
-
ミュージックのアートワークを...
-
パソコンの識別
-
syntax error, unexpected 'ech...
-
OpenFileDialogの自作
-
DrawImageでビットマップを拡大...
-
【C#】DataGridViewの最大列数...
-
ファイルの保存先のパス
-
shシェルスクリプト 空白行の...
-
IPアドレスとMACアドレスを取得...
-
$_SERVER["QUERY_STRING"]の仕...
-
アメブロでテーマを指定したRSS...
-
ImmGetConversionListについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで値を保持する方法
-
php history.back()の戻るボタ...
-
「ページネーション」で検索キ...
-
GETのメリットについて
-
ログイン画面から入って、「戻...
-
asp.netでのセッションを使用し...
-
閉じるボタン「×」を制御したい
-
会員登録システム 仮登録のメ...
-
動的にhtmlテーブルを表示
-
htmlspecialcharsについて
-
jspで作った入力フォーム内...
-
ブラウザバックしてもチェック...
-
実装可能できますか?
-
phpによる画像添付メール送信フ...
-
パスワード認証後の、以降のペ...
-
POSTで受け渡したものを保存し...
-
PHP+Mysqlによる会員制サイト
-
セッションを使用したページ遷移
-
HTMLエスケープ処理とデーター...
-
PDF出力
おすすめ情報