【问题标题】:Zend_Session_SaveHandler_DbTable is wiping the Session with every refresh?Zend_Session_SaveHandler_DbTable 每次刷新都会擦除 Session?
【发布时间】:2011-07-06 21:22:54
【问题描述】:

我基本上遇到了与this question 中的海报相同的问题。我的数据库已正确初始化。我尝试在application.iniBootstrap 中对数据库和会话SaveHandler 进行初始化。不管我怎么做,结果都是一样的。

application.ini 初始化如下所示:

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "uname"
resources.db.params.password = "******"
resources.db.params.dbname = "dbname"

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "sessions"
resources.session.saveHandler.options.primary = "sessionID"
resources.session.saveHandler.options.modifiedColumn = "lastModifiedTime"
resources.session.saveHandler.options.dataColumn = "data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"

下面是 Bootstrap 初始化的样子:

protected function _initSession() {
        $db = Zend_Db::factory('Pdo_Mysql', array(
            'host'        =>'localhost',
            'username'    => 'uname',
            'password'    => '******',
            'dbname'    => 'dbname'
        ));
        Zend_Db_Table_Abstract::setDefaultAdapter($db);


    $sessionConfig = array( 
            'name'           => 'sessions',      
            'primary'        => 'sessionID',   
            'modifiedColumn' => 'lastModifiedTime',     
            'dataColumn'     => 'data',
            'lifetimeColumn' => 'lifetime'
        ); 
        $saveHandler = new Zend_Session_SaveHandler_DbTable($sessionConfig); 
        Zend_Session::setSaveHandler($saveHandler); 
        Zend_Session::start();

}

我的会话数据库表定义如下:

create table sesssions (
    sessionID char(32) primary key not null, 
    lastModifiedTime timestamp, 
    lifetime timestamp, 
    data text
) engine=innodb;

我有一个测试操作,它通过一个非常简单的字段表单进行测试,该表单只是将其内容转储到会话中。动作如下所示:

public function addAction()
{
    $namespace = new Zend_Session_Namespace();

    $form = new Application_Form_AddToSession();
    $request = $this->getRequest();
    if ($request->isPost()) {
        if ($form->isValid($request->getPost())) {
           $namespace->content = $request->getParam('toAdd');
        }
    }
    $this->view->form = $form; 
}

这是它使用的形式:

class Application_Form_AddToSession extends Zend_Form
{

    public function init()
    {
        $this->setMethod('post');

        $this->addElement('text', 'toAdd', array(
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                array('StringLength', false, array(0, 256)),
            ),
            'required'   => true,
            'label'      => 'Add:',
        ));

        $this->addElement('submit', 'add', array(
            'required' => false,
            'ignore'   => true,
            'label'    => 'Add',
        )); 
    }


}

视图只显示表单。

为了测试这个值是否真的进入了会话,我使用了 index 动作。这是有问题的索引操作:

public function indexAction()
{
    $namespace = new Zend_Session_Namespace();
    echo 'Content: '.$namespace->content.'<br>';
    echo '<pre>'; print_r($_SESSION); echo '</pre>';
}

现在。如果我没有将会话保存配置为使用Zend_Session_SaveHandler_DbTable,即,如果我根本没有配置会话保存,那么这可以正常工作。我在表单字段中输入一个值,转到索引操作并将其输出给我。会话完全按照它应该的方式工作。

如果我在application.ini 或引导程序中配置了Zend_Session_SaveHandler_DbTable,那么当我在测试字段中输入一个值并转到索引操作时,该值就消失了。我的数据库表中有一行包含正确的sessionIDsessionID 与我浏览器中的 cookie 匹配。但是数据库中没有其他信息。 data 为 NULL,TIMESTAMP 字段都被清零。

我已经没有东西可以尝试了。我将 Mysql 表作为常规表和 InnoDB 表。我已经尝试了所有我能想到的数据库和会话配置的排列,包括将 db 提供给配置数组,并在 Bootstrap 中初始化一个,在.ini 中初始化另一个。我已经搜索了网络和 StackOverflow 以寻找线索。我见过其他人发布过类似问题的帖子,但我找到的答案都没有奏效。我没做什么?我搞砸了什么?我怎样才能让它发挥作用?

【问题讨论】:

    标签: php database zend-framework zend-session


    【解决方案1】:

    问题在于您将 lastModifiedTime 和生命周期列定义为时间戳。它们应该是 INT:

    CREATE TABLE  `sessions` (
    `sessionID` char(32) NOT NULL,
    `lastModifiedTime` INT,
    `lifetime` INT,
    `data` text,
    PRIMARY KEY (`sessionID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    经过这个小修改后,它应该可以工作了。

    【讨论】:

    • 我只是补充一点,在 INI 中拥有配置然后从不在实际的 init 方法中使用它是很奇怪的。将来可能会导致奇怪的行为(因为您忘记了它是如何实现的,或者其他人会使用它)
    猜你喜欢
    • 2012-05-30
    • 2016-06-29
    • 2021-10-14
    • 1970-01-01
    • 2017-12-07
    • 2014-01-15
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多