2016-12-05 5 views
1

Komplettes Beispiel: A) Was erwartet wird. Es wird erwartet, Daten in einer Variable zu speichern. Es bedeutet, dass wenn ich tun muss es die Benutzer-UUID drucken, weil es hier definiert ist: $_SESSION["user_data"] = UserRep::selectUser(Conn::getConnection(), $token);PHP - Session kann keine Klassen speichern?

B) Was tatsächlich passiert. Es gibt tatsächlich den nächsten Fehler:

Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "UserMan" of the object you are trying to operate on was loaded before unserialize() gets called or provide a __autoload() function to load the class definition in C:\xampp\htdocs\esotic1jdv\index.php on line 67

Hinweis: Die Linie 67 ist <?php echo $_SESSION["user_data"]->getUUID(); ?>

Aber der folgende Code funktioniert: $data = UserRep::selectUser(Conn::getConnection(), $token); und dann print $data->getUUID();

C) Ein Beispiel von dem, was ich will.

<?php 
print $_SESSION["user_data"]->getUUID(); 

Muss als Ergebnis geben:

569047265eca48a8aa34847a3a059a7ea8170dc3

D) Was passiert eigentlich. getUUID(); Geben Sie als Ergebnis :

Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "UserMan" of the object you are trying to operate on was loaded before unserialize() gets called or provide a __autoload() function to load the class definition in C:\xampp\htdocs\esotic1jdv\index.php on line 67

+1

Bitte beenden Sie das Hinzufügen von Objekten zur Sitzung. Es ist bestenfalls ein Albtraum für die Wartung und das Debugging und eine Sicherheitslücke, die im schlimmsten Fall wartet. – PeeHaa

+0

Was kann ich dann tun @PeeHaa? Speichern Sie nur die UUID und erhalten Sie die Daten danach? –

+0

Ich würde PeeHaas Kommentar abbrechen: Je weniger in der Sitzung, desto besser. Und ja, es ist besser, die UUID zu speichern und dann den Benutzer aus der Datenbank zu holen. Wenn Sie über Geschwindigkeit besorgt sind, dann haben viele Datenbank Cache, alternativ (meine bevorzugte) ist es, die kritischen Teile des Objekts zu serialisieren, die Sie neu erstellen und aus Cache (falls verfügbar) und Fallback auf DB (wenn nicht im Cache verfügbar). – Robbie

Antwort

1

Sie müssen sicherstellen, dass die Klassendefinition geladen wird, bevor Sie session_start(), andernfalls eine Standardklasse (ohne Methoden) wird stattdessen erstellt.

Auto-Ladeklassen funktionieren nicht. Das Laden von Klassendefinitionen wird auch nicht nach session_start durchgeführt.

+0

Danke! Gelöst ... Ich kann nicht glauben, dass ich die Datei vergessen habe, bevor ich die Sitzung starte ... –