[RESOLU] XML vers BDD MySQL via PHP

Petit nouveau ! | 2 Messages

14 sept. 2012, 12:24

Bonjour à Tous !

je recherche le moyen d'envoyer le contenu d'un XML dans une BDD par l’intermédiaire d'un script PHP.
En parcourant le web,
j'ai pu mettre en place un script qui me permet de faire ce que je souhaite, mais uniquement pour des fichiers XML qui ont une structure simple de type GrandParent / Parent / Enfants.
Par contre, dès que l'arborescence se complique, par ecemple Arrière-GrandParent / GrandParent / Parent / Enfants / Petits-Enfants, mon script ne fonctionne plus.

Exemple qui fonctionne :

Fichier DublinCore.xml :

Code : Tout sélectionner

<?xml version='1.0' encoding='utf-8' ?> <OI> <DublinCore> <title>16e Chapitre des Chevaliers du Pissala</title> <description></description> <publisher>CRT RIVIERA</publisher> <Keywords xml:lang='fr' /> <Classification code='02.01.03'>Fêtes et Manifestations</Classification> <ControlledVocabulary code='02.01.03.04.10'>Traditions et folklore</ControlledVocabulary> <created>2012-05-11</created> <valid>2012-09-16</valid> <modified>2012-05-11</modified> <identifier>FMAPAC006CRT0071102</identifier> </DublinCore> </OI>
Fichier DublinCore.php

Code : Tout sélectionner

<?php $db = mysql_connect('xxxx', 'xxxx', 'xxxx') OR die('Erreur de connexion à la base'); mysql_select_db('xxxx',$db) OR die('Erreur de sélection de la base'); //Affichage du document dublinCore.xml $OI_xml = simplexml_load_file('dublinCore.xml'); foreach ($OI_xml ->DublinCore as $DublinCore) { print "title de DublinCore : {$DublinCore->title} <br />"; print "description de DublinCore: {$DublinCore->description} <br />"; print "publisher de DublinCore: {$DublinCore->publisher} <br />"; print "Classification de DublinCore: {$DublinCore->Classification} <br />"; print "ControlledVocabulary de DublinCore: {$DublinCore->ControlledVocabulary} <br />"; print "created de DublinCore: {$DublinCore->created} <br />"; print "valid de DublinCore: {$DublinCore->valid} <br />"; print "modified de DublinCore: {$DublinCore->modified} <br />"; print "identifier de DublinCore: {$DublinCore->identifier} <br />"; } // envoi des infos dans la BDD $req = "INSERT INTO OI (title, description, publisher, Classification, ControlledVocabulary, created, valid, modified, identifier) values ('$DublinCore->title','$DublinCore->description','$DublinCore->publisher','$DublinCore->Classification','$DublinCore->ControlledVocabulary','$DublinCore->created','$DublinCore->valid','$DublinCore->modified','$DublinCore->identifier') "; mysql_query($req) or die("Erreur MySQL : ".mysql_error()); //Affichage du contenu de la table OI $requete = mysql_query('SELECT * FROM OI') OR die('Erreur de la requête MySQL'); while($DublinCore = mysql_fetch_array($requete)) { echo ' <p>ID :'.$DublinCore['id'].'<br/> Titre :'.$DublinCore['title'].'<br/> Description :'.$DublinCore['description'].'<br/> Publisher :'.$DublinCore['publisher'].'<br/> Classification :'.$DublinCore['Classification'].'<br/> ControlledVocabulary :'.$DublinCore['ControlledVocabulary'].'<br/> created :'.$DublinCore['created'].'<br/> valid :'.$DublinCore['valid'].'<br/> modified :'.$DublinCore['modified'].'<br/> identifier :'.$DublinCore['identifier'].'</p>'; } ?>
Exemple qui ne fonctionne pas :

Fichier Periodes.xml :

Code : Tout sélectionner

<?xml version='1.0' encoding='utf-8' ?> <Periodes> <DetailPeriode type='09.01.05'> <Dates> <DetailDates> <DateDebut>2012-09-15</DateDebut> <DateFin>2012-09-16</DateFin> <ObservationDates>Du samedi 15 septembre 2012 au dimanche 16 septembre 2012</ObservationDates> </DetailDates> </Dates> </DetailPeriode> </Periodes>
Fichier Periodes.php

