Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FONCTION INSERANT LES DONNEES D'UN FICHIER XML DANS UNE BDD MYSQL


Information sur la source

Catégorie :Xml Niveau : Débutant Date de création : 15/06/2005 Date de mise à jour : 15/06/2005 13:57:19 Vu / téléchargé: 6 461 / 747

Note :
7,25 / 10 - par 4 personnes
7,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

Description

Ok, c'est une simple fonction que j'ai ecrite suite a un message sur le forum. Le but etait d'inserer dans une base de donnees Mysql des donnees provenant d'un fichier xml.

Cette fonction ne fait que des insert into.
Les parametres a passer :
- $arrElem : tableau contenant tous les elements du fichier XML a inserer dans la BDD. C'est un tableau simple : array  ('elem1', 'elem2'...). Les attributs doivent y etre mis de la meme maniere (si attributs il y a), ils seront inseres aussi dans un champ a part. Ex : array ('elem1', 'elem2', 'attr1'...)
- $arrChamps : les champs de votre base de donnees. Ces champs DOIVENT  etre dans le meme ordre que les elenmts et attributs a inserer. De meme, evidemment, il doit y avoir dans ces 2 tableaux le meme nombre d'elements.
- $table : le nom de votre table.
- $fichierXml : le fichier xml.

Voila, c'est tout.

 

Source

  • Fichier test.xml
  • -----------------
  • <?xml version="1.0" encoding="UTF-8"?>
  • <exportcontact>
  • <contact>
  • <nom>Toto</nom>
  • <prenom>Titi</prenom>
  • <numero type="tel portable" >0633333330</numero>
  • </contact>
  • <contact>
  • <nom>dupont</nom>
  • <prenom>Pierre</prenom>
  • <numero type="tel fixe" >04946986980</numero>
  • </contact>
  • </exportcontact>
  • Fonction
  • -------------
  • <?php
  • function insertXml ($arrElem, $arrChamps, $table, $fichierXml) {
  • $xml_parseur = xml_parser_create();
  • $fp = fopen($fichierXml, "r") or die("Fichier introuvable. L'analyse a ete suspendue");
  • while ($fdata = fread($fp, filesize ($fichierXml))){
  • xml_parse_into_struct ($xml_parseur, $fdata, $arrOutput) or die (sprintf("Erreur XML : %s à la ligne %d\n",
  • xml_error_string(xml_get_error_code($xml_parseur)),
  • xml_get_current_line_number($xml_parseur))
  • );
  • }
  • foreach ($arrOutput as $elem) {
  • if (in_array ($elem['tag'], $arrElem)) {
  • $arrReq[$elem['tag']][] = $elem['value'];
  • if (is_array ($elem['attributes'])){
  • foreach ($elem['attributes'] as $clef => $attr) {
  • if (in_array ($clef, $arrElem)) {
  • $arrReq[$clef][] = $attr;
  • }
  • }
  • }
  • }
  • }
  • if (is_array ($arrReq)) {
  • $cpt = count ($arrReq[$arrElem[0]]);
  • $strChamps = '';
  • foreach ($arrChamps as $champ) {
  • $strChamps .= '"'.$champ.'",';
  • }
  • $strChamps = rtrim ($strChamps, ',');
  • $i = 0;
  • while ($i < $cpt) {
  • $strTmp = '';
  • foreach ($arrReq as $clef => $dump) {
  • $strTmp .= '"'.$arrReq[$clef][$i].'",';
  • }
  • $strTmp = rtrim ($strTmp, ',');
  • $requeteTmp[] = $strTmp;
  • $i ++;
  • }
  • $i = 0;
  • while ($i < $cpt) {
  • $requete[] = 'INSERT INTO '.$table.' ('.$strChamps.') VALUES ('.$requeteTmp[$i].')';
  • $i ++;
  • }
  • return $requete;
  • }
  • return false;
  • }
  • ?>
  • Exemple d'appel
  • ----------------
  • <?php
  • $arrElem = array ('NOM', 'PRENOM', 'NUMERO', 'TYPE');
  • $arrSql = array ('nom', 'prenom', 'telephone', 'type');
  • if (($arrRequetes = insertXml ($arrElem, $arrSql, 'matable', 'test.xml'))!== false) {
  • echo 'OK<pre>';
  • print_r ($arrRequetes);
  • echo '</pre>';
  • }
  • else
  • echo '<br /><br />Erreur, false retourne';
  • ?>
