当前位置:Gxlcms > PHP教程 > SESSION中的数组为什么有时候取得到,有时候取不到呢?

SESSION中的数组为什么有时候取得到,有时候取不到呢?

时间:2021-07-01 10:21:17 帮助过:5人阅读

登录后:将用户对象user放入SESSIOn中 这样访问 $_SESSION['user']['priv']。有时候这个为空,需要将
$user=$_SESSION['user']; 后再访问,有时候直接$_SESSION['user']['priv']这样访问才可以,请问这是咋回事?
我的php版本 5.4.22


回复讨论(解决方案)

有时候直接$_SESSION['user']['priv']这样访问就可以,不需要将数组提出来($user=$_SESSION['user']),请问这是咋回事?
我的php版本 5.4.22

在取失败时:var_dump($_SESSION['user']);看看数据,结果是正确的。里面有数据。分开成2步,也可以取到,就是在前面取不到。同方法内,第一次不能这样取。第二次就可以这样取到了。session数据是没有变的。

你最好给出测试代码

至少也要给出 失败时 var_dump($_SESSION['user']); 的结果

测试代码 不能重现。测试都是正常的。实际就要分2步。

先排除个外因,会不会是你测试输出$_SESSION['user']['priv']的时候恰好第一次访问还没来的及设置session?
不能重现咋测试解决

你就没怀疑过你代码写错了么!

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

$_SESSION 生命周期 默认时间为20分钟

明显 超过时间了

有?可以,有?不行,????log,??每次的情?,??方便debug。

在取失败时:var_dump($_SESSION['user']);看看数据,结果是正确的。里面有数据。分开成2步,也可以取到,就是在前面取不到。同方法内,第一次不能这样取。第二次就可以这样取到了。session数据是没有变的。
----------
各位难道没有写过程序么?这样的问题没有碰到过么?我碰到好多次。

先排除个外因,会不会是你测试输出$_SESSION['user']['priv']的时候恰好第一次访问还没来的及设置session?
不能重现咋测试解决


亲,问题永远在这儿,就是要分2步。一步不行。我讲的测试不能重现,就是写个test.php不能重现。
实际程序不分二步。结果就不正确。很稳定。
----------------
我在其它地方发贴。还有网上很我和我一样的问题的。

有?可以,有?不行,????log,??每次的情?,??方便debug。


-----------------
可以就可以,不可以就不要以,没有时行时不行的。
我上面分三贴讲清楚了。只看一贴是不行的。

第一次var_dump($_SESSION['user']);是否有值? 建议贴出代码以供分析。

你就没怀疑过你代码写错了么!

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


写了近10年程序。工作13+,做老大很多年,哪敢犯程序写错的上毛病,还有脸出来见人,直接撞死得了?
因为奇怪。所以发上来。

不能重?,你的??代???行代?不同,你不提供代?如何分析?

你加log,?次?取?,都?出
var_dump($_SESSION['user']);
var_dump($_SESSION['user']['priv']);
方便找??。

各位要看代码,这就是真正代码:

//user为从数据库里取出来的用户对象$user=$_SESSION['user'];echo $user['priv'] ;正常显示: 100// echo $_SESSION['user']['priv'];//显示为空。原来是这行,改成上面2行了。

楼主的意思是,第二次以后的访问,无论哪种方式都没问题,而第一次访问,直接读二维必然出事,而分开读正常,不知道我理解的对不对...

楼主的意思是,第二次以后的访问,无论哪种方式都没问题,而第一次访问,直接读二维必然出事,而分开读正常,不知道我理解的对不对...


不对。直接看15楼,不理其它意思。

乱码造成的吧?

乱码造成的吧?

没乱码。

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

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


你就没怀疑过你代码写错了么!

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


写了近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步就没有问题了,没有心思再管这些。结贴了。谢谢各位支持。

人气教程排行