• 締切済み

セッション内容が化ける?

PHP初心者です。 次の環境で一種のグループウェアを開発しました。 OS: RedHat Linux9.0 Web Server: Apache2.0.10 DB: PostgresSQL 7.4.2 PHP4.2.2 「ある社員が、ログインしたまま会議に出席し数時間後に戻ってみると、 画面内容が別の社員のものになっている」 という不可解な報告がありました。 調べてみるとログイン時のポータル画面は変化していないのですが、そこから 画面を切り替えて明細表示すると、社員名称が別の社員になっているのです。 しかも明細内容は何も表示されていません。 セッションで取得した内容が化けているのではないかと思っているのですが、 知識不足で行き詰まっています。 php.ini の設定は次のようになっています。(defaultだと思われます) session.save_handler = files session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 100 session.gc_maxlifetime = 1440 session.bug_compat_42 = 1 session.bug_compat_warn = 1 session.referer_check = session.entropy_length = 0 session.entropy_file = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 原因と対処法が分かる方、どうか教えてください。

みんなの回答

  • re13b
  • ベストアンサー率58% (18/31)
回答No.2

一撃で回答へ導くような内容ではないので、大変心苦しいのですが・・・ セッションとして渡される変数の寿命は、お使いの php.ini の情報からすると、おそら くブラウザを閉じるまでは、セッション変数を保持するような状態だと思われます。 変数の寿命を直接的に制御するには、session_unset() とか、session_destroy() があり ますが、unset した状態で変数にアクセスすると変数は空となり、destroy した状態で変 数にアクセスするとエラーが出ると思います。 # エラーオフに設定されているなら、エラーログを吐かせて確認できます。 > 明細表示すると、社員名称が別の社員になっているのです。 > しかも明細内容は何も表示されていません。 とのことですが、【明細表示】上で、社員名称を表示する ID と、明細内容を表示する ID は各々別のものを使っているのでしょうか? それとも、同一の ID を持って表示しているのでしょうか? もし、同じ ID をもって表示しているのなら、『別の社員』の明細が表示されてもいいよ うな気がします。 逆にそれぞれ異なる ID をもって表示しているのなら、明細が表示されないというのは、 名称用 ID はなんらかの値、明細用 ID は空、という状態になっていないでしょうか? セッション変数が化けている、という状況なのか、それとも、受け渡しに失敗して空になっ ているだけなのか・・・この2点を区別したほうが良いような気がします。 サーバー側の 【session.save_path(デフォは /tmp かな?)】 に sess_ で始まるファ イルが出来ていると思います。このファイルに書かれた、正常に表示されているときの値 と、セッション変数が化けた時の値を見比べる、というのも手かもしれません。

catecholamine
質問者

お礼

親身なご教示ありがとうございます。 /tmpにあるセッションファイルを調べてみたところセッション変数が完全にでたらめになっていました。 もう少し調べてみたいのですが、残念ながら出張で時間切れとなってしまいました。いったん質問の方もここで締めさせてもらいます。 本当に色々とありがとうございました。

  • re13b
  • ベストアンサー率58% (18/31)
回答No.1

ログイン.php ↓ ポータル画面.php ↓ 明細表示.php こんな感じの遷移でよろしいでしょうか? もしこれであっているならば、この間で受け渡しされる セッション情報は、なにを渡しているのでしょうか? 社員名称や明細表示に利用する『社員情報』は、何らかの『ID』を もってしておこなっているのでしょうか? 通常、セッションでこの『ID』を渡していくのが、簡単だとは思うのですが・・・ ・ログイン後、数時間経過後に見たら別の社員名称になっている ・明細表示でなにも表示されない とのことですが、もし私の書いたように『ID』を受け渡しているならば ポータル画面.php と、明細表示.php で、異なる『ID』になって しまっているかもしれません。 もしくは、明細表示が出ないということであれば、明細表示.php に 『ID』 が渡っていないようにも見えます。 各ページ/モジュール間で受け渡しされるセッション情報を 開示していただけないでしょうか?

catecholamine
質問者

お礼

早速のご回答ありがとうございます。 お礼が遅くなって申し訳ありません。 画面遷移はご指摘のとおりです。 おっしゃるとおり、セッションで受け渡すのは社員IDなど各テーブルのIDで、これが化けていました。 どうもセッションに寿命があるように思えるのですが、それを制御する方法とかが良く分かりません。