2009-10-28 8 views
5

To jest mój tabeli:Przechowywanie sesji w DB tabeli nie działa (używając Zend_Session_SaveHandler_DbTable)

CREATE TABLE `Sessions` (
`id` varchar(32) NOT NULL, 
`modified` int(11) default NULL, 
`lifetime` int(11) default NULL, 
`data` text, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB 

To w moim bootstrap:

$sessionConfig = array( 
'name'   => 'Sessions',  //table name as per Zend_Db_Table 
'primary'  => 'id', //the sessionID given by php 
'modifiedColumn' => 'modified',  //time the session should expire 
'dataColumn'  => 'data', //serialized data 
'lifetimeColumn' => 'lifetime'  //end of life for a specific record 
); 
$saveHandler = new Zend_Session_SaveHandler_DbTable($sessionConfig); 
//cookie persist for 30 days 
Zend_Session::rememberMe($seconds = (60 * 60 * 24 * 30)); 

//make the session persist for 30 days 
$saveHandler->setLifetime($seconds) 
    ->setOverrideLifetime(true); 
//similarly, 
//$saveHandler->setLifetime($seconds, true); 
Zend_Session::setSaveHandler($saveHandler); 
Zend_Session::start(); 

Kiedy zalogować, nic nigdy nie jest wpisywane do Tabela sesji i jestem wylogowany na następnej odsłonie strony.

Wszelkie pomysły? Staram się, aby moi użytkownicy byli nieustannie zalogowani. Czy brakuje mi czegoś w moim kontrolerze logowania?

Odpowiedz

0

Może musisz umieścić Zend_Session::start(); przed czymkolwiek innym na stronie ...?

+0

Przeczytałem, że chcesz wywołać Zend_Session :: start(); po wszystkim. Jednym z powodów, dla których sesja session_set_cookie_params() wywoływana z rememberMe() nie może ustawić czasu życia po uruchomieniu sesji. – Brian

+0

Mimo to, jeśli ustawisz "Zend_Session :: start();" zanim cokolwiek innego to zadziała? To może dostarczyć nam wskazówek, co może przeszkadzać. – Frankie

+0

Wprowadzanie Zend_Session :: start(); W związku z tym wszystko wydaje się dawać taki sam rezultat. Jakieś pomysły? – Brian

1

Musisz zainicjalizować program obsługi DB zanim powiesz Zend_Session, aby użyła DB, albo ustawiając domyślną kartę dla Zend_Db, albo przekazując swój adapter w tablicy config jako "db".

2

Właśnie udało się uzyskać tej pracy:

Moja application.ini:

resources.db.isDefaultTableAdapter = true 
resources.db.adapter = "pdo_mysql" 
resources.db.params.host = "localhost" 
resources.db.params.dbname = "dbname" 
resources.db.params.username = "username" 
resources.db.params.password = "password" 

mój bootstrap.php:

protected function _initSession() { 
    $resource = $this->getPluginResource('db'); 
    $dbAdapter = $db = $resource->getDbAdapter(); 
    Zend_Registry::set("db", $dbAdapter); 
    Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); 
    $config = array(
     'name' => 'session', 
     'primary' => 'id', 
     'modifiedColumn' => 'modified', 
     'dataColumn' => 'data', 
     'lifetimeColumn' => 'lifetime', 
     'db' => $dbAdapter 
    ); 

    Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config)); 
    Zend_Session::start(); 
} 

Funkcja ta została umieszczona w pierwszej funkcji w bootstrap .php, ponieważ sesje są uruchamiane podczas konstruowania obiektu Zend_Session_Namespace po raz pierwszy. Jeśli to zrobisz, przed wywołaniem funkcji _initSession() - może zostać uruchomiona standardowa sesja oparta na plikach.

Wreszcie session.sql:

DROP TABLE IF EXISTS `session`; 


CREATE TABLE `session` (

    `id` char(32) NOT NULL DEFAULT '', 

    `modified` int(11) DEFAULT NULL, 

    `lifetime` int(11) DEFAULT NULL, 

    `data` text, 

    PRIMARY KEY (`id`) 

) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Gdzieś czytałem, że stół musi być InnoDB.

+0

Nie potrzebujesz obu Zend_Db_Table_Abstract :: setDefaultAdapter ($ dbAdapter); i "db" => $ dbAdapter – Kicsi

0

Miał ten sam problem z implementacją redis jako obsługi sesji.

Dla mnie metodajako pierwsza metoda działa w mojej klasie bootstrap.

Mam nadzieję, że komuś pomoże.

Powiązane problemy