2009-02-13 17 views
6

Come mai unserialize non sta ripristinando il mio array? Vedere il codice seguente ..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'])); 

capisco perché il print_r ($ response) mi dà niente

** Edit - Ho notato che questo

Avviso: unserialize() [function.unserialize]: Errore all'offset 6 di 2797 byte in /home/reitinve/public_html/action/doc.php on line 13

Che cosa significa?

+1

tua domanda ha salvato la mia giornata! – thpoul

risposta

3

E 'possibile $item['response'] contiene degli spazi bianchi prima o dopo?

check strlen($item['response']) ti dà 61.

Edit: Sembra funzionare con spazi bianchi alla fine, ma gli spazi bianchi all'inizio renderà non riescono a unserialize.

Edit: quel messaggio di errore significa che o si hanno un sacco di spazio bianco (quasi 2kb di esso), o $item['response'] viene modificata mentre echo e unserialize

+0

Questa è la mia ipotesi. – cwallenpoole

+0

ho provato a mettere un trim come unserialize (trim ($ item ['response'])). Il rivestimento dovrebbe aver rimosso gli spazi bianchi giusto? – John

+0

Sì. La stringa che dici è echo è 61 byte, ma PHP dice che stai provando a non serializzare 2797 byte, quindi qualcosa sta succedendo ... – Greg

1

funziona per me bene. sei sicuro che $item['response'] sia una stringa? si, sembra che porti degli spazi bianchi.

e sul tuo server dev php non dovrebbe mai darti "niente". dovrebbe essere configurato per produrre tutti gli errori, gli avvertimenti e le notifiche. inoltre puoi usare http://php.net/var_dump invece di print_r perché ti dà più informazioni.

+0

Se il parametro unserialize non è una stringa, verrà visualizzato un avviso. – cwallenpoole

+0

mostra se le stringhe iniziano anche con lo spazio. – SilentGhost

+0

true, ma la configurazione predefinita non mostrerà le notifiche – Greg

0

Ecco perché ho avuto questo problema e come ho lavorato out:

ero memorizza una matrice in mio ingresso simile a questo:

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

Qui, ho dovuto usare htmlspecialchars() causa di possibili errori di analisi.

Poi, quando ho provato a unserialize, mi ha dato questo errore Error at offset X of Y bytes in .... Ho stampato la stringa non serializzata sullo schermo, ho capito che l'html equivalente di alcuni caratteri stava causando l'errore.

Per essere più chiari, le doppie virgolette codici html %22 causavano questo errore. Così li ho sostituiti con caratteri di citazione e ha funzionato.

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

Quindi è meglio verificare se c'è qualsiasi codice html nella stringa serializzata e sostituirli indietro con personaggi originali.

0

fare attenzione se si mai provato a mettere una matrice di serializzato in una textarea, per poi passare da qualche altra parte tramite Ajax, si può encouter problemi con i caratteri speciali come la e commerciale (&) che verranno convertsed a anche "& amp ; ", e questo è sufficiente per il tuo array" serializzato "da non ripristinare.

Ho trovato l'uso di rawurlencode e rawurldecode molto utile per rendere la mia serializzazione a prova di proiettile, indipendentemente da come viene trasportata attraverso i miei script;

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

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

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