Я в основном сталкиваюсь с той же проблемой, что и постер в этот вопрос . Моя база данных инициализирована правильно. Я попытался выполнить инициализацию базы данных и сеанса 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 для подсказок. Я видел, как другие люди пишут о подобных проблемах, но ни один из найденных ответов не сработал. Что я не сделал? Что я облажался? Как я могу заставить это работать?