Speichern von serialisierten Objekten mit private-Membern in derSession

Speichern von serialisierten Objekten mit private-Membern in derSession

am 13.09.2006 14:08:46 von Michael Jostmeyer

Hi,

Jetzt habe ich ein neues Problem.
Ich habe jetzt eine Member-Variable von public auf private gesetzt.
Werte werden mit __get vernünftig gesetzt.
Danach serialisiere ich das Objekt und gebe mir mal den String aus.
Siehe da, das Objekt wurde serialisiert.
Dann speichere ich den String in der Session ab und und gebe den String
aus der Session wieder aus. Jetzt ist plötzlich der String leer.
Wenn ich die Sichtbarkeit des Members wieder auf public setze, wird auch
auf der zweiten Seite der String wieder ausgegeben.
Was zum T... ist denn hier los???

MfG Josi

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 14:36:52 von Knut Kohl

Hallo Michael,

Michael Jostmeyer schrieb am 13. Sep 2006 in de.comp.lang.php.misc:

> Hi,

> Jetzt habe ich ein neues Problem.
> Ich habe jetzt eine Member-Variable von public auf private gesetzt.
> Werte werden mit __get vernünftig gesetzt.
> Danach serialisiere ich das Objekt und gebe mir mal den String aus.
> Siehe da, das Objekt wurde serialisiert.
> Dann speichere ich den String in der Session ab und und gebe den String
> aus der Session wieder aus. Jetzt ist plötzlich der String leer.
> Wenn ich die Sichtbarkeit des Members wieder auf public setze, wird auch
> auf der zweiten Seite der String wieder ausgegeben.
> Was zum T... ist denn hier los???

> MfG Josi

Also bei mir geht das:


class test {
private $a='x';
protected $b='y';
public $c='z';
}

$t = new test;
echo '

';
echo htmlspecialchars(print_r($t,true));
echo '
';

$t = serialize($t);
echo '
';
echo htmlspecialchars(print_r($t,true));
echo '
';

$t = unserialize($t);
echo '
';
echo htmlspecialchars(print_r($t,true));
echo '
';

?>

In http://php.benscom.com/manual/en/language.oop5.magic.php ist ach das
Datenbankbeispiel, das private s speichert.

Knut

--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: Speichern von serialisierten Objekten mit private-Membern inder Session

am 13.09.2006 14:44:11 von Michael Jostmeyer

Knut Kohl schrieb:
> Hallo Michael,
>
> Michael Jostmeyer schrieb am 13. Sep 2006 in de.comp.lang.php.misc:
>
>> Hi,
>
>> Jetzt habe ich ein neues Problem.
>> Ich habe jetzt eine Member-Variable von public auf private gesetzt.
>> Werte werden mit __get vernünftig gesetzt.
>> Danach serialisiere ich das Objekt und gebe mir mal den String aus.
>> Siehe da, das Objekt wurde serialisiert.
>> Dann speichere ich den String in der Session ab und und gebe den String
>> aus der Session wieder aus. Jetzt ist plötzlich der String leer.
>> Wenn ich die Sichtbarkeit des Members wieder auf public setze, wird auch
>> auf der zweiten Seite der String wieder ausgegeben.
>> Was zum T... ist denn hier los???
>
>> MfG Josi
>
> Also bei mir geht das:
>
> >
> class test {
> private $a='x';
> protected $b='y';
> public $c='z';
> }
>
> $t = new test;
> echo '

';
> echo htmlspecialchars(print_r($t,true));
> echo '
';
>
> $t = serialize($t);
> echo '
';
> echo htmlspecialchars(print_r($t,true));
> echo '
';
>
> $t = unserialize($t);
> echo '
';
> echo htmlspecialchars(print_r($t,true));
> echo '
';
>
> ?>
>
> In http://php.benscom.com/manual/en/language.oop5.magic.php ist ach das
> Datenbankbeispiel, das private s speichert.
>
> Knut
>
Hi Knut,

hattest Du das serialisierte $t auch mal in der Session gespeichert?
Wie gesagt, vorher klappts, nur mit dem in der Session gespeicherten
Objekt klappts nicht.