Fichier test.xml
-----------------
<?xml version="1.0" encoding="UTF-8"?>

<exportcontact>
    <contact>
        <nom>Toto</nom>
        <prenom>Titi</prenom>
        <numero type="tel portable" >0633333330</numero>       
    </contact>

    <contact>
        <nom>dupont</nom>
        <prenom>Pierre</prenom>
        <numero type="tel fixe" >04946986980</numero>       
    </contact>

</exportcontact>


Fonction 
-------------
<?php
function insertXml ($arrElem, $arrChamps, $table, $fichierXml) {
    $xml_parseur = xml_parser_create();
    $fp = fopen($fichierXml, "r") or die("Fichier introuvable. L'analyse a ete suspendue");
    while ($fdata = fread($fp, filesize ($fichierXml))){
         xml_parse_into_struct ($xml_parseur, $fdata, $arrOutput) or die (sprintf("Erreur XML : %s à la ligne %d\n",
            xml_error_string(xml_get_error_code($xml_parseur)),
            xml_get_current_line_number($xml_parseur))
            );
    }

    foreach ($arrOutput as $elem) {
      if (in_array ($elem['tag'], $arrElem)) {
        $arrReq[$elem['tag']][] = $elem['value'];
        if (is_array ($elem['attributes'])){
          foreach ($elem['attributes'] as $clef => $attr) {
            if (in_array ($clef, $arrElem)) {
              $arrReq[$clef][] = $attr;
            }
          }
        }
      }
    }
    if (is_array ($arrReq)) {
      $cpt = count ($arrReq[$arrElem[0]]);
      $strChamps = '';
      foreach ($arrChamps as $champ) {
        $strChamps .= '"'.$champ.'",';
      }
      $strChamps = rtrim ($strChamps, ',');
      $i = 0;
      while ($i < $cpt) {
        $strTmp = '';
        foreach ($arrReq as $clef => $dump) {
          $strTmp .= '"'.$arrReq[$clef][$i].'",';
        }
        $strTmp = rtrim ($strTmp, ',');
        $requeteTmp[] = $strTmp;
        $i ++;
      }
      $i = 0;
      while ($i < $cpt) {
        $requete[] = 'INSERT INTO '.$table.' ('.$strChamps.') VALUES ('.$requeteTmp[$i].')';
        $i ++;
      }
    return $requete;
    }
  return false;
}
?>

Exemple d'appel
----------------
<?php
$arrElem = array ('NOM', 'PRENOM', 'NUMERO', 'TYPE');
$arrSql = array ('nom', 'prenom', 'telephone', 'type');
if (($arrRequetes = insertXml ($arrElem, $arrSql, 'matable', 'test.xml'))!== false) {
    echo 'OK<pre>';
    print_r ($arrRequetes);
    echo '</pre>';
}
else
    echo '<br /><br />Erreur, false retourne';
?>

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

15 juin 2005 13:18:04 :
-modification du titre ;-) - je recopier la fonction des fois que ca change l'indentation
15 juin 2005 13:56:19 :
- ajout d'un zip, c'est quand meme plus simple.
15 juin 2005 13:57:19 :
- changement du zip lol, c'etait un autre code... ;-) Pas bien reveille moi today...

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 15/06/2005 13:04:30 administrateur CS

heu, desole pour l'indentation, il semble que le copier-coller ait eu un probleme...

