セッションを用いたデータの変更、反映

このQ&Aのポイント
  • セッションを使用して会員管理システムを構築していますが、ポイントの加算・減算処理を行った場合に、最新のデータがブラウザに反映されない問題が発生しています。
  • セッションIDを書き換えても解決しないため、クライアントサイドのスクリプトが必要かどうか悩んでいます。
  • PHPのみで解決できる方法があれば教えていただきたいです。
回答を見る
  • ベストアンサー

セッションを用いたデータの変更、反映

お世話になります。 セッションを使用して会員管理システムを構築しているのですが、管理システムの中に ポイント計算システムを導入しています。 会員登録 ~ 商品の購入 ~ ポイントの加算・減算・利率等のコアな箇所のプログラムは 思い通りに走りました。 しかし、ポイントの加算・減算処理を行った場合、データベースには計算後の値が入るのですが、 セッションを使用しているため、一度ログアウト( セッションを破棄 )して再ログインをしないと 最新のデータ( ポイント )がブラウザへ反映されず悩んでいます。 セッションIDを書き換えれば何とかなるかもと思い、 session_regenerate_id(true); も設置してみましたが、挙動は変わりませんでした。 ( リンクをダブルクリックしまくるとセッションが切れるくらいです。 ) クライアントサイドのスクリプトが必要になるのでしょうか? PHPのみで解決できる方法がございましたらご教示いただきたく存じます。 ---------------- ■スペック PHP 5.1.6 MySQL 5.0.95 ----------------

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

結論から述べると、セッションに「ユーザーID」以外のデータを格納しようとしているから困っているのです。セッションには「ユーザーID」だけを格納し、それ以外の情報は毎リクエストごとにデータベースからとってきて表示させればいいのです。 一連の質問が参考になると思うので確認してみてください。 http://okwave.jp/qa/q8326234.html http://okwave.jp/qa/q8333166.html http://okwave.jp/qa/q8333900.html http://okwave.jp/qa/q8345886.html http://okwave.jp/qa/q8351885.html

nazal2010
質問者

お礼

ご回答をいただき、ありがとうございます。 仰る通りです。実は、「 商品をカートに入れる 」為のテーブルも構築しておりまして、 会員を識別するため「 会員ID 」を引数にしてセッションでひも付けして 各ユーザ毎に異なる挙動( 反映 )を行っていたにも関わらず、全く気付きませんでした。。。 要するに「 ポイント 」データをセッションに格納するのでは無く、セッションIDからひも付けして 該当のユーザのポイントデータをselectしてやれば良いのですね。 先ほど手直しをしたら数分で組みあがりましたw 本当にありがとうございました。正直かなり悩んでいました。

