begin process at 2012 05 27 20:45:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > UNSERIALIZE ERROR

UNSERIALIZE ERROR


 Information sur la source



 Description

Voici un exemple permettant de différencier une erreur et un booléen false retourné par la fonction unserialize.

Dans la documentation PHP de unserialize() la valeur de retour est:
"La valeur convertie est retournée par la fonction, et peut être de type booléen, entier, nombre décimal, chaîne de caractères, tableau ou objet.
Si la chaîne passée ne peut être délinéarisée, cette fonction retourne FALSE et une erreur E_NOTICE est émise."

On peut donc confondre un booléen (false) unserialisé et une erreur. Au début je pensais utiliser la fonction error_get_last() mais lorsque l'on a plusieurs unserialize qui se suivent, cela peut poser problème.

L'exemple suivant montre donc comment détecter ce type d'erreur...

Source

  • <?php
  • $unserialize_err = false;
  • $str = 'test';
  • set_unserialize_ErrorHandler();
  • $res = unserialize($str);
  • unset_unserialize_ErrorHandler();
  • var_dump($unserialize_err);
  • var_dump($res);
  • $str = serialize(false);
  • set_unserialize_ErrorHandler();
  • $res = unserialize($str);
  • unset_unserialize_ErrorHandler();
  • var_dump($unserialize_err);
  • var_dump($res);
  • function unserialize_ErrorHandler() {
  • global $unserialize_err;
  • $unserialize_err = true;
  • }
  • function set_unserialize_ErrorHandler() {
  • global $unserialize_err;
  • $unserialize_err = false;
  • set_error_handler('unserialize_ErrorHandler');
  • }
  • function unset_unserialize_ErrorHandler() {
  • restore_error_handler();
  • }
<?php
$unserialize_err = false;

$str = 'test';
set_unserialize_ErrorHandler();
$res = unserialize($str);
unset_unserialize_ErrorHandler();
var_dump($unserialize_err);
var_dump($res);

$str = serialize(false);
set_unserialize_ErrorHandler();
$res = unserialize($str);
unset_unserialize_ErrorHandler();
var_dump($unserialize_err);
var_dump($res);

function unserialize_ErrorHandler() {
  global $unserialize_err;
  $unserialize_err = true;
}
function set_unserialize_ErrorHandler() {
  global $unserialize_err;
  $unserialize_err = false;
  set_error_handler('unserialize_ErrorHandler');
}
function unset_unserialize_ErrorHandler() {
  restore_error_handler();
}



 Sources du même auteur

Source avec Zip EXEMPLE D'UTILISATION D'UN TUBE NOMMÉ UNIX

 Sources de la même categorie

AFFICHÉ SUR UN TABLEAU AVEC PAGINATION ET BASE DE DONNÉES par stormxp
Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000

 Sources en rapport avec celle ci

Source avec Zip DÉBOGAGE D'UN CODE PHP (SUIVIT DES VARIABLES) par originalcompo
RÉCUPÉRATION DES OBJETS STOCKÉS DANS UNE SESSION par jsgorre
TRAITER LES ERREURS PHP GRAVES, NON INTERCEPTABLES par FredT
GARDER LES PARAMÈTRES D'UNE CLASS À TRAVERS PLUSIEURS PAGES. par massacr
Source avec Zip [PHP5] XML OBJECT SERIALIZER/UNSERIALIZER par malalam

Commentaires et avis

Commentaire de neigedhiver le 19/12/2010 17:12:49

Salut,

J'ai un peu de mal à comprendre l'intérêt de cette source... Serait-il possible d'avoir un exemple concret d'application ?

Commentaire de abdoulax le 19/12/2010 17:42:22

C'est juste un exemple qui permet de savoir comment détecter une erreur de déserialisation. Après tu en as besoin ou pas... Je me suis retrouvé face à ce problème, je partage donc cette solution. Après il y a de forte chance que ceci ne soit pas très utile pour la plupart d'entre vous.

Un exemple d'utlisation pourrait être une api qui reçoit différent type de data sérialisé ou NON.

Commentaire de neigedhiver le 19/12/2010 17:54:58

Je vois toujours pas l'utilité...

if (FALSE === ($unserialized_data = unserialize($data))) {
  // Erreur de délinéarisation
}
// on peut ici utiliser $unserialized_data normalement

En quoi ta source apporte un plus par rapport aux 3 lines de codes ci-dessus ?

Attention : je ne dis pas que ta source est inutile, juste que je ne comprends pas son intérêt.

Commentaire de abdoulax le 19/12/2010 18:16:02

$data = serialize(false);
$res = unserialize($data);

