Correspondances XML mysql

gnut Messages postés 69 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 24 mai 2011 - 14 sept. 2010 à 14:28
gnut Messages postés 69 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 24 mai 2011 - 15 sept. 2010 à 10:04
Salut,
j'ai un souci d'enregistrement dans ma BDD. Les Print sont bons mais dans la BDD tous les $Agence->Annonce->... n'enregistrent que des 0 ou rien, quand pensez-vous :
Voici le code :


<?php

if (file_exists('exemple_wizzimmo.xml')) {


$Agences_xml = simplexml_load_file('exemple_wizzimmo.xml');  

        
  
 
foreach ($Agences_xml ->Agence as $Agence){                              
    print "Nom d'agence : {$Agence->CodeAgenceInterne} 
\n";
    print "N° téléphone: {$Agence->Telephone1_Agence} 
\n";
    print "email: {$Agence->EMAIL_Agence} 
\n";    
    
    
    print "Référence annonce client : {$Agence->Annonce->Reference} 
\n"; 
    print "Type d'annonce : {$Agence->Annonce->TypeAnnonce} 
\n";
    print "Date Modification : {$Agence->Annonce->DateModification} 
\n";
    print "Code postal : {$Agence->Annonce->CodePostal} 
\n";
    print "Ville : {$Agence->Annonce->Ville} 
\n";
    print "titre : {$Agence->Annonce->Titre} 
\n";
    print "Ann : {$Agence->Annonce->Texte} 
\n";
    print "Prix : {$Agence->Annonce->Prix} 
\n";
    print "Surf habitable: {$Agence->Annonce->Surf_Hab} 
\n";
    print "Nb Pieces : {$Agence->Annonce->NbPieces} 
\n";
    print "Département : {$Agence->Annonce->CodePostal} 
<hr />\n";

        
        if  ($Agence->Annonce->TypeAnnonce == "VENTE" )
        {
    $Typeann= "72"; }
    
    else
    { 
    $Typeann = "71";
    }
    
    $password = "imoconseil201025"; 
                                 
         
mysql_query("INSERT INTO annonces (ref_annonce_client,     id_reg,     id_dep,     id_cat,     email,     password,     ville,     code_pos,     status,     soc_nom,     soc_siren,     type,     nom,     tel,     titre,     radio,     ann,     prix,     Kilométrage,     Année_Modéle,     Cylindrée,     Surface,     Piéces,     Capacité,     random_code,     confirm,     valid,     date,     tel_cache,     ip) VALUES  ('$Agence->Annonce->Reference',     '',     '',     '$Typeann',     '$Agence->EMAIL_Agence',     '$password',     '$Agence->Annonce->Ville',     '$Agence->Annonce->CodePostal',     '2',     '$Agence->CodeAgenceInterne',     '',     '1',     '$Agence->CodeAgenceInterne',     '$Agence->Telephone1_Agence',     '$Agence->Annonce->Titre',     '0',     '$Agence->Annonce->Texte',     '$Agence->Annonce->Prix',     '',     '',     '',     '$Agence->Annonce->Surf_Hab',     '$Agence->Annonce->NbPieces',     '',     '',     '1',     '0',     'time',     'N',     '')")
or die("Erreur MySQL : ".mysql_error());
}
 


    
} else {
    exit('Echec lors de l\'ouverture du fichier test.xml.');
}
?>

7 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
14 sept. 2010 à 14:54
Salut,

Tout le monde se met à utiliser SimpleXMLElement, c'est très bien, mais personne ne l'utilise correctement... Ce qui est dommage...

$Agence->Annonce->TypeAnnonce


Il ne s'agit pas là d'une chaîne de caractères, comme on pourrait s'y attendre, mais d'un objet SimpleXMLElement. Pour le comparer à une chaîne de caractères, il faut le convertir en chaîne de caractères comme ceci :
if  ((string) $Agence->Annonce->TypeAnnonce == "VENTE" )

Pour info, la fonction print() (tout comme echo()) force la conversion (si possible) d'un objet en chaîne de caractères, d'où l'erreur persistante vicieuse qui reste cachée : on affiche bien ce qu'on veut, mais on ne traite pas ce qu'on affiche..

La conséquence logique est que PHP et MySQL ne savent pas vraiment quoi faire d'un objet SimpleXMLElement quand on essaie de l'insérer dans une base de données tel quel (sans le convertir en chaîne de caractères ni même le linéariser). MySQL ne sait réellement insérer que des entiers, des réels et des chaînes de caractères, le reste n'étant qu'une variante de chaque (un booléen étant un entier valant 0 ou 1, un champ date une chaîne de caractères présentant la date dans un format spécifique prédéfini). Ce qui se passe donc, c'est que MySQL essaie de convertir dans le type du champ, la donnée qu'on lui fournit. Si on lui donne un objet SimpleXMLElement pour le mettre dans un champ de type entier, i lfera son posisble mais ne fera pas mieux que donner 0.

Conclusion : il faut convertir en chaîne de caractères chaque donnée extraite d'un fichier XML avec SimpleXMLElement (MySQL convertira tout seul en entier, si la chaîne correspond bien à un entier).

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
gnut Messages postés 69 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 24 mai 2011
14 sept. 2010 à 15:41
Ok, merci Neige.

Ceci dit quand on démarre comme moi, ce n'est pas simple de comprendre en un clin d'œil la doc, c'est d'ailleurs tout à votre honneur chers "Webmasters de métier".

Si je comprends bien chaque chaîne de caractères SimpleXMLElement doit être précédée de (string) afin d'être identifiée à sa juste valeur (si je puis dire).

Bien à toi.


Le code pour qui veut :

<?php

