PHP会话问题

时间:2011-05-15 18:59:36

标签: php session com

我正在使用PHP的第三方COM对象,我希望将对象保存在会话变量中,以便在将来的服务器调用中访问它。

如果我在会话中保存对象:

$_SESSION['collItem'] = $collItem;

我可以在定义后立即通过$_SESSION['collItem']访问它的方法和属性。

但是,在将来调用服务器时,如果我尝试使用$_SESSION['collItem'],我就无法再次访问它。

我在这里写了一些代码来澄清。

在我的脚本“functions.php”中启动COM对象的方法:

public function setAppData() {

    try {
        $appD = new COM('ASData.CASDataApp');
        $appD->InitMasterData(true, 1, 91);
        $appD->DateMask = 'ymd';
        $_readDB = $appD->InitApp($this->readDB());
    } catch (Exception $e) {
        $err = 'Connection error: ' . htmlentities(addslashes(strip_tags($e->getMessage())));
        $this->setError($err);
        return false;
    }

    $appD->appPath = str_replace('\app\include', '', __DIR__);

    $this->iniciarCollections($appD);

    $this->appData = $appD;
}

从我的脚本“edit_json.php”调用方法:

require_once('functions.php');

if (!session_id()) {
    session_start();
}

// We recover $mbw object saved in session and initialize COM object
if (isset($_SESSION['mbw'])) {
    $mbw = unserialize($_SESSION['mbw']);
}
$mbw->setAppData();
$appData = $mbw->getAppData();
$_SESSION['appData'] = $appData;

如果我在COM初始化后立即尝试访问$ _SESSION ['appData']我可以毫无问题地使用它,但是如果我在将来的服务器调用中尝试下一个代码(在$ _SESSION ['appData']中保存$ appData对象:

     if (!session_id()) {
        session_start();
    }
    $appData = $_SESSION['appData']; 
    // I can't work with $appData object if I don't initialize it again

重新初始化COM对象对我来说不是一个好的解决方案,因为我丢失了所做的所有更改。

2 个答案:

答案 0 :(得分:6)

在脚本开头使用session_start()。您需要它来从服务器检索会话数据到$_SESSION变量。

来自http://php.net/manual/en/function.session-start.php

  

session_start()根据通过GET或POST请求传递的会话标识符创建会话或恢复当前会话,或通过cookie传递。

答案 1 :(得分:1)

您应该编辑问题并包含getAppData()方法,以便我们进行更好的诊断。但我可以猜到你的getAppData()会返回一个对象,在这种情况下,当你有一个像

这样的代码时
$appData = $mbw->getAppData();
$_SESSION['appData'] = $appData;

PHP正在做的是$_SESSION['appData']仅将引用保存到$mbw->getAppData()对象,而不是真实对象。

如果要将真实对象存储在会话中,则必须执行以下操作:

$_SESSION['appData'] = serialize($appData);

然后,只要你想使用存储的对象,你就可以:

if (isset($_SESSION['appData'])) $appData = unserialize($_SESSION['appData']);

关于使用会话中保存的$ appData的每个文件的开始。

相关问题