Zend: выборка строки из таблицы базы данных сеанса после генерации идентификатора сеанса - PullRequest
1 голос
/ 23 марта 2010

Я пытаюсь обновить таблицу сеансов, используемую Zend_Session_SaveHandler_DbTable, сразу после аутентификации пользователя и записи сеанса в БД. Но я не могу ни обновить, ни получить вновь вставленную строку, даже если идентификатор сеанса, который я использую для проверки (Zend_Session :: getId ()), действителен, и строка действительно вставлена ​​в таблицу. После извлечения всех идентификаторов сеансов (по одному и тому же запросу) тот, который я недавно вставил, отсутствует в результатах. Это появляется в результатах, если я получаю это с чем-то еще. Я проверил, является ли это проблемой с транзакциями, и это, кажется, не проблема - нет активной транзакции, когда я получаю результаты. Я также попытался получить несколько секунд после записи с помощью sleep (), что не помогает.

$auth->getStorage()->write($ident);
//sleep(1)
$update = $this->db->update('session', array('uid' => $ident->user_id), 'id='.$this->db->quote(Zend_Session::getId()));
$qload = 'SELECT id FROM session';
$load = $this->db->fetchAll($qload);
echo $qload;
print_r($load);

Не удалось обновить $.
$ load не содержит строку, которая была написана с помощью $ auth-> getStorage () -> write ($ identity). $ qload содержит правильный запрос - копирование его в другое место приводит к ожидаемому результату, то есть вставленная строка включается в результаты.

База данных используется MySQL - InnoDB.

Если кто-то знает, как исправить это напрямую (т.е. по тому же запросу, не выполняя что-то вроде обновления после перенаправления на другую страницу) без изменения Zend_Session_SaveHandler_DbTable: Большое спасибо!

Ответы [ 2 ]

1 голос
/ 30 марта 2010

Это не проблема с Zend Framework, а проблема с тем, как сеансы работают в PHP. В вашем случае, когда вы создаете новый сеанс, генерируется новый идентификатор сеанса, но сеанс существует только в памяти до тех пор, пока не завершится сценарий.

Источник: Обработка сеансов PHP, Примечания

Возможно, вы могли бы обработать это по тому же запросу, добавив другую таблицу для хранения метаданных сеанса, используя сгенерированный идентификатор сеанса в качестве первичного ключа (или компонента первичного ключа). Если вы пойдете по этому пути, расширьте Zend_Session_SaveHandler_DbTable и перезапишите метод destroy (), чтобы сохранить вашу таблицу метаданных в чистоте после истечения срока сеансов и сбора мусора.

0 голосов
/ 21 января 2011

Вам необходимо «отсоединить / освободить» сеанс, прежде чем вы сможете что-либо с ним сделать. Вы можете сделать это, позвонив по телефону: Zend_Session :: writeClose (); Тогда вы сможете выбирать / обновлять строки по желанию. Имейте в виду, что ваш сеанс будет доступен только для чтения, поэтому убедитесь, что вам не нужно писать в него после отсоединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...