2010-05-22 3 views
4

J'utilise les fonctions serialize/unserialize dans php 5.2. le texte à stocker est POSTé via un formulaire. btw, pas de blanc avant ou après. si le texte contient "ou" il sérialise avec succès. Le problème est qu'il neproblème de désérialisation dans php

+0

Pourquoi êtes-vous ding cela? Pourquoi ne pas utiliser des sessions ou autres? - Envoyer des données et les recevoir via POST signifie que l'utilisateur peut les modifier et doit transférer plus de données dans les deux sens. – johannes

+0

Toutes les données sont stockées dans des fichiers au format sérialisé. SESSIONS ne le coupe pas. – opteronn

+0

Eh bien, laissez-moi comprendre. Vous recevez des données du formulaire POST, puis sérialiser $ _POST tableau et écrire la chaîne résultante dans un fichier? Et puis vous le relisez, les données ne se désérialisent pas. Droite? –

Répondre

1

unserialize pas. ce que je fais mal? Quand vous sérialiser, vous devez utiliser addslashes et quand vous unserialize, utilisez stripslashes fonction .

Exemple:.

if (get_magic_quotes_gpc()) 
{ 
    serialize($variable); 
} 
else 
{ 
    addslashes(serialize($variable)); 
} 

if (get_magic_quotes_gpc()) 
{ 
    stripslashes(unserialize($variable)); 
} 
else 
{ 
    unserialize($variable); 
} 
+0

il n'a pas sérialisé du tout – opteronn

+0

@Web qui vous a dit que? –

+0

@Kurt: Vous pourriez avoir des citations magiques allumé, voir ma réponse mise à jour.Egalement quelle erreur obtenez-vous s'il y en a? –

4

est probablement les guillemets magiques en réponse à un tel comportement Ainsi, pour unseria Lize vous pourriez avoir à faire un stripslashes() d'abord:

if (get_magic_quotes_gpc()) $data = stripslashes($data); 

bien qu'il est presque impossible d'avoir magic_quotes sur un système 5.2 ...
dire quelque chose certaine, vous devez trouver une différence entre la formation initiale et renvoyé des données.

Mais de toute façon, pourquoi n'utilisez-vous pas des sessions au lieu d'envoyer des données au navigateur et de retour? Des sessions en effet plus rapides et sécurisées. Ajouter des barres obliques aux guillemets résout le problème.

+0

Je suis désolé j'ai oublié de dire que le texte à sérialiser est ARRAY_ASSOCIATIVE (probablement) à cause de cette fonction STRIPSLASHES ne fonctionne pas – opteronn

+0

Toutes les données sont stockées dans des fichiers au format sérialisé SESSIONS ne le coupe pas – opteronn

+0

Je suis désolé @Kurt, mais stripslashes n'a pas HING à faire avec des tableaux. Cela fonctionne avec des chaînes. Et ça fonctionne toujours. Quoi qu'il en soit, les citations magiques sont une supposition, et pour vous dire quelque chose de certain, vous devez trouver une différence entre les données initiales et retournées. Ou au moins apporter les deux cordes ici –

0

Jetez un oeil à mon code: http://codepad.org/7JWa2BT6

+1

Mauvais commentaire. J'avais échappé aux variables avant de former le tableau d'où l'ajout de barres obliques travaillées. La chaîne sérialisée doit être échappée. pas l'inverse –

8

David Walsh a une solution simple:

//to safely serialize 
$encoded_serialized_string = base64_encode(serialize($your_array)); 

//to unserialize 
$array_restored = unserialize(base64_decode($encoded_serialized_string)); 

http://davidwalsh.name/php-serialize-unserialize-issues

+0

Ça marche! Mais j'aimerais savoir si cela sera corrigé sur une version ultérieure de PHP et quelles sont les origines de ce problème. –

+1

Ce n'est pas un bug avec PHP. Comme les réponses ultérieures le suggèrent, vous devez utiliser addslashes pour vous assurer que vos citations sont échappées. La solution de David Walsh fonctionne car elle convertit tout en une chaîne base64 ne contenant pas de guillemets. J'ai personnellement utilisé cette méthode lorsque j'avais besoin de conserver des objets stdClass dans des fichiers plats lors du développement sur un système sans que les guillemets magiques ne soient activés et déployés sur un serveur. – Eclectic

Questions connexes