Kann es eventuell mit einem Sonderzeichenproblem zu tun haben? Ich habe
da irgendwelche nicht darstellbaren Sonderzeichen im serialisierten
String, wenn der Member private ist.

Ich hoffe ja, dass ich nicht vor jedem serialize ein encode_xyz machen
muss, dann werde ich wahnsinnig...

MfG Josi

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 15:02:38 von Knut Kohl

Hallo Michael,

Michael Jostmeyer schrieb am 13. Sep 2006 in de.comp.lang.php.misc:

> hattest Du das serialisierte $t auch mal in der Session gespeichert?
> Wie gesagt, vorher klappts, nur mit dem in der Session gespeicherten
> Objekt klappts nicht.

> Kann es eventuell mit einem Sonderzeichenproblem zu tun haben? Ich habe
> da irgendwelche nicht darstellbaren Sonderzeichen im serialisierten
> String, wenn der Member private ist.

> Ich hoffe ja, dass ich nicht vor jedem serialize ein encode_xyz machen
> muss, dann werde ich wahnsinnig...

Dann "urlencode" das serialisierte objct doch mal...

session_start();

class test {
private $a='x';
protected $b='y';
public $c='z';
}

$t = new test;
echo '

';
echo htmlspecialchars(print_r($t,true));
echo '
';

// serializieren + kodieren
$_SESSION['t'] = urlencode(serialize($t));

echo '
';
echo htmlspecialchars(print_r($_SESSION['t'],true));
echo '
';

// dekodieren + deserializieren
$t = unserialize(urldecode($_SESSION['t']));

echo '
';
echo htmlspecialchars(print_r($t,true));
echo '
';

> MfG Josi

Knut

--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: Speichern von serialisierten Objekten mit private-Membern inder Session

am 13.09.2006 15:15:26 von Ulf Kadner

Knut Kohl wrote:

> Dann "urlencode" das serialisierte objct doch mal...

Nee das ist nicht notwendig! Muss auch so gehen.

MfG, Ulf

Re: Speichern von serialisierten Objekten mit private-Membern inder Session

am 13.09.2006 15:17:02 von Michael Jostmeyer

Knut Kohl schrieb:
> Hallo Michael,
>
> Michael Jostmeyer schrieb am 13. Sep 2006 in de.comp.lang.php.misc:
>
>> hattest Du das serialisierte $t auch mal in der Session gespeichert?
>> Wie gesagt, vorher klappts, nur mit dem in der Session gespeicherten
>> Objekt klappts nicht.
>
>> Kann es eventuell mit einem Sonderzeichenproblem zu tun haben? Ich habe
>> da irgendwelche nicht darstellbaren Sonderzeichen im serialisierten
>> String, wenn der Member private ist.
>
>> Ich hoffe ja, dass ich nicht vor jedem serialize ein encode_xyz machen
>> muss, dann werde ich wahnsinnig...
>
> Dann "urlencode" das serialisierte objct doch mal...
>
> session_start();
>
> class test {
> private $a='x';
> protected $b='y';
> public $c='z';
> }
>
> $t = new test;
> echo '

';
> echo htmlspecialchars(print_r($t,true));
> echo '
';
>
> // serializieren + kodieren
> $_SESSION['t'] = urlencode(serialize($t));
>
> echo '
';
> echo htmlspecialchars(print_r($_SESSION['t'],true));
> echo '
';
>
> // dekodieren + deserializieren
> $t = unserialize(urldecode($_SESSION['t']));
>
> echo '
';
> echo htmlspecialchars(print_r($t,true));
> echo '
';
>
>> MfG Josi
>
> Knut
>
Hm, genau das habe ich ja versucht, zu vermeiden... Sind halt einige
Stellen, wo serialisiert und wieder deserialisiert wird...
Muss ich mir halt meine eigene Serialize-Funktion schreiben...
Wenn ich das richtig verstehe, ist das sogar ein Bug von PHP 5.1.4!
http://bugs.php.net/bug.php?id=36693

Nun denn...
MfG Josi

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 15:18:47 von Michael Jostmeyer

