- ベストアンサー
【PHP】SESSION変数の競合を避ける方法は?
PHP5使用者です。 SESSION変数は同一サーバーなら共通のものと見なされるのでうっかり単純に $_SESSION['step'] などとつけてしまうと関係ないシステムの変数と競合するおそれがあります。 こういった問題はベテランの方はどう処理しているのでしょうか。 都度 $_SESSION['step_sys01'] などとするのも煩わしいと思いますし… なにかいいアイデアありましたらよろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
no.2の回答者の方は何かひどく勘違いされているようですが、 PHPを使っていて質問者さんのような状況はよくあることですね。 で、やはりsession_name()にて分けるべきでしょう。 ある一つのシステム(スクリプト)で共通して読み込むincludeファイルがあるなら、そこにsession_name()を使って任意のセッションネームを設定しておけば一番簡単ですね。
その他の回答 (6)
- maenet1972
- ベストアンサー率68% (26/38)
No5ですが、 session_name('a')は$_SESSION['var'] = 10 session_name('b')は$_SESSION['var'] = 20 これをccc.phpで利用したいのであれば、setcookie()を使えば いいのではないでしょうか? session_name()=session_id()を持ち運びさせないのであれば、 ユーザー側のクッキー設定に委ねられますので、もしユーザー側のクッキー設定がoffならセッションも継続できない事になりますので。 もちろんsession_name()=session_id()をhiddenやURIで常に持ち運びさせるのであれば、逆にsetcookie()を使うのは避けた方がいいと思います。
お礼
結局多次元配列でやることにしました。 お世話になりました!
- nick9090
- ベストアンサー率26% (102/378)
そのような場合は、 A) 「aaa.php」にて session_name('test'); session_start(); $_SESSION['a'] = 10; B) 「bbb.php」にて session_name('test'); session_start(); $_SESSION['b'] = 20; ・・・としておき、「ccc.php」にて session_name('test'); を実行すれば、$_SESSION['a']や$_SESSION['b']の値が使えます。 もちろん用途に応じて多次元配列にしてもいいですし。
お礼
今回は勉強になりました。 ありがとうございました。
- maenet1972
- ベストアンサー率68% (26/38)
質問の意図が外れていたらゴメンナサイ。 例えば、"山田太郎"というユーザーさんがログインしたとします。 $_SESSION['user']['name']="山田太郎"となります。 この時のsession_name()を"UID"としたとします。 次にお問い合わせフォームでは、session_name()を"FID"とした場合には当然$_SESSION['user']['name']は空の状態になります。 質問者さんはこの辺りは理解出来ていらっしゃると思いますが、同一セッション内で変数の競合を避けたい場合だと、完全に変数を分けるしかないと思います。ですが、メンテナンス性を考えた上で変数をわかりやすくしておけば、そんなに難しく考えなくていいのではないでしょうか? ちなみに私は素直に多次元配列で区別させちゃってます^^;
補足
ありがとうございます。 もし、ANo.4 の補足の内容が無理であれば確かに多次元配列がいいような気がしてきました。 同じページでの実行がありえないシステム同士ならsession_name()で単純明快にOKですが、同一ページで互いのシステムが同居するかもしれない、となると $_SESSION['user']['name'] 方式のほうが無難なような… その都度変数の重複にびくびくしながら作業というの大変ですし。 でも、session_nameが同じだとsession_destoroy() は使いにくいですね。全部消えちゃうので。
- nick9090
- ベストアンサー率26% (102/378)
No.3の者です。 セッション・ネームは同じでも、セッション変数を複数用意すればOKです。 たとえば、ログイン・フラグを$_SESSION['login']に格納して、 問い合わせシステム用のフラグなりデータなりを$_SESSION['toiawase']などとすれば良いと思います。 おそらくセッション・ネームとセッション変数の区別がごっちゃになって理解されているように見受けられますので、一度リファレンスをしっかり読んでみることをおすすめします。
補足
すみません。具体的に書くと、 A) 「aaa.php」にて session_name('a'); session_start(); $_SESSION['var'] = 10; B) 「bbb.php」にて session_name('b'); session_start(); $_SESSION['var'] = 20; とした場合、 「ccc.php」にて、同時にこれら10、20の値を取得できるんだろうか? という疑問でした。(はじめの質問からずれてしまい申し訳ないのですが…)
- inu2
- ベストアンサー率33% (1229/3720)
同一のシステム(ハードウェア上)で全く関係ない別なシステム(ソフトウェア)を動かすって事自体が間違っているかと・・・ 予算の関係で別サーバーを用意できないのであれば 使用しているSESSIONの一覧を作る ネームスペース的なものを使う 例えば、 $_SESSION[機能名][パラメーター名] とかしておく $_SESSION["user"]["step"] と $_SESSION["cart"]["step"] 見たいな感じ
補足
いや、何種類かの似たような書き込みフォームを同じサイトに配置するのはありかと…
- kiyominmin
- ベストアンサー率50% (2/4)
session_name(); で、回避してます~。
補足
なんと! 意外とあっさり解決で反省… いろいろググったはずなんですが。 ありがとうございました。
補足
ありがとうございます。 ちなみに同一のファイル(ページ)内で2つの違う名前のSESSIONを同居なんて無理でしょうかね? 例えば会員認証(ログイン)システムのPHPを全てのページに設置、それに加え一部のページに問い合わせシステムも置くとなると同じページに2種類の違うシステムがあるわけで、さすがにこれは同じ変数名じゃ無理かな… と予想しています。 たびたび申し訳ありませんがよろしくお願いいたします。