ホームページ >バックエンド開発 >PHPチュートリアル >SESSION 内の配列が取得される場合と取得されない場合があるのはなぜですか?

SESSION 内の配列が取得される場合と取得されない場合があるのはなぜですか?

WBOY
WBOYオリジナル
2016-06-23 13:55:251066ブラウズ

ログイン後: ユーザーオブジェクト user を SESSION に入れ、次のように $_SESSION['user']['priv'] にアクセスします。場合によってはこれが空であり、アクセスする前に
$user=$_SESSION['user']; を追加する必要がある場合があります。これは $_SESSION['user']['priv'] によって行われます。
私のphpバージョン5.4.22


ディスカッションへの返信(解決策)

配列を抽出せずに$_SESSION['user']['priv']に直接アクセスできる場合があります($user =$_SESSION['ユーザー'])、何が起こっているのでしょうか?
私の php バージョン 5.4.22

取得が失敗した場合: var_dump($_SESSION['user']); データを確認すると、結果は正しいです。その中にデータが入っています。 2段階に分けても入手可能ですが、正面からは入手できません。同じメソッド内では、これを初めて実行することはできません。 2回目からもこのように取得できます。セッションデータは変更されていません。

テストコードを与えた方が良いです

失敗した場合は少なくとも var_dump($_SESSION['user']); の結果を与えてください

テストコードは再現できません。検査はすべて正常です。実際には 2 つのステップが必要です。

まず外部要因を除外しましょう。出力 $_SESSION['user']['priv'] をテストしたときに、最初のアクセスの前にたまたまセッションをセットアップしていなかった可能性がありますか?
再現できない場合は、テストして解決してください

コードが間違って書かれているのではないかと疑ったことはありませんか?

$_SESSION['user']['priv'] = '' ; //priv赋值为空,谁取它都是空!

$_SESSION ライフサイクル デフォルトの時間は 20 分です

明らかに時間を超えています

Yes、Yes、No、ログ、各状況、デバッグに便利です。

取得が失敗した場合: var_dump($_SESSION['user']); データを確認すると、結果は正しいです。その中にデータが入っています。 2段階に分けても入手可能ですが、正面からは入手できません。同じメソッド内では、これを初めて実行することはできません。 2回目からもこのように取得できます。セッションデータは変更されていません。
----------
プログラムを書いたことがありますか?このような問題に遭遇したことはありませんか?私はこれに何度も遭遇しました。

まず外部要因を除外しましょう。出力 $_SESSION['user']['priv'] をテストしたときに、最初のアクセスの前にたまたまセッションをセットアップしていなかった可能性があります。
再現できない場合は、テストして解決してください


親愛なる、問題は常にここにあります。それは 2 つのステップに分ける必要があるだけです。一歩も及ばない。先ほどのテストは再現できません、test.phpを書いても再現できません。
実際の手順は 2 つのステップに分かれていません。結果は正しくありません。非常に安定しています。
----------------
他にも投稿しました。ネット上には私と同じ悩みを抱えている人がたくさんいます。

はい、可能な場合もあればそうでない場合もあり、それぞれの状況をログに記録し、デバッグに便利です。


-----------------
できれば、うまくいかない場合もあるから、それを言い訳にしないでください。
上記の3つの投稿でわかりやすく説明しました。 1 つの投稿を読むだけでは十分ではありません。

最初の var_dump($_SESSION['user']); には値がありますか?分析用のコードを投稿することをお勧めします。

コードが間違って書かれているのではないかと疑ったことはありませんか?
すごい


私は 10 年近くプログラムを書いてきました。私は 13 年以上働いており、長年上司を務めていますが、プログラムを作成する際にあえて間違いを犯し、他人の前で直接殺されるという神経をどのように持つことができますか?
変だから。それで投稿してください。

あなたのコードは実行中のコードと異なります。コードを提供しない場合、どうやって分析できますか?

ログを追加して何度か取得すると、
var_dump($_SESSION['user']);
var_dump($_SESSION['user']['priv']); が簡単に見つかります。

皆さんもコードを見てください。これが実際のコードです:

$_SESSION['user']['priv'] = '' ; //priv赋值为空,谁取它都是空!

このポスターが意味するのは、2 回目の訪問ではどの方法を使用しても問題はありませんが、最初の訪問では何かが発生するということです。 2Dデータを直接読み込んだ場合に起こります、別々に読み込むのは正常です、正しく理解できているかわかりません...


ポスターの意味は、2回目の訪問時にどの方法を使用しても、問題ありませんが、最初に 2D で直接読むと間違いなく問題が発生します。正しく理解できているかどうかはわかりません...

いいえ。他の意味は無視して、15 階だけを見てください。
文字化けが原因でしょうか?

文字化けが原因でしょうか?

文字化けはありません。

print_r($_SESSION['user']);

このようにして、データ構造情報も同時に取得できるので、判断材料を作ることができます
エラーを再現することはできないので、 $_SESSION を割り当てるコードで理由を見つけてください

とても役に立ちます
データベースから取り出したユーザーオブジェクト 配列である場合もあれば、オブジェクトである場合もあります

を書いたことを疑ったことはありませんか
コードが間違っていますか?
リーリー


写了近10年程序。工作13+,做老大很多年,哪敢犯程序写错的上毛病,还有脸出来见人,直接撞死得了?
因为奇怪。所以发上来。
开发windows系统的 看来没你水平高啊!  windows到现在还在打补丁呢,有漏洞就是代码没写好哈~~~!   你的都正确

print_r($_SESSION['user']);
这样同时可以得到数据结构信息,才好做判断的依据
由于你不能再现错误,只有在对 $_SESSION 赋值的代码中找原因

极有可能是 从数据库里取出来的用户对象有时是数组,有时是对象



其实我觉得就是在session赋值时出现的问题!

这是thinkphp中session函数读取session的代码:

            if (strpos($name, '.')) {                list($name1, $name2) = explode('.', $name);                return isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null;            } else {                return isset($_SESSION[$prefix][$name]) ? $_SESSION[$prefix][$name] : null;            }


如果session真的有BUG我想TP的用户早就反应了,他读取任何session都是直接读二维的
我建议楼主先在业务逻辑和session赋值上面找找原因
另外你说有和你一样问题的,不知道方便发些链接不

检查从数据库取出的数据是否异常

貌似没说清楚问题,也没找到原因。

分成2步就没有问题了,没有心思再管这些。结贴了。谢谢各位支持。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。