2010-03-22 5 views
1

J'essaie de mettre à jour la table de session utilisée par Zend_Session_SaveHandler_DbTable directement après l'authentification de l'utilisateur et l'écriture de la session dans la base de données. Mais je ne peux ni mettre à jour ni récupérer la ligne nouvellement insérée, même si l'identifiant de session que j'utilise pour vérifier (Zend_Session :: getId()) est valide et la ligne est en effet insérée dans la table. Lors de l'extraction de tous les identifiants de session (sur la même requête), celui que j'ai nouvellement inséré manque dans les résultats. Il apparaît dans les résultats si je le récupère avec autre chose. J'ai vérifié si c'était un problème avec les transactions et cela ne semble pas être le problème - il n'y a pas de transaction active lorsque je récupère les résultats. J'ai aussi essayé d'aller chercher quelques secondes après avoir écrit en utilisant sleep(), ce qui ne m'aide pas.Zend: Récupérer une ligne de la table db de session après avoir généré l'ID de session

$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); 

$ mise à jour échoue.
$ load ne contient pas la ligne écrite avec $ auth-> getStorage() -> write ($ identity). $ qload contient la requête correcte - la copier vers un autre endroit mène au résultat attendu, c'est-à-dire que la ligne insérée est incluse dans les résultats.

La base de données utilisée est MySQL - InnoDB.

Si quelqu'un sait comment corriger directement ceci (c'est-à-dire sur la même demande, ne faisant pas quelque chose comme la mise à jour après la redirection vers une autre page) sans modifier Zend_Session_SaveHandler_DbTable: Merci beaucoup!

Répondre

1

Ce n'est pas un problème avec Zend Framework mais un problème avec le fonctionnement de Sessions en PHP. Dans votre cas, lorsque vous créez une nouvelle session, le nouvel ID de session est généré mais la session n'existe que dans la mémoire jusqu'à la fin du script.

Source: PHP Session Handling, Notes

Vous pourriez peut-être gérer cela sur la même demande en ajoutant une autre table pour tenir les métadonnées de la session, en utilisant la session ID généré comme une clé primaire (ou d'un composant de la clé primaire). Si vous suivez cette route, étendez Zend_Session_SaveHandler_DbTable et écrasez la méthode destroy() pour garder votre table de métadonnées propre lorsque les sessions expireront et seront récupérées.

0

Vous devez "détacher/relâcher" votre session avant de pouvoir faire quoi que ce soit avec elle. Vous pouvez le faire en appelant: Zend_Session :: writeClose(); Ensuite, vous devriez être en mesure d'aller chercher/mettre à jour des lignes comme vous le souhaitez. Gardez simplement à l'esprit que votre session sera en lecture seule, assurez-vous donc que vous n'aurez pas besoin d'y écrire une fois détaché.

Questions connexes