Code : Tout sélectionner

<?php $db = mysql_connect('xxxx', 'xxxx', 'xxxx') OR die('Erreur de connexion à la base'); mysql_select_db('xxxx',$db) OR die('Erreur de sélection de la base'); //Affichage du document periodes.xml $Periodes_xml = simplexml_load_file('periodes.xml'); foreach ($Periodes_xml ->DetailDates as $DetailDates) { print "DateDebut de periodes : {$DetailDates->DateDebut} <br />"; print "DateFin de periodes: {$DetailDates->DateFin} <br />"; print "ObservationDates de periodes: {$DetailDates->ObservationDates} <br />"; } // envoi des infos dans la BDD $req = "INSERT INTO periodes (DateDebut, DateFin, ObservationDates) values ('$DetailDates->DateDebut','$DetailDates->DateFin','$DetailDates->ObservationDates') "; mysql_query($req) or die("Erreur MySQL : ".mysql_error()); //Affichage du contenu de la table periodes $requete = mysql_query('SELECT * FROM periodes') OR die('Erreur de la requête MySQL'); while($DetailDates = mysql_fetch_array($requete)) { echo ' <p>ID :'.$DetailDates['Id'].'<br/> DateDebut :'.$DetailDates['DateDebut'].'<br/> DateFin :'.$DetailDates['DateFin'].'<br/> ObservationDates :'.$DetailDates['ObservationDates'].'</p>'; } ?>
Auriez-vous une idée ???

Merci

Petit nouveau ! | 2 Messages

14 sept. 2012, 15:34

Bon, bein à force de tenter, on arrive à bon port !
Voici la solution, j'espère que ça aidera :

Code : Tout sélectionner

<?php $db = mysql_connect('xxxx', 'xxxx', 'xxxx') OR die('Erreur de connexion à la base'); mysql_select_db('xxxx',$db) OR die('Erreur de sélection de la base'); //Affichage du document xxxxx.xml $xml = simplexml_load_file('xxxxxx.xml'); // ->DetailPeriode->Dates->DetailDates on parcourt l'arborescence sans tenir compte du premier parent foreach ($xml->DetailPeriode->Dates->DetailDates as $value) { print "DateDebut de periodes : {$value->DateDebut} <br/>"; print "DateFin de periodes: {$value->DateFin} <br/>"; print "ObservationDates de periodes: {$value->ObservationDates}"; } // envoi des infos dans la BDD $req = "INSERT INTO periodes (DateDebut, DateFin, ObservationDates) values ('$value->DateDebut','$value->DateFin','$value->ObservationDates') "; mysql_query($req) or die("Erreur MySQL : ".mysql_error()); //Affichage du contenu de la table periodes $requete = mysql_query('SELECT * FROM periodes') OR die('Erreur de la requête MySQL'); while($value = mysql_fetch_array($requete)) { echo ' <p>ID :'.$value['id'].'<br/> DateDebut :'.$value['DateDebut'].'<br/> DateFin :'.$value['DateFin'].'<br/> ObservationDates :'.$value['ObservationDates'].'</p>'; } ?>

Eléphant du PHP | 103 Messages

24 oct. 2013, 15:37

Bonjour.
Pour moi ce code ne fonctionne pas, seule les dernières valeurs connue dans le foreach de $value->DateDebut', '$value->DateFin' et '$value->ObservationDates sont intégrées dans la base de donnée.
Je ne comprend pas comment faire pour rentrer toutes les lignes / colonnes d'un seul coup et en PDO, mysql_connect étant déprécie.
Merci!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 oct. 2013, 09:06

salut,

ce n'est pas une question de pdo ou mysql* mais de logique.
la requête est en dehors du foreach donc ne peux insérer d'une ligne.

je suppose que cette question fait suite à ce message ?

je t'invite a rester dessus et ne pas t'éparpiller ;)

ps : je verrouille ce sujet pour éviter de le polluer ;)

@+
Il en faut peu pour être heureux ......