signaler à un administrateur
Commentaire de pappolypheme le 20/06/2005 23:52:33

comment faire pour mettre une vieille conversation msn en XML dans une base de donénes ? merci :D

(je sais, je suis un incapable)

signaler à un administrateur
Commentaire de malalam le 21/06/2005 09:17:50 administrateur CS

Ben essaye avec ce code, ca devrait fonctionner en fait.

signaler à un administrateur
Commentaire de schwera92 le 27/07/2005 15:21:00

ji arrive pas est sa m'enerve
voila mon fichier xml n'est pas sur le même ftp que le mien ses grave???
le scripts et il complet ??ou sinon ou met ton la BDD le PW le login et tous le reste??
merci d'avances

signaler à un administrateur
Commentaire de malalam le 05/09/2005 13:39:01 administrateur CS

Oups, désolé de ne pas m'être occupé de toi, je n'avais pas reçu ce message dans mes emails.
Donne moi ton code, ce sera plus simple, je t'expliquerai ce qui est faux.
La connection à la bdd doit évidemment se faire avant de lancer ce script.

signaler à un administrateur
Commentaire de roro2005 le 16/10/2005 17:30:33

le script fonctionne bien :)
merci !
Mais il affiche seulement le tableau qui a extrait les données du fichier XML, SANS insérer effectivement les données dans la base mysql dont on a ouvert la connexion.
personnellement je suis coincé pour reprendre uniquement le INSERT INTO ... contenu dans la variable :(
Merci d'avance

signaler à un administrateur
Commentaire de malalam le 17/10/2005 05:49:44 administrateur CS

Hello,

la fonction renvoie un tableau de requêtes, sur lesquelles il faut boucler ensuite.
On peut imaginer qquechose comme :

<?php
$arrElem = array ('NOM', 'PRENOM', 'NUMERO', 'TYPE');
$arrSql = array ('nom', 'prenom', 'telephone', 'type');
if (($arrRequetes = insertXml ($arrElem, $arrSql, 'matable', 'test.xml'))!== false) {
foreach ($arrRequetes as $requete) {
  mysql_query ($requete); // a ajouter : tests d'erreur etc...là j'ai fait au plus simple :-)
  }      
}
?>

signaler à un administrateur
Commentaire de roro2005 le 17/10/2005 18:20:29

merci beaucoup, le script fonctionne parfaitement :)
deux remarques :
1) en tout cas dans les dernières versions de mysql dans la variable $arrSql les éléments ne doivent pas comporter de quote (')
2) demeure le problème où dans le fichier XML on a des balises dupliquées : par exemple 2 auteurs <AUTHOR> dans une notice bibliographique (dans le script actuel seule la première valeur est récupérée !)
mais là non plus je n'ai pas la solution
Encore merci

signaler à un administrateur
Commentaire de malalam le 18/10/2005 08:55:52 administrateur CS

1) en tout cas dans les dernières versions de mysql dans la variable $arrSql les éléments ne doivent pas comporter de quote (')
=> il s'agit d'un tableau php, 'matable' par exemple est une chaine, et doit être délimité par des quotes. Sinon, php prend ça pourune constante. Cela fonctionne si l'on a pas activé le error_reporting à E_ALL, mais c'est une erreur de programmation ;-) Donc j'en reste à mes quotes.
Si tu parles des valeurs insérées dans mysql, là encore je ne suis pas d'accord. Un champ de type char, varchar...bref, une chaine, doit être insérée avec des quotes (sinon, se pose simplement, comme les attributs en html, le problème de la délimitation : un espace dans la valeur, et mysql ne sait plus ce qu'il doit prendre comme valeur, et ce ce qu'il doit essayer de considérer comme une clause).
Sinon, pour les noms de tables mysql, je suis d'accord.

2) demeure le problème où dans le fichier XML on a des balises dupliquées : par exemple 2 auteurs <AUTHOR> dans une notice bibliographique (dans le script actuel seule la première valeur est récupérée !)
=> diantre, tu as raison. J'ai fait ce script à la va vite pour un besoin dans mon boulot sur le moment. Ne m'étant pas heurté à ce problème, je n'y avais pas pensé.
Je verrai ce queje peux faire dès que j'aurai un peu plus de temps. Il faut que je réanalyse mon code ;-) Je ne me souviens plus exactement comment il fonctionne.

Et merci à toi pour ton intérêt :-) Content qu'il te serve. Si tua s un problème par rapport à ce code (les doublons par exemple), le mieux est que tu me donnes un petit exemple de ta structure xml, je travaillerai à partir de cet exemple.


signaler à un administrateur
Commentaire de roro2005 le 18/10/2005 09:49:14

voici un extrait de mon code XML qui pose problème avec le script actuel :
<XML>
<RECORDS>
<RECORD>
<REFERENCE_TYPE>0</REFERENCE_TYPE>
<REFNUM>1</REFNUM>
<AUTHORS>
<AUTHOR>Fortino, S. trad</AUTHOR>
<AUTHOR>Lara,S.</AUTHOR>
</AUTHORS>
...
</RECORD>


A l'heure actuelle le script va récupérer la première valeur de <AUTHOR> pour l'insérer dans le array puis dans la bdd, mais pas la seconde valeur de <AUTHOR> et l'insertion dans la bdd va échouer (pb. de correspondance des éléments entre les 2 tableaux).

Encore merci pour ton dévouement et l'aide que tu consens, ainsi que pour la promptitude de tes réponses.
=================================================
exemple avec le RECORD complet :
<XML>
<RECORDS>
<RECORD>
<REFERENCE_TYPE>0</REFERENCE_TYPE>
<REFNUM>1</REFNUM>
<AUTHORS><AUTHOR>Fortino, S. trad</AUTHOR>
<AUTHOR>Lara, S.</AUTHOR>
</AUTHORS>
<YEAR>1993</YEAR>
<TITLE>Mexique : des femmes partie prenante du mouvement social</TITLE>
<SECONDARY_TITLE>Cahiers du Feminisme</SECONDARY_TITLE>
<CUSTOM4>T &amp; M</CUSTOM4>
<ABSTRACT>Deux experiences sont relatees : la creation de la Maison de la femme &quot;Rosario Castellanos&quot; a Oaxaca qui a pour but d&apos;offrir un soutien aux femmes et d&apos;impulser des groupes de prise de conscience ; la creation de la COCODEM (Commission de coordination pour le developpement de la femme) au sein des syndicats enseignants pour faire prendre en compte les inegalites de genre par les instances syndicales
</ABSTRACT>
<NOTES>Using Smart Source Parsing&#xD;1994; (67-68) 38-42 ill&#xD;French
</NOTES>
<CALL_NUMBER>
<styles></styles>
5339610173
</CALL_NUMBER>
</RECORD>
</RECORDS>
</XML>

signaler à un administrateur
Commentaire de malalam le 18/10/2005 09:57:36 administrateur CS

Ok, laisse moi quelque temps... :-) Je suis au taf et ce n'est pas évident (même si c'est du xml aussi lol, mais ce n'est pas du php du tout donc bon...pas vraiment l'occasion de bosser ton code en même temps). Mais je devrais avoir un peu de temps aujourd'hui. Je vois ce que je peux faire. Je ne pense pas que ce soit très compliqué de toutes façons :-)

signaler à un administrateur
Commentaire de malalam le 18/10/2005 10:51:35 administrateur CS

Donne moi aussi la structure de ta table/tes tables sql, avec une explication sur l'insertion que tu veux...parce que je ne pige pas comment tu veux insérer tes données.

merci :-)

signaler à un administrateur
Commentaire de roro2005 le 18/10/2005 16:36:12

OK,
pour l'instant je n'ai qu'une table ==> archive
champs de la base de données mysql dans l'ordre:

