PHP: json_encode vs sérialiser pour stocker dans une base de données MySQL?
Je suis le stockage de certaines données non structurées (un tableau à clé) dans un champ de ma table, et je suis actuellement en utilisant serialize () et unserialize() afin de les "convertir" en arrière à partir de la matrice de chaîne.
Chaque maintenant et puis, cependant, j'ai des erreurs lors de la désérialisation des données. Je crois que ces erreurs se produisent parce que des données Unicode dans les cordes à l'intérieur du tableau, j'en suis la sérialisation, bien qu'il existe quelques enregistrements avec des données Unicode qui fonctionnent tout aussi bien. (DB champ est UTF-8)
Je me demandais si l'utilisation de json_encode au lieu de sérialiser fera la différence /le rendre plus résistant. Ce n'est pas anodin pour moi de tester, étant donné que dans mon environnement de dev, tout fonctionne bien, mais dans la production, chaque maintenant et puis (environ 1% des dossiers), je reçois un message d'erreur.
Btw, je sais que je suis weaseling de la découverte d'une véritable explication du problème et seulement aveuglément essayer quelque chose, je suis un peu en espérant que je peux me débarrasser de ce sans passer trop de temps sur elle.
Pensez-vous à l'aide de json_encode au lieu de sérialiser va le rendre plus résilient à la "sérialisation des erreurs"? Le format des données n'a pas l'air plus "indulgent" pour moi...
Mise à JOUR: L'erreur que j'obtiens est:
Notice: unserialize(): Error at offset 401 of 569 bytes in C:\blah.php on line 20
Merci!
Daniel
source d'informationauteur Daniel Magliola
Vous devez vous connecter pour publier un commentaire.
JSON a un avantage principal :
PHP
serialize
a un avantage principal :(Oui, ces avantages sont à l'exact opposé les uns des autres)
Dans votre cas, comme vous le stockage des données n'est pas vraiment structuré, les deux formats devrait fonctionner assez bien.
Et le codage de la solution à votre problème ne devrait pas être lié à sérialiser par lui-même : tant que tout (DB, la connexion à la DB, les fichiers PHP, ...) est en UTF-8, la sérialisation devrait fonctionner aussi.
Les gens à FriendFeed opté pour une solution similaire à l'aide de JSON. Vous devriez vérifier leur post de blog à ce sujet.
Si le problème est (et je crois que c'est) dans l'encodage UTF-8, il n'y a pas de différence entre
json_encode
etserialize
. Les deux vont quitter encodage de caractères inchangé.Vous devriez assurez-vous que votre base de données/connexion est correctement mis en place pour gérer tous les caractères UTF-8 ou encoder l'ensemble de l'enregistrement en codage pris en charge avant de l'insérer dans la DB.
Aussi, merci de préciser "je reçois une erreur".
Trouvé ça dans le PHP docs...
Je n'ai pas tout à fait le comprendre, mais il a travaillé pour unserialize les données que je ne pouvais pas unserialize avant. Déplacé en JSON maintenant, je vais le rapport dans quelques semaines si cela a résolu le problème de façon aléatoire l'obtention de certains dossiers "corrompu"
json_encode() convertit les caractères non ASCII symboles (par exemple, “Schrödinger” devient “Schr\u00f6dinger”), mais la fonction serialize() ne fonctionne pas.
Source: https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make#common-mistake-6--ignoring-unicodeutf-8-issues
De quitter les caractères UTF-8 intacte, vous pouvez utiliser l'option JSON_UNESCAPED_UNICODE de PHP 5.4.
Source: https://stackoverflow.com/a/804089/1438029
Comme une décision de conception, j'avais opter pour le stockage de JSON, car il ne peut que représenter une structure de données, tandis que la sérialisation est lié à un PHP objet de données de signature.
Les avantages que je vois sont:
* vous êtes obligé de séparer le stockage de données de toute logique couche sur le dessus.
* vous êtes indépendant de la modification de l'objet de données de classe (disons, par exemple, que vous souhaitez ajouter un champ).