Ulf Kadner schrieb:
> Knut Kohl wrote:
>
>> Dann "urlencode" das serialisierte objct doch mal...
>
> Nee das ist nicht notwendig! Muss auch so gehen.
>
> MfG, Ulf
Ich bin auch der Meinung, dass das ohne gehen sollte, aber ich krieg es
einfch nur mit publics hin, sobald ein private drin ist, scheppert's.

MfG Josi

Re: Speichern von serialisierten Objekten mit private-Membern inder Session

am 13.09.2006 15:26:21 von Ulf Kadner

Michael Jostmeyer wrote:

> Jetzt habe ich ein neues Problem.

Du mit Deinen Problemen immer ;-)

> Ich habe jetzt eine Member-Variable von public auf private gesetzt.
> Werte werden mit __get vernünftig gesetzt.
> Danach serialisiere ich das Objekt und gebe mir mal den String aus.
> Siehe da, das Objekt wurde serialisiert.
> Dann speichere ich den String in der Session ab und und gebe den String
> aus der Session wieder aus. Jetzt ist plötzlich der String leer.

Leer oder inexistent? Was sagt isset($_SESSION['whatever'])?
Dann hat Dein Sessionhandling wohl irgendwo nen Fehler.
Schreib einfach mal parallel ne zweite Variable rein und schau ob die
auch nicht ankommt.

Ich nehme an Du beziehst Dich mit dem Posting auf Dein voriges?
Wenn dem so ist. Dein Klassendesign scheint da irgendwie nicht ganz so
das wahre zu sein bzw. ist nicht ganz korrekt. Es gibt nur wenig Fälle
in denen Variable Variable resp. Klassen notwendig sind. Wenn Du schon
dort die Features von PHP5 nutzt, dann kannst Du die Methodenaufrufe da
($this->$func($val)) auch gleich über __call() erledigen.

> Wenn ich die Sichtbarkeit des Members wieder auf public setze, wird auch
> auf der zweiten Seite der String wieder ausgegeben.

Das ist äusserst seltsam! Welche PHP-Version? Was sagt bugs.php.net?

Aber mal abgesehen davon beeinflußt die Sichbarkeit von Klassenvariablen
nicht deren Serialisierungsverhalten. Ich habs gerad mal getest und
konnte alles korrekt weiterreichen/auslesen.

MfG, Ulf

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 16:04:22 von Michael Jostmeyer

Ulf Kadner schrieb:
> Michael Jostmeyer wrote:
>
>> Jetzt habe ich ein neues Problem.
>
> Du mit Deinen Problemen immer ;-)
Sorry, bin ein Problemkind ;-)
>
> Leer oder inexistent? Was sagt isset($_SESSION['whatever'])?
Da stand dann kein Objekt sondern ein serialisiert Nicht-Objekt drin.
(Zumindest verstehe ich "b:0;" so)
> Dann hat Dein Sessionhandling wohl irgendwo nen Fehler.
> Schreib einfach mal parallel ne zweite Variable rein und schau ob die
> auch nicht ankommt.
Die Session selber bleibt erhalten, sonst würde ich die zweite Seite
erst gar nicht angezeigt bekommen.
> Ich nehme an Du beziehst Dich mit dem Posting auf Dein voriges?
> Wenn dem so ist. Dein Klassendesign scheint da irgendwie nicht ganz so
> das wahre zu sein bzw. ist nicht ganz korrekt. Es gibt nur wenig Fälle
> in denen Variable Variable resp. Klassen notwendig sind. Wenn Du schon
> dort die Features von PHP5 nutzt, dann kannst Du die Methodenaufrufe da
> ($this->$func($val)) auch gleich über __call() erledigen.
Wo habe ich denn das nochmal verwendet? Hm, zumindest war das eine
andere Baustelle.
>
>> Wenn ich die Sichtbarkeit des Members wieder auf public setze, wird auch
>> auf der zweiten Seite der String wieder ausgegeben.
>
> Das ist äusserst seltsam! Welche PHP-Version? Was sagt bugs.php.net?
Ich verwende 5.1.4, habe bei bugs.... nur so etwas gefunden, bin da bei
http://de.php.net/manual/de/function.serialize.php auf einen Beitrag
gestossen, wo
http://bugs.php.net/bug.php?id=36693
genannt wird. Scheint sich um etwas ähnliches zu handeln.
>
> Aber mal abgesehen davon beeinflußt die Sichbarkeit von Klassenvariablen
> nicht deren Serialisierungsverhalten. Ich habs gerad mal getest und
> konnte alles korrekt weiterreichen/auslesen.
>
> MfG, Ulf
MfG Josi

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 16:16:44 von Ulf Kadner

Michael Jostmeyer wrote:

> Da stand dann kein Objekt sondern ein serialisiert Nicht-Objekt drin.
> (Zumindest verstehe ich "b:0;" so)

Das ist (bool)FALSE

> Die Session selber bleibt erhalten, sonst würde ich die zweite Seite
> erst gar nicht angezeigt bekommen.

asso

> Ich verwende 5.1.4, habe bei bugs.... nur so etwas gefunden, bin da bei
> http://de.php.net/manual/de/function.serialize.php auf einen Beitrag
> gestossen, wo
> http://bugs.php.net/bug.php?id=36693
> genannt wird. Scheint sich um etwas ähnliches zu handeln.

Bevor wir weiter rumraten.

Sende mal ein nicht funktionierendes Minimal-Beispiel.

Bei mir Linux+PHP 5.1.2 hab ich keine Probleme damit bisher gehabt.

Hast Du das Bsp. von Knut mal ausprobiert?

MfG, Ulf

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 17:09:30 von Ulf Kadner

Michael Jostmeyer wrote:

> Ich verwende 5.1.4, habe bei bugs.... nur so etwas gefunden, bin da bei
> http://de.php.net/manual/de/function.serialize.php auf einen Beitrag
> gestossen, wo
> http://bugs.php.net/bug.php?id=36693
> genannt wird. Scheint sich um etwas ähnliches zu handeln.

Unabhängig von der Bugmeldung!

Ich muss das mal wieder ewas genauer ausführen, da ich befürchte das
alles einem Missverständnis unterliegt.

Ich tippe darauf, das Du serialize ausserhalb der Klasse einsetzt? Wenn
das so ist verstehe ich warum da nix drin steht (bzw. false)

In dieser Situation greift natürlich die Sichbarkeit von Variablen.
Ich implementiere grundsätzlich eine serialize und eine unserialize
Methode in die Klasse (am Sinnvollsten natürlich durch durch
Implementierung des Interfaces 'Serializable'). Damit sind alle
Sichbarkeitsbereiche natürlich abgedeckt.

http://www.php.net/~helly/php/ext/spl/interfaceSerializable. html

Ich hatte mal wieder angenommen das das schon klar ist.

OK?

MfG, Ulf

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 17:17:30 von Michael Jostmeyer

Ulf Kadner schrieb:
> Michael Jostmeyer wrote:
>
>> Ich verwende 5.1.4, habe bei bugs.... nur so etwas gefunden, bin da bei
>> http://de.php.net/manual/de/function.serialize.php auf einen Beitrag
>> gestossen, wo
>> http://bugs.php.net/bug.php?id=36693
>> genannt wird. Scheint sich um etwas ähnliches zu handeln.
>
> Unabhängig von der Bugmeldung!
>
> Ich muss das mal wieder ewas genauer ausführen, da ich befürchte das
> alles einem Missverständnis unterliegt.
>
> Ich tippe darauf, das Du serialize ausserhalb der Klasse einsetzt? Wenn
> das so ist verstehe ich warum da nix drin steht (bzw. false)
Ja, aber das gleich alles weg ist...
>
> In dieser Situation greift natürlich die Sichbarkeit von Variablen.
> Ich implementiere grundsätzlich eine serialize und eine unserialize
> Methode in die Klasse (am Sinnvollsten natürlich durch durch
> Implementierung des Interfaces 'Serializable'). Damit sind alle
> Sichbarkeitsbereiche natürlich abgedeckt.
>
> http://www.php.net/~helly/php/ext/spl/interfaceSerializable. html
>
> Ich hatte mal wieder angenommen das das schon klar ist.
>
> OK?
>
> MfG, Ulf
Hm, jetzt war ich schon dabei, ein Minimalbeispiel zu tippen ;-)
Ne, das Interface ist mir neu. Werd es damit mal ausprobieren.
Wo kriege ich eigentlich dieses Profiwissen her? Habe ich bisher noch
nirgends gelesen... (*Mal wieder auf Buchempfehlungen anspiel*)

