【问题标题】:Zend_Session losing data ... but why?Zend_Session 丢失数据...但是为什么呢?
【发布时间】:2012-09-04 20:25:35
【问题描述】:

我对 Zend_Session 很陌生。 我确实有一个 Zend Framework 应用程序正在运行;现在我想为它添加一些“功能”。其中一项功能需要 Session 中包含一些数据,因此它存储在用户将访问的所有站点上。

在我的引导程序中,我有

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initSession() {
        Zend_Session::setOptions(array(
          'use_only_cookies' => 'on',
          'remember_me_seconds' => 864000
        ));
        Zend_Session::start();
    }
}

在我的模型中,有一个函数可以将给定关键字的数据存储到 $_SESSION 中:

 $_SESSION['foo'][urlencode($keyword)] = array(   
              'data' => $base->some->foo[0]->fish->data         
            );

如果未设置会话密钥(带有关键字),则仅将新数据设置为会话。我用zend调试器检查过,一切运行良好。

现在,当我首先调用页面时,一切运行良好。当我重新加载页面(或移动到另一个页面)时,会话中的值消失了。所以,确切地说,keys 在那里,$_SESSION 数组(例如)是 20 个大小的条目。有一个条目,但它是空的。

$_SESSION['foo']['my+foo']['data'] = null

当我打电话时:

Zend_Debug::dump($_SESSION['foo']['my+foo']);

我明白了:

array (size=1)
  'data' => null

所以,它就在那里,它扼杀了我的价值。

当我使用简单的 session_start() 时,让它运行的神奇巫术是什么?

【问题讨论】:

  • 为什么不使用 Zend_Session? Zend Session 没有那么简单的内部结构,可能只是删除您的数据,同时保存自己的信息。
  • 这是您尝试保存到会话的 SimpleXML 数据吗?如果是这样,请在将其插入会话时尝试转换为字符串:$_SESSION['foo'][urlencode($keyword)] = array( 'data' => (string)$base->some->foo[0]->fish->data );
  • 最好的猜测是您在请求循环中的某处覆盖了您的数据并且不知道它(我已经这样做了,但很难找到)。查看Zend_Session_Namespace
  • 抱歉,没有变化。尝试过 Zend_Session 和简单的 session_start() 东西,都一样。尝试以上面的方式存储simplexml数据,没有变化。并且:它是一个非常非常简单的 ZF 项目,我在请求循环中什么都不做,这不是标准的一部分(我什至不知道如何更改它,即使我想要这样 ;))。为什么我的会话数据为空?
  • 所以,我明白了,我必须将 simplexml 对象中的每一个值都转换为我的会话的表示形式,然后它将被保存...好的,感谢您让我走上正确的道路,draw010,你明白了;)

标签: php zend-framework zend-session


【解决方案1】:

按 Ctrl + F 并将所有内容替换为 Zend_Session_Namespace 对象而不是超级全局 $_SESSION:

$session = new Zend_Session_Namespace('foo');
$session->someData = array(   
    'data' => array('blah') 
);

如果错误仍然存​​在,则在更改会话数据时扩展 Zend_Session_Namespace 并放置 echo(用于调试),然后您将能够知道它是否被另一段代码替换而无需您的确认.

或者更好的是,使用交互式调试器并逐行检查类(即 xDebugger)。那一个永远不会失败;)

【讨论】:

  • 抱歉,这并没有改变任何东西。我扩展了 Zend_Session_Namespace,但我没有得到回声。看来,两次通话之间数据会丢失。
  • 所以,我调试了我的项目(zend 调试器),当我调用 session_start 时,我的 $_SESSION 对象被创建,但 'foo' 部分填充了正确的键,但所有值为空,例如: ['foo']['bar']['data'] 存在,但它为空。 $_SESSION 中的另一部分没问题,$_SESSION['what'][0] 在那里并且具有正确的值......可能是键名太大了吗?
【解决方案2】:

drew010 成功了,我必须将每一个值保存到我的会话中,所以

$_SESSION['foo']['bar'] = array(
 'data' => (int) $base->some->foo[0]->fish->data,
  'moredata' => (string)$base->some->foo[0]->fish->moredata
);

等等。 谢谢!

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多