• 締切済み

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

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

  • hepin
  • お礼率40% (8/20)
  • PHP
  • 回答数5
  • ありがとう数8

みんなの回答

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

  • セッション使用時のフォームのデータ

    PHPでsession_start();とした後のフォームで、その後にフォームで入力したデータをPOSTで送って確認画面を表示したとします。 ここで、最初のsession_start();がなければ、ブラウザの戻るボタンで前のフォーム入力画面へと戻っても、入力したデータは保存されたままですが、session_start();とした後では、入力したデータが全てクリアされてしまうようです。 ちょっと修正したい時に、すべてクリアされてしまうとかなり不便なのですが、何かよい方法はないものでしょうか?セッション変数にPOSTするデータを保存する以外で方法はないものでしょうか?

    • ベストアンサー
    • PHP
  • インラインフレーム内のセッション

    通常のHTMLファイルのインラインフレーム内に、別サーバーからPHPファイルを取得して表示しています。 そのPHP自体は簡単なアンケート(フォーム→入力内容確認→送信)なんですが、このフォーム→入力内容確認の遷移がうまくいきません。 セッションでフォーム内の値と送信ボタンの値(sub)を保持し、確認のファイルに if(@$_SESSION['sub']!=TRUE){ header("location:form.php"); exit(); }else{ (以下略) } と記述することで、もしURL直打ちの場合はフォームの入力画面に飛ばされるようにしてあるのですが、インラインフレームの中でフォームに入力して送信ボタンを押すと、強制的に同じ画面に戻ってしまうのです。 直接ブラウザで該当のPHPを見たときは、何の問題もなく動くので、プログラム自体にエラーがあるわけではないと思うのですが・・・。 どうも確認ファイルのif(@$_SESSION['sub']!=TRUE)で、セッションがうまく保持されていないためにheaderで飛ばされてしまっているらしいのですが、インラインフレーム内でセッションを利用するときはどうすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • セッションを使わずに遷移先画面に変数の値を渡すには?

    <input type="hidden" value="myID">みたいな隠しフォームで 行く先々の画面に値をPOSTで渡してきました。 他方、 header("Location: mypage.php") のように画面を遷移させる場合、遷移先の画面に $_POST["myID"]のように値を渡すことはできませんか? この場合session_start();を使って、$_SESSION["myID"]のように値を 渡す(保持する)のが王道なのでしょうか? セッションと聞くと何かとトラブルになりやすそうなイメージがあり、 できれば使いたくないのです。 具体的に説明しますと、前にこの掲示板で教えていただいた、次の例を使っています。 入力文字チェックをかけたいのでPHP_SELFで同じ画面を呼び出して、 問題なければmypage.phpにリダイレクトさせる枠組みですが、 header("Location: mypage.php");という風に遷移した場合は、 遷移先のmypage.phpでは、$_POST["myID"]はPOSTされてきませんよね (値を受け取れませんよね)?? 妙案あればご教示下さい。 <?php if ($_POST["reg"] == "" ) $errFlg = true; if (!$errFlg) {     if (strlen($_POST["myName"]) > 30) {       $errFlg = true;       $errStr["myName"] = "30字以下";     }   $errMsg = "エラー!!"; } if ($errFlg) { ?> <html>   <body>     <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>">       氏名 <input type="text" name="myName" value="<?= $_POST["myName"] ?>"><?= $errStr["myName"] ?>       <input type="hidden" name="myID" value="<?= $_POST["myID"] ?>">     </form>     <input type="submit" name="reg" value="登録">   </body> </html> <?php } else {     $sql = "update mytable set myID = 'xxxx'";     $rst = mysql_query($sql, $con);     header("Location: mypage.php"); } ?>

    • ベストアンサー
    • PHP
  • IFRAME内PHPのセッション変数取得が出来ない

    既存のHTMLサイトに一部機能追加したいだけ+ブラウザに表示されるURLの関係で、必要部分だけIFRAMEでPHPサーバーのファイルを呼び出して表示させようと考えました。 IFRAMEを記述するHTMLファイル設置サーバーはPHPが使用出来ません。 <iframe src="http://hogehoge/login.php"></iframe> とHTML内にログイン用PHPを表示させ、ボタン押下でログイン判定 →データをセッション変数にセット →header("Location: http://hogehoge/form.php");で画面遷移 →フォーム用PHPに先ほどセットしたセッションデータ表示 とこんな感じの処理がしたいのですが、これがFireFoxだとうまく動くのに、IEだと動いたり動かなかったりします。(動く=開発環境である私のPC、動かない=他全て) ボタン押下で自分自身にPOSTしたデータは正しく受け取って画面遷移まで処理しているのですが、遷移後のページでセッション取得しようとすると取得出来ないようなのです。 IFRAMEを通さず直接URL叩いた場合は、FF・IEどちらも正常に動いています。 session_name('hoge'); session_start(); はPHP先頭に記載してあります。 IFRAMEを使用して外部サーバーのPHPを使用する際に、気をつけねばならない事などがあるのでしょうか… もし解決方法に思い当たる方がいらっしゃいましたら、どうかご回答宜しくお願いいたします。 またもし補足等必要でしたらご指摘下さい。

    • ベストアンサー
    • PHP
  • ページを遷移せずにデータ送信

    はじめまして。こちらのカテゴリに質問投稿するのは初めてです。 投稿カテゴリが適切かどうかさえも不明ですが、お知恵を拝借したく投稿させて頂きます。 表題の通りですが、SNSなどに多く使われている、コメントを投稿する際、ページを遷移することなくフォームのデータを送信し、そのデータをMySQLに登録するとった流れを考えています。 http://shun-ichiro.com/log/reminder/php-jquery-ajax-mysql/ 上記サイトは、フォーム上のデータではなく、ボタンを押した際に決まったデータをDB内に登録する者ですが、データ処理という意味での流れは理想に近く、上記サイトでサンプルとして配布されているものをテストしているのですが、このページ上にテキストフォームなどを加えた場合の処理が、お恥ずかしながら一向に見えてこないのが現状です。 上記ページを例にした場合、テキストフォームを設置し、そのデータをDBに登録するための、post.js はどのようなスクリプトとなるのでしょうか? PHPはこれまで触ってきましたが、Ajax?Javascript?を触るのは初めてといっていい程で、色々と調べながら今日まで来ましたが、適切なキーワードさえも不明で、欲する情報になかなか辿り受けない状況です。(もうかれこれ1週間以上思考錯誤しています・・汗) お忙しいなか恐縮ですが、アドバイスのほど宜しくお願い致します。

    • ベストアンサー
    • AJAX
  • ブラウザの戻る ページ遷移PHP処理

    ブラウザの戻るボタンを押下されたときの、SESSION変数の処理について考えています ページが遷移する前に処理を行うということはできますか?

    • ベストアンサー
    • PHP
  • セッション PHPとHTML

    form1.htmlのaction先にorder.phpを指定し、そのorder.phpで$_POSTを使ってform1.htmlのフォーム情報を取得します。その後、order.phpはheader(Location)でform2.htmlをブラウザ上に表示させます。 form2.htmlはaction先が同じorder.phpになっており、ifで動作を制御しています。form2.htmlのsubmitボタンを押すと、画面上にorder.phpにより、今まで2つのフォームで入力した内容が表示されます(order.phpはsessionですべての変数を保持しています)。 この時「form1の内容を訂正」「form2の内容を訂正」というリンクないしボタンを設けて、該当フォームに飛べるようにしたいのです。 このリンク/ボタンで該当フォームに飛んだ場合、入力内容がフォームに表示されるようにするには、どのようにすればいいのでしょうか? いまいちsessionの詳しい使い方が分からなくて困っています・・・。

    • ベストアンサー
    • PHP
  • フォームを作る際にsessionを使いもしページが元のページへ戻った際

    フォームを作る際にsessionを使いもしページが元のページへ戻った際も値を保持できるようにしたいのですが作り方が分からないので教えて頂けますか??? 具体的には textの場合は<input type="text" name="hoge" value="<?php $_SESSION["hoge"]?>">とすればいいのはグーグルなどで調べ理解できましたが、selectボックスやradioボタンcheckボタンのしたかが分かりません。お手数おかけしますがよろしくお願いします。

    • ベストアンサー
    • PHP
  • php セッション 戻る時に消える

    php セッション 戻る時に消える お世話になっております。 ページ遷移においてデータの受け渡しをセッションを利用して行っております。 「入力ページ」⇒「確認ページ」⇒「完了ページ」 確認ページでpostデータをセッションに格納しております。 そこで質問です。 「入力ページ」⇒「確認ページ」⇒「入力ページ」の場合、確認ページでセッションに格納しているデータを、 入力ページに戻った段階で呼び出すことは可能でしょうか。 そもそも戻った場合はセッションは消去されてしまうのでしょうか。 ちなみに、「入力ページ」はhtmlですが、phpを使用できる状態にしてあります。 色々と検索したのですが私の力不足で該当する内容にめぐり合えませんでした。 お力をお貸しください。

    • 締切済み
    • PHP
  • 携帯サイトでsessionは使用可能か

    HTML・PHPで3キャリア対応携帯サイトを作成しているのですが、session_id()などのセッション関連は携帯サイトでも使用できるのでしょうか? 例えば、ログインページで入力フォームの値(IDとパスワード)をsesession_id()で次のページに渡す際(header("Loca"))、PCのブラウザ(IE)では値を渡せ、かつ、次のページに進んだのですが、i-modeのエミュレータ(imodetool)では、次のページに移らず、ログイン画面に戻ってしまいます。 なお、ソースは以下のように記述しています。 if($_POST["name"] == XXXX) { session_start(); $_SESSION["user_id"] = $_POST["name"]; header("Location: http://xxxxxxxx.php?id=". session_id()); exit(); } お手数ですが、回答頂けると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう