Zend_Session_SaveHandler_DbTable стирает сессию при каждом обновлении? - PullRequest
4 голосов
/ 02 марта 2011

Я в основном сталкиваюсь с той же проблемой, что и постер в этот вопрос . Моя база данных инициализирована правильно. Я попытался выполнить инициализацию базы данных и сеанса SaveHandler в application.ini и в Bootstrap. Тот же результат, независимо от того, как я это делаю.

Вот как выглядит инициализация 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. Это рассматриваемое действие индекса:

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

Теперь. Если у меня не настроено сохранение сеанса для использования Zend_Session_SaveHandler_DbTable, т.е. если у меня вообще не настроено сохранение сеанса, то это работает нормально. Я ввожу значение в поле формы, перехожу к действию index и возвращаю его мне. Сессия работает точно так, как она должна.

Если я настроил Zend_Session_SaveHandler_DbTable либо в application.ini, либо в Bootstrap, то когда я ввожу значение в поле теста и перехожу к действию индекса, значение исчезает. В моей таблице базы данных есть строка с правильным sessionID, а sessionID соответствует cookie в моем браузере. Но другой информации в базе данных нет. data имеет значение NULL, и оба поля TIMESTAMP обнуляются.

У меня кончились вещи, чтобы попробовать. У меня была таблица Mysql как обычная таблица и таблица InnoDB. Я пробовал каждую перестановку базы данных и конфигурации сеанса, которую я могу придумать, включая передачу базы данных в массив конфигурации и инициализацию одной в Bootstrap, а другую - в .ini. Я искал в Интернете и StackOverflow для подсказок. Я видел, как другие люди пишут о подобных проблемах, но ни один из найденных ответов не сработал. Что я не сделал? Что я облажался? Как я могу заставить это работать?

1 Ответ

5 голосов
/ 04 марта 2011

Проблема в том, что вы определили столбцы lastModifiedTime и время жизни как метку времени.Вместо этого они должны быть INT:

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

После этой небольшой модификации все должно работать.

...