Gruss Josi

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 17:21:21 von Knut Kohl

Hallo Ulf,

Ulf Kadner schrieb am 13. Sep 2006 in de.comp.lang.php.misc:

> Michael Jostmeyer wrote:

>> Ich verwende 5.1.4, habe bei bugs.... nur so etwas gefunden, bin da bei
>> http://de.php.net/manual/de/function.serialize.php auf einen Beitrag
>> gestossen, wo
>> http://bugs.php.net/bug.php?id=36693
>> genannt wird. Scheint sich um etwas ähnliches zu handeln.

> Unabhängig von der Bugmeldung!

> Ich muss das mal wieder ewas genauer ausführen, da ich befürchte das
> alles einem Missverständnis unterliegt.

> Ich tippe darauf, das Du serialize ausserhalb der Klasse einsetzt? Wenn
> das so ist verstehe ich warum da nix drin steht (bzw. false)

Hmm, ich habe es so verstanden, dass er ein Object serializieren will,
also von außerhalb.

Unabhängig davon:
Muß die Klasse, die man "deserialisieren" will zu dem Zeitpunkt nicht
schon deklariert sein?!
Vielleicht scheitert es ja daran, dass Michael das zuerst deserialisiert
und später erst die Klasse deklariert?.

> In dieser Situation greift natürlich die Sichbarkeit von Variablen.
> Ich implementiere grundsätzlich eine serialize und eine unserialize
> Methode in die Klasse (am Sinnvollsten natürlich durch durch
> Implementierung des Interfaces 'Serializable'). Damit sind alle
> Sichbarkeitsbereiche natürlich abgedeckt.

> http://www.php.net/~helly/php/ext/spl/interfaceSerializable. html
> Ich hatte mal wieder angenommen das das schon klar ist.
> OK?

> MfG, Ulf

Knut


--
Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: Speichern von serialisierten Objekten mit private-Membern inder Session

am 13.09.2006 17:29:18 von Michael Jostmeyer

Knut Kohl schrieb:
> Hallo Ulf,
>
>> Ich tippe darauf, das Du serialize ausserhalb der Klasse einsetzt?
>> Wenn das so ist verstehe ich warum da nix drin steht (bzw. false)
>
> Hmm, ich habe es so verstanden, dass er ein Object serializieren will,
> also von außerhalb.
Stimmt.
>
> Unabhängig davon:
> Muß die Klasse, die man "deserialisieren" will zu dem Zeitpunkt nicht
> schon deklariert sein?!
> Vielleicht scheitert es ja daran, dass Michael das zuerst deserialisiert
> und später erst die Klasse deklariert?.
Da kann das Problem nicht liegen, da ich ja die Klasse ohne privates,
also nur publics einwandfrei deserialisiert bekomme.
Wie bereits gesagt, ich muss mich mit dem SPL mal auseinandersetzen und
Serializable implementieren.

Mfg Josi

Re: Speichern von serialisierten Objekten mit private-Membern in der Session

am 13.09.2006 19:15:51 von Ulf Kadner

Michael Jostmeyer wrote:

> Ich habe jetzt mal die Klasse jetzt mit den Funktionen erweitert
> (Apropos: Ein ... implements Serializable gem. SPL funktionierte bei mir
> nicht, da hat sich dann die Seite aufgehängt. Muss ich dafür noch
> irgendwas einbinden?)

Im Manual zu serialize() (UCN) steht ein Beispiel.

> Allerdings habe ich dann Knuts Ratschlag zu Herzen genommen und bei
> serialize ein urlencode und bei unserialize ein urldecode zusätzlich
> verwendet. Damit hat es geklappt. Es läuft.

Keine Ahnung was da ist. Hatte ich noch nie. Vieleicht weis da jemand
anderes was drüber.

Wenn ich urlencode verwende geht garnix mehr. Da bekomm ich nen Fatal
Error. (Unknown Object) wenn ich auf Eigenschaften/Methoden zugreifen will.

MfG, Ulf