Communauté Clubic

[RESOLUS][PHP]Tester si une variable est sérializé

Saloute à tous :oui:

Une fois n’est pas coutume, à moi de poser une question : j’ai une appli où, dans ma base, je stock pas mal d’objet ou de tableau “serializé”. J’effectue donc l’opération inverse lors de la lecture de la table pour pouvoir utiliser les données dans l’application.

Le bout de code est le suivant :


$var = is_array( unserialize($row["var"]) ) ? unserialize($row["var"]) : array();

La variable est donc “unserializé” deux fois : une fois pour vérifier que c’est bien une donnée sérializé (car il peut très bien y’avoir des résultats non sérializé, par exemple une case vide), une deuxième fois pour effectuer l’unserialize. Cela peut-être assez peu économe en terme de ressource pour le serveur (surtout avec des gros objets complexes). :neutre:

Ma question est donc : y’aurait-il un moyen plus simple et plus économe d’effectuer cette vérification ? :jap:
Genre :


$var = is_serialize($row["var"]) ) ? unserialize($row["var"]) : array();

Tu dois pouvoir faire


$var = unserialize($row["var"]);
if(!is_array($temp)) $var = array();

Tu ne fais qu’un seul unserialize, mais ça te rajoute au pire une affectation. Vu qu’unserialize est plus complexe qu’une affectation, tu y gagnes.

le pb c’est que si la variable n’est pas serializé, ça me pond un warning (ceci dit je peux mettre un @ devant pour retirer l’affichage) :neutre: …

J’ai trouvé ça en googlisant, mais je ne sais pas du tout si ça marche :

Définis la fonction suivante :

function is_serialized($data){
    if (trim($data) == "") {
        return false;
    }
    if (preg_match("/^(i|s|a|o|d)(.*);/si",$data)) {
        return true;
    }
    return false;
}

Puis après, tout simplement :

if(is_serialized($row["var"]) $var = unserialize($row["var"]);

Trouvé ici : http://www.weberdev.com/get_example-4099.html

Si ça ne marche pas, supprimer le warning par un @ est suffisant je pense :wink:

ok c’est good :wink:

j’ai améliorer l’expression régulière comme ça :


/^(i|s|a|o|d){1}:{1}(.*)/si

de façon à être sur qu’il n’y a qu’une seule lettre, suivis de : une seule fois … ce qui devrait permettre de supprimer pas mal d’erreur :oui:

testé et valider :oui:

merci pour ton aide :super:

tu sais que tu peux pondre ta propre fonction de sérialisation et inclure les éléments vides? (par fonction j’entend ta propre routine)

Aussi, si ta case est vide… ça ne serait pas plus simple d’y mettre la valeur NULL et de faire un test $array = $row[“var”] === null ? array():unserialize(…).

Etc?

http://php.net/manual/en/function.is-array.php
testé et valider :oui:

merci pour ton aide :super:

salut tout le monde

<?php $yes = array('this', 'is', 'an array'); echo is_array($yes) ? 'Array' : 'not an Array'; echo "\n"; $no = 'this is a string'; echo is_array($no) ? 'Array' : 'not an Array'; ?>

ip finder