if (file_exists('exemple.xml')) {


$Agences_xml = simplexml_load_file('exemple.xml');  

        
  
 
foreach ($Agences_xml ->Agence as $Agence){                              
    print "Nom d'agence : {$Agence->CodeAgenceInterne} 
\n";
    print "N° téléphone: {$Agence->Telephone1_Agence} 
\n";
    print "email: {$Agence->EMAIL_Agence} 
\n";    
    print "Référence annonce client : {$Agence->Annonce->Reference} 
\n"; 
    print "Type d'annonce : {$Agence->Annonce->TypeAnnonce} 
\n";
    print "Date Modification : {$Agence->Annonce->DateModification} 
\n";
    print "Code postal : {$Agence->Annonce->CodePostal} 
\n";
    print "Ville : {$Agence->Annonce->Ville} 
\n";
    print "titre : {$Agence->Annonce->Titre} 
\n";
    print "Ann : {$Agence->Annonce->Texte} 
\n";
    print "Prix : {$Agence->Annonce->Prix} 
\n";
    print "Surf habitable: {$Agence->Annonce->Surf_Hab} 
\n";
    print "Nb Pieces : {$Agence->Annonce->NbPieces} 
\n";
    print "Département : {$Agence->Annonce->CodePostal} 
<hr />\n";

        ///////////////////Spécificité catégories ////////////////////////////////
        if  ((string)$Agence->Annonce->TypeAnnonce == "VENTE" )
        {
    $Typeann= "72"; }
    
    else
    { 
    $Typeann = "71";
    }
    ///////////////////////Spécificités constantes///////////////////////////
    $password = "xxxxxxxxxx";
    $sta = '2';
    $conf = '1';
    $val = '0';
    $ra ='0';
    $re ='1';
    $de = '';
    $time = time();
    $ipadresse = '';
    
    ///////////////////////Spécificité tag agence////////////////////////////
    $nom = (string)$Agence->CodeAgenceInterne;
    $telag = (string)$Agence->Telephone1_Agence;
    $mail = (string)$Agence->EMAIL_Agence;
    

    
    ///////////////////////Spécificité tag agence->annonce///////////////////    
    $ref = (string)$Agence->Annonce->Reference;
    $Vil = (string)$Agence->Annonce->Ville;
    $cod = (string)$Agence->Annonce->CodePostal; 
    $titre = (string)$Agence->Annonce->Titre;
    $desc = (string)$Agence->Annonce->Texte;
    $pri = (string)$Agence->Annonce->Prix;
    $surf = (string)$Agence->Annonce->Surf_Hab;
    $nbpiece = (string)$Agence->Annonce->NbPieces;
    
    


/////////////////////// INSERT Mysql ////////////////////////////                         
         
mysql_query("INSERT INTO annonces (ref_annonce_client,     id_reg,     id_dep,     id_cat,     email,     password,     ville,     code_pos,     status,     soc_nom,     soc_siren,     type,     nom,     tel,     titre,     radio,     ann,     prix,     Kilométrage,     Année_Modéle,     Cylindrée,     Surface,     Piéces,     Capacité,     random_code,     confirm,     valid,     date,     tel_cache,     ip)  VALUES  ('$ref',     '$re',     '$de',     '$Typeann',     '$mail ',     '$password',     '$Vil',     '$cod',     '$sta',     '$nom',     '',     '1',     '$nom',     '$telag',     '$titre',     '$ra',     '$desc',     '$pri',     '',     '',     '',     '$surf',     '$nbpiece',     '',     '',     '$conf',     '$val',     '$time',     'N',     '$ipadresse')")
or die("Erreur MySQL : ".mysql_error());
}
 


    
} else {
    exit('Echec lors de l\'ouverture du fichier exemple.xml.');
}
?>
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
14 sept. 2010 à 15:50
Je n'ai jamais dit qu'il fallait comprendre la doc au premier coup d'oeil ;) (faut pas confondre ma signature et mon message). Si tel avait été le cas, je n'aurais pas pris la peine d'expliquer comme je l'ai fait. Ca m'arrive parfois de renvoyer violemment sur la doc quand quelqu'un ne sait pas utiliser une bête fonction basique (ce qui n'est pas le cas de SimpleXMLElement, je me suis moi aussi fait piéger par cette subtilités à mes débuts avec cette classe).

Le code que tu postes maintenant me paraît plus correct. Maintenant, je ne garantis pas qu'il soit exempt d'erreur (je ne sais pas à quoi ressemble ta base de données, je ne sais pas à quoi ressemble ton fichier XML, etc).

Réflexe pour plus tard : pour deboguer, au lieu d'utiliser print() pour afficher une variable, il est préférable d'utiliser var_dump() qui affiche le type de la variable et la variable elle-même autant que possible suivant de quoi il s'agit (pour un objet, les propriétés seront listées avec leur visibilité et leur contenu).

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
gnut Messages postés 69 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 24 mai 2011
14 sept. 2010 à 16:33
Ok merci encore neige.
Et très utile le var_dump()...

Si non, le code fonctionne très bien.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gnut Messages postés 69 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 24 mai 2011
14 sept. 2010 à 17:36
Voilà j'ai ce genre de fonctions :
$desc = (string)$Agence->Annonce->Texte;

Et je dois leur appliquer ceci :
$desc=utf8_decode($desc);
$desc=mysql_real_escape_string($desc);

mais je souhaiterai le faire avec une seule fonction.

Merci.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
14 sept. 2010 à 17:49
function prepare_string(SimpleXMLElement $sxe) {
  return mysql_real_escape_string(utf8_decode((string) $sxe));
}

Utilisation :
$desc = prepare_string($Agence -> Annonce -> Texte);


--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
gnut Messages postés 69 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 24 mai 2011
15 sept. 2010 à 10:04
Merci neige, cela fonctionne très bien!
0
Rejoignez-nous