2009-03-02 2 views
5

Ich habe ein PHP-Skript, das auf zwei Arten von einem Dojo Ajax xhrGet-Aufruf aufgerufen wird. Beim ersten Aufruf mit einem "init" -Argument bewirkt das Skript, dass eine Instanz der StateList-Klasse erstellt und eine Datei mit Zustandsnamen eingelesen wird.Warum kann ich eine PHP-Klasseninstanz nicht als SESSION-Variable speichern?

session_start(); 
@include('StateList.php'); 
require_once('phplog.php'); 

//start executing here 
$comd=$_GET['nexturl']; 
if($comd=="init") { 
$st = new StateList("../data/statestxt.txt"); 
$_SESSION['statefile'] = $st; 
} 

Die zweiten und weitere Male durchläuft ein weiterer Anruf xhrGet A „GetState“ -Argument und der folgende Code versucht die Instanz der OFR StateList Klasse aus dem SESSION-Array zu erhalten.

if($comd =="getstate") { 
$st= $_SESSION['statefile']; 
phplog("size=".$st->getSize()); 

}

Allerdings ist die getSize() Methode nie ausgeführt wird, noch kann ich rufe eine andere Methode auf der wiederhergestellten StateList Klasseninstanz.

Beachten Sie, dass dies ein PHP-Skript ist, das die Klassendefinition an der Spitze enthält und daher die Klassenmethoden bekannt und verfügbar sein sollten.

Was fehlt mir hier?

+0

Versuchen Sie es mit vermeiden @; Schreiben Sie Ihren Code einfach so, dass keine Fehler zu unterdrücken sind. –

Antwort

1

Möglicherweise müssen Sie das $ st Objekt/Variable serialize bevor Sie es speichern. Dadurch wird sichergestellt, dass alles in der Sitzung gespeichert wird. Dies ist definitiv der Weg für Code zu gehen. Wenn Sie die Daten erneut verwenden möchten, müssen Sie unserialize es.

+6

Sitzungsvariablen werden automatisch serialisiert und unserialisiert. – outis

14

Sie müssen die Klassendefinition vor dem Aufruf session_start() einbeziehen, andernfalls wird das Objekt nicht korrekt deserialisiert und ist eine Instanz von __PHP_Incomplete_Class. Ansonsten sollte das, was Sie haben, gut funktionieren.

+1

Wenn ich die Definition wie vorgeschlagen verschiebe, ist der vom Sitzungsarray zurückgegebene Wert null. –

+0

Haben Sie display_errors on und error_reporting E_ALL? Können Sie sicherstellen, dass das erste Bit tatsächlich ausgeführt wird ($ comd == "init")? –

0

Wenn Sie ein Objekt in der Sitzung speichern möchten, muss es link text sein. Es gibt eine Menge Probleme mit dem Serialisieren von Objekten in PHP, geschweige denn, sie in der Sitzung zu speichern. Ich empfehle Ihnen, dies nicht zu tun und eine andere Lösung für Ihr Problem zu finden. Wenn Sie es jedoch tun, sollten Sie sich die "magischen Methoden" link text ansehen, die Sie in Ihrer Klasse definieren sollten, um die Wiederherstellung zu erleichtern, wenn sie aus der Sitzung aufgerufen wird.

0

Haben Sie session.auto_start aktiviert? Die Sitzungsseite Anleitung besagt, dass wenn Sie das tun, müssen Sie anders die Klassendefinition laden:

Wenn Sie session.auto_start aktivieren, dann die einzige Möglichkeit, Objekte in Ihre Sitzungen zu setzen ist die Klassendefinition mit auto_prepend_file laden in dem Sie die Klassendefinition laden, andernfalls müssen Sie Ihr Objekt serialisieren und es anschließend wieder serialisieren.

http://php.net/manual/en/intro.session.php

Da dieser Seite sagt, die Serialisierung/Deserialisierung des Objekts wird in der Regel automatisch von PHP getan werden, aber das wird sich ändern session.auto_start aktiviert haben.

+0

Nein, es ist nicht aktiviert. –

1

Dies ist eines der Dinge, die in Isolation schwer zu debuggen sind. Das Speichern instanziierter Objekte in PHP Sessions ist immer ein wenig schwierig und nicht 100% ig garantiert. Hier finden Sie einige allgemeine Tipps zum Debuggen, mit denen Sie dies herausfinden können.

Überprüfen Sie zunächst Ihr Apache-Fehlerprotokoll. Erhalten Sie eine "Methode, die Nicht-Objekt-Fehler genannt wird"?Wenn dies der Fall ist, bedeutet das, dass Sie kein Objekt mehr aus der Sitzung entfernen. Falls nicht, gibt es einen Fehler, der anzeigt, dass Ihr Methodenaufruf aus einem anderen Grund fehlschlägt?

Zweitens, überprüfen Sie, was Sie wirklich aus Ihrer Sitzung bekommen.

if($comd =="getstate") { 
    $st= $_SESSION['statefile']; 
    //get the class of st 
    phplog("instance=".get_class($st)); 

    //get a reflection dump of st 
    $ref = new ReflectionClass($st); 
    $string = $ref->__toString();  
    phplog("reflection=".$string); 
} 

Drittens, schauen Sie sich den serialisierten String-Wert an, der in der Sitzung selbst gespeichert wird. Speichern Sie tatsächlich ein serialisiertes Objekt? In Ihrer dev Umgebung, stellen Sie den session.save_path ini Wert in php.ini um so etwas wie/tmp (oder die ini_set Methode verwenden, um die gleiche Sache zu tun):

session.save_path = "/tmp" 

und untersucht dann die erstellten Dateien in/tmp (oder welcher Ordner auch immer). Sie sollten einen String sehen, die mit Beginn des Einsatzes:

statefile:O:.......... 

Der Name der Klasse, die das Objekt instanziiert wird auch dort aufgenommen werden, sowie Werte zu Eigenschaften gespeichert.

0

Versuchen Sie folgendes:

include('StateList.php'); 
    require_once('phplog.php'); 
    // start your session after including your class file 
    session_start(); 

    //start executing here 
    $comd=$_GET['nexturl']; 
    if($comd=="init") { 
    $st = new StateList("../data/statestxt.txt"); 
    $_SESSION['statefile'] = $st; 
    } 

    if($comd =="getstate") { 
    // the ampersand creates a reference, preserving any further changes to your session data 
    $st = &$_SESSION['statefile']; 
    phplog("size=".$st->getSize()); 
    } 
+0

interessanter Code. Ich denke, ich könnte es versuchen. – transilvlad

Verwandte Themen