関連するQ&A

  • 「セッション管理用のクッキーに secure 属性をつける」についてで

    「セッション管理用のクッキーに secure 属性をつける」についてですが、 具体的には、 <?php session_start(); session_regenerate_id(TRUE); ?> とあった時に、どのようにコードを加えれば良いのでしょうか? ご教授、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 困ってます。phpセッションについて

    phpセッションについて教えてください。 既にwebサーバで動いているシステムがあります。 改修する必要があるため、パソコンの仮想サーバ(XAMPP)で動かした所、セッションに関わる部分がうまくいきません。 ●保存してる箇所 session_start(); session_regenerate_id( TRUE ); $_SESSION['xxx'] = $xxx; ●呼び出している箇所 session_start(); session_regenerate_id( TRUE ); if ( !isset( $_SESSION['xxx']) ) { //←ココでひっかかります //終了するための処理 exit; } $xxx = $_SESSION['xxx']; ************** 設定に関する部分です。 ●「.htaccess」の設定は以下のようにしています。 php_flag session.use_cookies On php_value session.cookie_lifetime 0 php_flag session.use_trans_sid Off php_value session.gc_maxlifetime 3600 php_value session.save_path 'C:temp' 'C:temp'に保存されたデータはありますので、書き出しはうまくいってるようです。 呼び出しがうまくいってません。 ソースの session_start(); session_regenerate_id( TRUE ); の直後に var_dump($_SESSION['xxx']); で値を参照するとNULLです。 ●「php.ini」のセッションの箇所は以下のようになっています。 session.save_handler = files よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのセッションについて

    検索フォームから値を受け取り、該当するデータを表示するプログラムを作っているんですが、 session_regenerate_idを使ったセッション管理で行き詰っています。 session_regenerate_idを使うと1ページずつ進んでいく場合は、何も問題ありませんが、 現在のページからタブに複数ページを開こうとすると2つめ以降のタブ(ページ)が表示されなくなります。 おそらくsession_regenerate_idにより1つめのタブが開かれたときに、セッションが書き換えられて、 2つめのタブに正常にセッション変数が受け渡しできていないのが問題と思いますが、どのように解決したらよいのかわかりません。 セキュリティ対策をした上でページ間共有をスムーズに行うにはどのようにすればよろしいのでしょうか。 ちなみにセッションはフリーワード検索のみに使用します。

    • ベストアンサー
    • PHP
  • セッションの有効期限の設定方法とログアウト方法

    会員システムをPHPのセッション管理を使って作っているのですが、 1.セッションの有効期限の時間を変更するためにはsession_cache_expireを使うんだと思うんですが、これは全ページのsession_start()の前に書かないといけないのでしょうか? それとも、ログインするときに必ず通るPHPファイルに書いておけば大丈夫なのでしょうか? 2.会員ログアウトをする場合は、 unset($_SESSION['****']); でログインするときに入れた変数をunsetするだけで大丈夫なのでしょうか? もっと他に一般的な方法があったりするのでしょうか? どちらかだけでもお分かりの方がいれば教えていただければうれしいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • セッションハイジャック(セッション固定化)の対策は必要?

    ・php.ini で session.use_only_cookies = 1 ・フレームワークで XSS 対策(自動エスケープ) を行っている場合、セッションハイジャック(セッション固定化)の 可能性は、ないと考えてよろしいでしょうか? というのも、session_regenerate_id() は、セッションハイジャックの 可能性を、かなり減らせると思うのですが、これを利用すると、 レスポンスが来る前に、ユーザが送信ボタンを再度クリックしたり リロードした場合に、セッションが切れてしまうことが よくあるからです。 そのため、1/5の確立で session_regenerate_id() を起動、 if (mt_rand(1, 5) === 1) {   session_regenerate_id(TRUE); } としてみたのですが、抜本的な対策とは思えません・・・。 XSS対策が完璧で、セッションはクッキーのみの場合、 他にどのような対策が必要でしょうか?ご教示ください。

    • ベストアンサー
    • PHP
  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • セッションについて

    codeigniterで作成を試みているのですが、セッションについてよくわかりません。 DBを用いてセッションを管理しようとしています。 たとえば、会員テーブルを id(auto_increment)で順に登録が増えるとします。 同一セッションで会員のレコードを増えるのを避けたいと考えてセッションテーブルと会員テーブルの紐付けを行うのが必要と考えました。 このとき、セッションテーブルにidを登録するのがいいのでしょうか? それとも会員テーブルにセッションIDを登録するのがいいのでしょうか? 一般的にはどのような設計をするのでしょうか? 初心者ですので、教えてください。

    • ベストアンサー
    • PHP
  • PHP SESSION 設定について

    PHP(レンタルサーバー:5.3.6)(ローカル:5.3.26)を使用しています。 簡単なログインフォームを作っていました。 ローカルでテスト運用したところ、問題なく動作していたのでレンタルサーバーにアップロードしたところ、SESSIONが動いていない(?継承していない?)ことに気づきました。 そこでphpinfoを確認すると レンタルサーバーは、 session.cookie_httponly=1(On) session.cookie_secure=1(On) になっていました。XSS攻撃に全部ではないけどレンタルサーバーの設定だと有効だということなので、ローカルもレンタルサーバーの設定に合わせたいと思っています。 ※設定をoffにすると問題なく動作します。 sample2.phpで、「$_SESSION['sample_title']」が表示されなくなってしまいました。 どのようにすれば、sessionが正しく動作するかご教授お願いいたします。 抜粋スクリプト ■sample1.php session_start(); session_regenerate_id(TRUE); $_SESSION["sample_title"] = "PHPのSESSION"; //セッション登録 echo "$_SESSION['sample_title']に代入した値は「<?php echo $_SESSION['sample_title'] ?>」です。"; echo "<a href = 'sample2.php'>次のページ</a>"; ■sample2.php session_start(); session_regenerate_id(TRUE); echo "受け取ったセッション変数の値は「".$_SESSION['sample_title'] ."」です。";

    • ベストアンサー
    • PHP
  • PHPのセキュリティについて教えてください。

    PHPのセキュリティについて勉強しています。 環境はPHP5を使用しています。 セキュリティの事について詳しく載っているサイトはありますでしょうか。もしあれば、教えてください。 それとセッションハイジャックを防ぐ方法としては、session_regenerate_id()を使用すると良いと知ったのですが、セッションを扱うページすべてのページでsession_regenerate_id()使用し、新しいセッションIDを割り当てをした方がいいのでしょうか?そうしなければいけないと自分でも思うのですが、参考書にはそのように細かいことが載っていなかったため、不安になったため聞かせていただきました。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのセッションについて質問です

    現在、phpのセッションについて学習しています。 開発環境はxamppでMySQLデータベースにPDOで接続しています。 セッションについていくつか質問があります。 セッションを使った認証の流れですが、 ログインフォーム画面で、session_start()し、ログインの認証が成功したらsession_regenerate_idで新しいセッションを発行⇒ログインが必要な画面でセッションの有無を確認 という流れで良いのでしょうか? セッションハイジャック対策にsession_regenerate_idをするようですが、 これは全てのページで毎回行ったほうが良いのでしょうか? セッションIDの受け渡しはcookieに保存する方法とURLに含む方法があり、 セッションハイジャック対策について記述しているサイトではcookieが推奨されている雰囲気ですが、 PHPマニュアル(http://php.net/manual/ja/session.idpassing.php)では信頼性がないとあります。 どちらを使うのが良いのでしょうか? セッションの有無のチェックはsession_start()を記述するだけでサーバーが行ってくれるのでしょうか? $SESSIONにセッションIDを保存してissetで調べるといった記述が必要なのでしょうか? メールアドレスとパスワードでのログイン認証を実装したいのですが、 その場合、マイページでユーザー情報を表示したい際、ログイン時に入力したメールアドレスを$SESSION[email]に格納し、マイページのphpプログラムにて、$SESSION[email]に格納されたメールアドレスを検索条件にしてSELECTで他の情報を取得したら良いのでしょうか? メールアドレスを$SESSION変数で受け渡しするのはセキュリティ上危険でしょうか?(危険であれば内部管理用のユーザーIDを$SESSIONに格納してデータを取得しようと思います。) 基本的なセッションの知識がないため、質問の数が多くなってしまいましたが、 答えられる範囲で良いのでご回答頂けると有難いです。

    • ベストアンサー
    • PHP

専門家に質問してみよう