2009-02-13 5 views
6

Wie kommt es, unserserialize mein Array nicht wiederherstellen? Siehe Code unten ..PHP unserialize Problem

// prints a:1:{s:8:"txn_type";s:32:"recurring_payment_profile_cancel";} 
echo $item['response']; 

// prints nothing 
print_r(unserialize($item['response'])); 

Ich verstehe, warum die print_r ($ response) gibt mir nichts

** edit - Ich bemerkte dieses

Hinweis: unserialize() [function.unserialize]: Fehler bei Offset 6 von 2797 Bytes in /home/reitinve/public_html/action/doc.php in Zeile 13

Was bedeutet das?

+1

Ihre Frage hat meinen Tag gerettet! – thpoul

Antwort

3

Ist es möglich, $item['response'] enthält einige Leerzeichen davor oder danach?

prüfen strlen($item['response']) gibt Ihnen 61.

Edit: Es scheint, mit Leerzeichen am Ende zu arbeiten, aber Leerzeichen am Anfang wird es unserialize machen scheitern.

Edit: die Fehlermeldung bedeutet, entweder Sie eine Menge von Leerzeichen haben (fast 2 kb davon), oder $item['response'] wird es zwischen den echo und den unserialize

+0

Das ist meine Vermutung. – cwallenpoole

+0

Ich habe versucht, eine Trimmung wie unserialize (trim ($ item ['Antwort']))). Die Trimmung sollte Leerzeichen entfernt haben, oder? – John

+0

Ja. Die Zeichenfolge, die Sie sagen, ist echo'd ist 61 Bytes, aber PHP sagt, dass Sie versuchen, 2797 Bytes zu deserialisieren, also ist etwas los ... – Greg

1

funktioniert für mich ganz gut. Sind Sie sicher, dass $item['response'] eine Zeichenfolge ist? Ja, scheint wie führende Whitespaces zu sein.

und auf Ihrem Dev-Server php sollte nie geben Sie 'nichts'. Es sollte so konfiguriert werden, dass alle Fehler, Warnungen und Hinweise erzeugt werden. Sie können auch http://php.net/var_dump anstelle von print_r verwenden, um mehr Informationen zu erhalten.

+0

Wenn der Parameter von unserialize keine Zeichenfolge ist, wird eine Warnung angezeigt. – cwallenpoole

+0

zeigt es an, wenn Zeichenfolgen auch mit Leerzeichen beginnen. – SilentGhost

+0

true, aber die Standardkonfiguration zeigt keine Benachrichtigungen – Greg

0

hier, warum hatte ich dieses Problem und wie ich gearbeitet geändert werden out:

ich ein Array in meinem Eingang ähnlich wie diese zu speichern:

value="<?php echo htmlspecialchars(serialize(array($a, $b))); ?>" 

Hier hatte ich htmlspecialchars() wegen möglicher Parse-Fehler zu verwenden.

Als ich dann versuchte, unserialisieren, gab es mir diesen Error at offset X of Y bytes in ... Fehler. Ich druckte die unserialisierte Zeichenfolge auf dem Bildschirm, erkannte, dass HTML-Entsprechungen einiger Zeichen den Fehler verursachten.

Um klarer zu sein, verursachte doppelte Anführungszeichen html Codes %22 diesen Fehler. Also habe ich sie wieder mit Zitatzeichen ersetzt und es hat funktioniert.

unserialize(str_replace('%22', '"', $_POST['serialized'])); 

So ist es besser, zu überprüfen, ob es irgendwelche HTML-Codes in der serialisierten Zeichenfolge und ersetzen Sie sie durch Original Zeichen zurück.

0

auch vorsichtig sein, wenn Sie jemals eine serialisierte Array in einem Textfeld zu setzen versuchen, es schließlich über Ajax woanders passieren, kann Probleme mit Sonderzeichen wie das Ampersand (&) encouter, die auf "& amp convertsed werden ; ", und dies ist genug für Ihr" serialisiertes "Array, das nicht wiederhergestellt wird.

Ich fand die Verwendung von Rawurlencode und Rawurlcode sehr hilfreich, um meine Serialisierung kugelsicher zu machen, egal wie sie über meine Skripte übertragen wird;

$myArray = array("Bugs Bunny", "Tom & Jerry"); 

$serialized = rawurlencode(serialize($myArray)); 

$myUnserializedArray = rawurldecode(unserialize($serialized));