Page 1 sur 1

unzerialize bug

Posté : 05 août 2011, 10:37
par Invité
Bonjour à tous,

Je rencontre quelque problème en utilisant la fonction unsérialize

Je cherche à l'utiliser sur un champs de ma bdd qui contient des adresses sous forme sérializé. Voici la ligne stocké en bdd dans la colonne datavalue
a:3:{i:0;s:12:"34 rue pouet";i:1;s:12:"45 rue prout";i:2;s:15:"78avenue machin";}

Dans mon php je fais
$list_adress;
$result = $this->facturemodel->get_companyadress($_POST['id_groupe']);
foreach($result as $adresse)
{
$list_adress = unserialize($adresse['datavalue']);
}
echo $list_adress;
J'obtient un erreur sur le unserialize : Error at offset 27 of 94 bytes

Sur internet j'ai vu que cela pouvais venir d'une mauvaise serialization de mon tableau (corruption de la chaine qui serait mal écrite en gros mais je ne trouve pas l'erreur)

Quelqu'un aurait une idée?Merci d'avance

Re: unzerialize bug

Posté : 05 août 2011, 10:47
par xTG
Si je prend la chaîne telle que tu nous la présentes j'obtiens bien :
array(3) { [0]=> string(12) "34 rue pouet" [1]=> string(12) "45 rue prout" [2]=> string(15) "78avenue machin" }
Donc tu dois avoir des caractères supplémentaires qui trainent.

Re: unzerialize bug

Posté : 05 août 2011, 10:54
par Invité
Avec le même code que moi? Parce que du coup je suis encore plus pomé xD...

Re: unzerialize bug

Posté : 05 août 2011, 11:13
par xTG
Avec le même code que moi? Parce que du coup je suis encore plus pomé xD...
Comment pourrais-je avoir la même base de données que toi ? 8-|

Avec ce code :
$str = 'a:3:{i:0;s:12:"34 rue pouet";i:1;s:12:"45 rue prout";i:2;s:15:"78avenue machin";}';
var_dump(unserialize($str));
Tu as soit des caractères non imprimables qui se sont glissés lors de l'import en base de données, soit lors de l'extraction.

Re: unzerialize bug

Posté : 05 août 2011, 20:43
par sirakawa
Pourquoi ne pas vérifier BÊTEMENT ce que contient effectivement la fameuse variable?
foreach($result as $adresse)
{
    $longueur = strlen($adresse);
    print " <br>longueur $longueur adresse ==>$adresse<=="; // les ==><== sont importants pour bien voir la chaîne exacte... 
                                                                                                   //la longueur     permet de voir s'il ne traîne pas des caracyères supplémentaires..
$list_adress = unserialize($adresse['datavalue']);
}
echo $list_adress;
Une autre approche serait de consulter la bdd en-dehors de php... histoire de voir (accents, apostrophes....)