reference,ref_num,auteurs,annee,titre,titre_2,lieu_edition,edit
eur,auteurs_second,volume,nombre,pages,isbn,custom,label,mots_cle,resume,notes,t
ype_work

===========================================
ci-après le script insert.php que nous avons repris de votre script (seul vrai changement la neutralisation dans la requête des " et des ' par un mysql_real_escape_string):
<?php


function insertXml ($arrElem, $arrChamps, $table, $fichierXml)
{
     $xml_parseur = xml_parser_create();
     $fp = fopen($fichierXml, "r") or die("Fichier introuvable. L'analyse a ete suspendue");
     while ($fdata = fread($fp, filesize ($fichierXml))){
          xml_parse_into_struct ($xml_parseur, $fdata, $arrOutput) or die (sprintf("Erreur XML : %s à la ligne %d\n",
             xml_error_string(xml_get_error_code($xml_parseur)),
             xml_get_current_line_number($xml_parseur))
             );
     }
  
     foreach ($arrOutput as $elem) {
       if (in_array ($elem['tag'], $arrElem)) {
$arrReq[$elem['tag']][] = $elem['value'];
if (is_array ($elem['attributes'])){
foreach ($elem['attributes'] as $clef => $attr) {
if (in_array ($clef, $arrElem)) {
$arrReq[$clef][] = $attr;
}
}
}
}
}
if (is_array ($arrReq)) {
$cpt = count ($arrReq[$arrElem[0]]);
$strChamps = '';
foreach ($arrChamps as $champ) {
$strChamps .= ''.$champ.',';
}
$strChamps = rtrim ($strChamps, ',');
$i = 0;
while ($i < $cpt) {
$strTmp = '';
foreach ($arrReq as $clef => $dump) {
$arrReq[$clef][$i] = mysql_real_escape_string ($arrReq[$clef][$i]);
$strTmp .= '"'.$arrReq[$clef][$i].'",';
}
$strTmp = rtrim ($strTmp, ',');
$requeteTmp[] = $strTmp;
$i ++;
}
$i = 0;
while ($i < $cpt) {
$requete[] = 'INSERT INTO '.$table.' ('.$strChamps.') VALUES ('.$requeteTmp[$i].')';
$i ++;
}
return $requete;
}
return false;
}

mysql_connect('localhost', 'rodrigue', 'labo10');
// on sélectionne la base
mysql_select_db(armagnac);


$arrElem = array ('REFERENCE_TYPE','REFNUM','AUTHOR','YEAR','TITLE','SECONDARY_TITLE','PLACE_PUBLISHED','PUBLISHER','SECONDARY_AUTHOR','VOLUME','NUMBER','PAGES','ISBN','CUSTOM4','LABEL','KEYWORD','ABSTRACT','NOTES','TYPE_OF_WORK');

$arrSql = array (reference,ref_num,auteurs,annee,titre,titre_2,lieu_edition,editeur,auteurs_second,volume,nombre,pages,isbn,custom,label,mots_cle,resume,notes,type_work);

if (($arrRequetes = insertXml ($arrElem,$arrSql, 'archive', 'base_test_sylvie.xml'))!== false) {
echo '<pre>';
//      print_r($arrRequetes);
        foreach ($arrRequetes as $key => $requete) {
         echo $key, ' => ', $requete, ' ';
         if (mysql_query ($requete)) {
          echo 'OK <br />';
         }
         else {
          echo 'PAS OK <br />';
         }
        }
        echo '</pre>';
}
else
    echo '<br /><br />Erreur, false retourne';
?>
======================================================
Le problème qui demeure également c'est que les RECORD du fichier XML n'ont pas une composition identiques.
exemple des 2 premiers records de notre fichier xml test :

<XML>
<RECORDS>
<RECORD>
<REFERENCE_TYPE>0</REFERENCE_TYPE>
<REFNUM>1</REFNUM>
<AUTHORS>
<AUTHOR>Fortino, S. trad</AUTHOR>
<AUTHOR>Lara, S.</AUTHOR>
</AUTHORS>
<YEAR>1993</YEAR>
<TITLE>Mexique : des femmes partie prenante du mouvement social</TITLE>
<SECONDARY_TITLE>Cahiers du Feminisme</SECONDARY_TITLE>
<CUSTOM4>T &amp; M</CUSTOM4>
<ABSTRACT>Deux experiences sont relatees : la creation de la Maison de la femme &quot;Rosario Castellanos&quot; a Oaxaca qui a pour but d&apos;offrir un soutien aux femmes et d&apos;impulser des groupes de prise de conscience ; la creation de la COCODEM (Commission de coordination pour le developpement de la femme) au sein des syndicats enseignants pour faire prendre en compte les inegalites de genre par les instances syndicales</ABSTRACT>
<NOTES>Using Smart Source Parsing&#xD;1994; (67-68) 38-42 ill&#xD;French</NOTES>
<CALL_NUMBER><styles></styles>5339610173</CALL_NUMBER>
</RECORD>

<RECORD>
<REFERENCE_TYPE>0</REFERENCE_TYPE>
<REFNUM>2</REFNUM>
<AUTHORS>
<AUTHOR>Fortino, Sabine</AUTHOR>
</AUTHORS>
<YEAR>1999</YEAR>
<TITLE>De la s&#xE9;gr&#xE9;gation sexuelle des postes &#xE0; la mixit&#xE9; au travail : &#xE9;tude d&apos;un processus</TITLE>
<SECONDARY_TITLE>Sociologie du travail</SECONDARY_TITLE>
<VOLUME>41</VOLUME>
<NUMBER>4</NUMBER>
<PAGES>363-384</PAGES>
<CUSTOM4>T &amp; M</CUSTOM4>
<LABEL>Ladyss ; T &amp; M</LABEL>
<KEYWORDS>
<KEYWORD>Discrimination sexuelle dans l&apos;emploi</KEYWORD>
<KEYWORD>Femmes - conditions sociales </KEYWORD>
<KEYWORD>Travail - conditions f&#xE9;minines</KEYWORD>
<KEYWORD>Mixit&#xE9; au travail</KEYWORD>
</KEYWORDS>
<ABSTRACT>A partir de deux etudes de terrain conduites dans une administration d&apos;Etat et dans une grande entreprise nationalisee a vocation industrielle et commerciale, cet article s&apos;efforce de montrer que la feminisation des emplois (au niveau de la societe globale) n&apos;est pas forcement synonyme de &quot;mixite sociale&quot; au travail (dans les bureaux et les ateliers). L&apos;egalisation des positions respectives entre hommes et femmes ne semble pas assuree pour une serie de raisons que l&apos;A. passe en revue. Au final, la mixite apparait moins comme un simple ratio que comme un processus, dont les formes et la signification appartiennent largement aux acteurs... et dans une moindre mesure aux actrices</ABSTRACT>
</RECORD>


Voilà ça fait beaucoup !
Merci d'avance

signaler à un administrateur
Commentaire de roro2005 le 28/10/2005 11:01:17

plus de nouvelles :)

signaler à un administrateur
Commentaire de malalam le 28/10/2005 11:08:50 administrateur CS

si si je pense à toi, je suis désolé, je suis juste un peu débordé pour coder là...je peux passer, voir le forum, répondre un peu,
voir mes MP mais g pas le temps de coder un truc. Patiente un peu stp :-) Promis, je ne t'oublie pas!

signaler à un administrateur
Commentaire de roro2005 le 28/10/2005 11:17:13

merci ça me rassure parce-que je suis bloqué :(

signaler à un administrateur
Commentaire de roro2005 le 25/11/2005 16:45:29

et plus de nouvelles depuis le 28/10  :)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,75 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.