2012-03-30 1 views
0

J'ai le tableau suivant qui gère reserverations:Existe-t-il un moyen de forcer Zend_Session_SaveHandler_DbTable à écrire dans la base de données plus tôt?

CREATE TABLE `Plots` (
    `Plot_ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Grid_ID` int(11) NOT NULL DEFAULT 0, 
    `Instance_ID` int(11) NOT NULL DEFAULT 0, 
    `Session_ID` char(32) DEFAULT NULL, 
    `User_ID` int(11) DEFAULT NULL, 
    `Transaction_ID` int(11) DEFAULT NULL, 
    `CreateDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `UpdateDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `Plot` varchar(10) NOT NULL DEFAULT 0, 
    `ReserveDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `ReservationTimeoutDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `PurchaseDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`Plot_ID`), 
    CONSTRAINT `Plots_ibfk_1` FOREIGN KEY (`Grid_ID`) REFERENCES `Grids` (`Grid_ID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `Plots_ibfk_2` FOREIGN KEY (`Instance_ID`) REFERENCES `Instances` (`Instance_ID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `Plots_ibfk_3` FOREIGN KEY (`Session_ID`) REFERENCES `Sessions` (`Session_ID`) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT `Plots_ibfk_4` FOREIGN KEY (`User_ID`) REFERENCES `Users` (`User_ID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    CONSTRAINT `Plots_ibfk_5` FOREIGN KEY (`Transaction_ID`) REFERENCES `Transactions` (`Transaction_ID`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; 

Comme vous pouvez le voir, « SESSION_ID » est une clé étrangère à ma table de sessions, qui est géré par Zend_Session et Zend_Session_SaveHandler_DbTable. J'ai des problèmes lorsque je crée la session, et dans le même script, essayez d'utiliser son ID_Session pour insérer un enregistrement dans "Plots" (illustré ci-dessus), car l'enregistrement n'existe pas dans la table Sessions. Puis-je forcer Zend_Session_SaveHandler_DbTable à enregistrer ses données dans la base de données plus tôt? Si c'est le cas, comment?

+0

Pourriez-vous copier/coller votre fichier application.ini ou bootstrap (où vous initialisez la session). – Liyali

Répondre

1

Voir session_write_close()/session_commit() de PHP. Cela écrira les données de la session et la fin de la session.

Alternativement, pourquoi le travail sur les trames échoue-t-il? Contraintes FK ou quelque chose? Vous connaissez le session_id, il n'est pas encore dans la base de données. Mais vous savez ce que ce sera lors de l'insertion (en supposant que la fermeture de la session est comme prévu). Pas idéal je suppose mais réalisable.

+0

Dans ZF, vous pouvez appeler 'Zend_Session :: writeClose()' qui appellera finalement 'session_write_close()'. Si l'op était courageux, il pourrait regarder manuellement en appelant 'Zend_Session_SaveHandler_DbTable :: write ($ id, $ data)' mais je pense que la sérialisation de '$ data' pourrait avoir des implications imprévues, donc il peut être préférable d'utiliser standard 'session_write_close'. Vous pouvez toujours redémarrer la session immédiatement après l'appel si vous avez encore besoin d'écrire des données. – drew010

+0

dessiné, votre commentaire ci-dessus est la réponse que je cherchais, mais je ne peux pas l'accepter comme réponse. Si vous voulez le crédit, déplacez votre commentaire dans une réponse et je marquerai comme accepté, sinon, je vais juste accepter la réponse de ficuscr. – Travis

Questions connexes