Dans ce cas $res === false. Mais ce n'est pas une erreur! C'est la bonne valeur.

$data = 'test';
$res = unserialize($data);

Là aussi $res === false. Cette fois ci c'est réelement une erreur.

On se retrouve donc avec deux résultat identique mais qui ont une valeur différente, l'une est un booléen false unserialisé, l'autre est une erreur.

J'espère que tu comprends mieux maintenant. :-)
Mais il vrai que c'est un cas vraiment spécifique...

Commentaire de neigedhiver le 19/12/2010 18:47:07

Ok, pardon, j'avais pas percuté ce cas très particulier.
Ok, donc le seul moyen d'être certain de délinéariser correctement une variable qui PEUT être identique à FALSE, c'est d'intercepter l'erreur. J'avais mal lu la description de ta source, qui est pourtant claire.

Bon alors du coup, moi j'aurais pas fait comme ça... J'aurais TOUT mis dans une seule fonction, y compris le gestionnaire d'erreur spécifique, grâce aux fonctions anonymes (closures) de PHP5.3. Et pour le coup, pour permettre à l'utilisateur d'attraper facilement l'erreur, je lèverais une exception. Ca donnerait un truc comme ça :

function safe_unserialize($data) {
$error_handler = function() {throw new Exception('Unserialization error : data is not a valid serialized value');};
set_error_handler($error_handler);
$return = unserialize($data);
restore_error_handler();
return $return;
}

Utilisation :

try {
$unser = safe_unserialize('FALSE');
var_dump($unser);
}
catch (Exception $e) {
echo $e -> getMessage();
}

Commentaire de abdoulax le 19/12/2010 20:12:47

C'est aussi une autre méthode. Mais dans mon cas cette méthode ne marche pas car le serveur est configuré pour ne pas prendre en compte les erreurs E_NOTICE. Donc si je ne me trompe pas il faudrait rajouter le paramètre E_NOTICE à set_error_handler().

function safe_unserialize($data) {
$error_handler = function() {throw new Exception('Unserialization error : data is not a valid serialized value');};
set_error_handler($error_handler, E_NOTICE);
$return = unserialize($data);
restore_error_handler();
return $return;
}

Mais là je ne suis pas sûr... Il faudrait que je test sur le serveur en question.

Commentaire de neigedhiver le 19/12/2010 22:38:40

Plus exactement, il n'est peut être pas configuré pour "afficher" les erreurs...
error_reporting(E_NOTICE);
par exemple.
?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Probleme avec serialize et unserialize [ par matou82 ] J'ai un objet que je serialize et passe en paramètre dans l'url d'un popup.Dans ce popup je le unserialize. Il s'agit d'un objet possédant une fonctio par rapport aux session [ par C ] bonjour, alors voila mon site me sors ce message d'erreur :------------------------------------------------------Parse error: parse error, expecting ` J'Ai Une Erreur Dans Mon Script [ par BenXbox ] Il me dit que y a une erreur :Parse error: parse error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in c:\site\cowsp\connect.php Probleme syntaxe mysql [ par zzzzzz ] salut.j'ai un probleme avec ma syntaxe sql voici mon code:&lt;body bgcolor="#000000"&gt;&lt;?include('connection_mysql.php');$date = "date('d/m/y') da PHP / NuSOAP : Xml parsing error [ par pete87150 ] Bonjour,J'ai créé un service web tout simple pour tester : [WebService(Description="Bienvenue sur le service Web de démo",Namespace="WordGeneration")] 2 tables MySQL en interaction, c'est possible ??? [ par pyranhaz ] Bonjour,Je cherche à élaborer une astuce qui permet à mon anti-aspirateur de lister l'hôte des robots pour éviter qu'ils soient bannis...mon anti-aspi Probléme de variable et redirection [ par Nathbest ] Bonjour a tous voici mon probléme: j'ai une page web qui vérifi si on est identifié pour pouvoir voir cette page, si on lé pa elle nou renvoi a la pag Prob Upload d'image... [ par zzzzzz ] yepj'ai un formulaire qui envoie une image cela marche parfaitement. Mais dans la partie vérification (les conditions marchent parfaitement) l'image n fatal error sur chargement de class [ par fabrice_pi ] salut à tous,j'utilise une classe PHP pour faire mes taleaux en html. depuis peu j'ai l'erreur suivante :Fatal error: Cannot instantiate non-existent gros probleme parse error d'un debutant [ par daikmo ] Je compte construire un site ecommerce avec sudbox mais bleme!!!jai le message : Parse error: parse error, unexpected '}'kelk1 pourrait il me sauver ?


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales