unzerialize bug

Invité
Invité n'ayant pas de compte PHPfrance

05 août 2011, 10:37

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

ViPHP
xTG
ViPHP | 7331 Messages

05 août 2011, 10:47

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.

Invité
Invité n'ayant pas de compte PHPfrance

05 août 2011, 10:54

Avec le même code que moi? Parce que du coup je suis encore plus pomé xD...

ViPHP
xTG
ViPHP | 7331 Messages

05 août 2011, 11:13

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.

Mammouth du PHP | 2278 Messages

05 août 2011, 20:43

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....)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD