【问题标题】:serialize() and $_SESSION [duplicate]serialize() 和 $_SESSION [重复]
【发布时间】:2012-01-07 01:07:47
【问题描述】:

用户通过身份验证后,我将类对象序列化并将其存储在会话中。但是,即使在使用 unserialize() 之后,我似乎也无法打印它的输出。

创建会话变量:

if(!isset($_SESSION['myObj']) && empty($_SESSION['myObj'])) {
$myObj = new User($row['user_id'], $row['username'], $row['user_level']);
$_SESSION['username']= $myObj->usr_name;
$s_Obj = serialize($myObj);
$_SESSION['myObj'] = $s_Obj;

从其他页面访问,无输出:

$sObj = $_SESSION['Obj'];
$myObj = unserialize($s_Obj);
echo $myObj->usr_name;

但是,这可行,因此我的课程没有问题。我也在两个页面中使用session_start()

echo $_SESSION['username'];

班级用户:

<?php 

class User{
    public $usr_id;
    public $usr_name;
    public $usr_level;
    public $last_access_login;

    public function __construct($id, $usr_name, $usr_level) {
        $this->usr_id = $id;
        $this->usr_name = $usr_name;
        $this->usr_level = $usr_level;
        $this->last_access_login = date("F d Y H:i:s.",time());
  }
}
?>

编辑:

这是我的转储

array
  'myObj' => 
    object(__PHP_Incomplete_Class)[1]
      public '__PHP_Incomplete_Class_Name' => string 'User' (length=4)
      public 'usr_id' => string '3' (length=1)
      public 'usr_name' => string 'student' (length=7)
      public 'usr_level' => string '3' (length=1)
      public 'last_access_login' => string 'November 26 2011 20:12:38.' (length=26)
  'url' => string '/researchportal/proposal' (length=24)

【问题讨论】:

  • 您是否在所有页面上都使用了session_start()User() 长什么样子?
  • $_SESSION['myObj'] = $myObj 应该足够了,我认为 -- PHP 应该为你处理序列化。
  • @lonsesomeday 我也试过了,但没用。
  • 序列化数据然后将其存储在会话中是没有意义的。会话数据是隐式序列化的,您只是增加了处理开销。只需执行$_SESSION['myObj'] = $myObj。这可能会或可能不会解决问题 - 这只是一般建议。并不是说您需要在 调用 session_start() 之前包含包含 User 类的文件。
  • 开发时总是把错误报告调到最大。然后 var_dump($_SESSION);然后阅读关于定义类之前调用 session_Start()

标签: php session serialization


【解决方案1】:

初始页面:

$s_Obj = serialize($myObj);
$_SESSION['myObj'] = $s_Obj;

应该是

$_SESSION['myObj'] = $myObj;

下一页:

$sObj = $_SESSION['Obj'];
$myObj = unserialize($s_Obj);

应该是

$myObj = $_SESSION['myObj'];

此外,请尝试在致电 session_start() 之前声明您的课程。

【讨论】:

  • 我也修正了这个错误。但它仍然无法正常工作。
  • @user478636 更新后的代码怎么样?
  • 尝试使用 var_dump 进行分析。你有没有试过 var_dump($_SESSION); ?
  • @Marko 好吧,看来echo $_SESSION['username']; 工作正常,所以$_SESSION 应该工作正常。
  • 嗯,我试过了,但没有运气。为什么$_SESSION['username']=$myObj-&gt;usr_name; 有效但$_SESSION['myObj']=$myObj; 无效
【解决方案2】:

您的未序列化对象正在被反序列化为__PHP_Incomplete_Class_Name 的实例,因为您在反序列化之前没有包含 User 类的定义。见Object Serialization。在尝试反序列化之前,您必须包含 User 类的定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2013-11-16
    相关资源
    最近更新 更多