2012-03-30 3 views
0

Ich habe die folgende Tabelle, die reserverations Griffe:Gibt es eine Möglichkeit, Zend_Session_SaveHandler_DbTable zu zwingen, früher in die Datenbank zu schreiben?

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; 

Wie Sie sehen können, „Sitzungs_ID“ ist ein Fremdschlüssel für meine Sessions-Tabelle, die von Zend_Session und Zend_Session_SaveHandler_DbTable verwaltet wird.

Ich habe Probleme, wenn ich die Sitzung erstellen, und innerhalb desselben Skripts versuchen, seine Session_ID zu verwenden, um einen Datensatz in "Plots" (siehe oben) einzufügen, da der Datensatz in der Sitzungstabelle nicht existiert.

Kann ich Zend_Session_SaveHandler_DbTable zwingen, seine Daten früher in der Datenbank zu speichern? Wenn das so ist, wie?

+0

Können Sie Ihre Application.ini oder Bootstrap (wo initialisieren Sie die Sitzung) kopieren/einfügen. – Liyali

Antwort

1

Siehe PHP session_write_close()/session_commit(). Dies schreibt die Sitzungsdaten und beendet die Sitzung.

Oder warum schlägt die Arbeit an Plots fehl? FK-Einschränkungen oder etwas? Sie kennen die Session-ID, sie ist gerade nicht in der Datenbank. Aber Sie wissen, was es sein wird, wenn es eingefügt wird (vorausgesetzt, dass die Sitzung wie erwartet beendet wird). Nicht ideal, nehme ich an, aber machbar.

+0

In ZF können Sie 'Zend_Session :: writeClose()' aufrufen, was letztendlich 'session_write_close()' aufruft. Wenn der Op mutig war, konnte er manuell nach 'Zend_Session_SaveHandler_DbTable :: write ($ id, $ data) suchen ', aber ich denke, die Serialisierung der' $ data' könnte einige unvorhergesehene Auswirkungen haben, daher ist es am besten, den Standard zu verwenden 'session_write_close'. Sie können die Sitzung immer sofort nach dem Aufruf von close neu starten, wenn Sie noch Daten in die Sitzung schreiben müssen. – drew010

+0

zeichnete, ist Ihr Kommentar oben die Antwort, die ich suchte, aber ich kann es nicht als die Antwort akzeptieren. Wenn Sie den Kredit wollen, verschieben Sie Ihren Kommentar in eine Antwort und ich werde es als akzeptiert markieren, sonst werde ich nur die Antwort von ficuscr akzeptieren. – Travis

Verwandte Themen