Fonction inserant les donnees d'un fichier xml dans une bdd mysql

Soyez le premier à donner votre avis sur cette source.

Vue 10 506 fois - Téléchargée 966 fois

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 / Exemple :


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';
?>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
7
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
25 novembre 2005

et plus de nouvelles depuis le 28/10 :)
Messages postés
7
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
25 novembre 2005

merci ça me rassure parce-que je suis bloqué :(
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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!
Messages postés
7
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
25 novembre 2005

plus de nouvelles :)
Messages postés
7
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
25 novembre 2005

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 '';
// print_r($arrRequetes);
foreach ($arrRequetes as $key => $requete) {
echo $key, ' => ', $requete, ' ';
if (mysql_query ($requete)) {
echo 'OK
';
}
else {
echo 'PAS OK
';
}
}
echo '

';
}
else
echo '

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>

Fortino, S. trad
Lara, S.

<YEAR>1993</YEAR>
<TITLE>Mexique : des femmes partie prenante du mouvement social</TITLE>
<SECONDARY_TITLE>Cahiers du Feminisme</SECONDARY_TITLE>
<CUSTOM4>T & M</CUSTOM4>
Deux experiences sont relatees : la creation de la Maison de la femme "Rosario Castellanos" a Oaxaca qui a pour but d'offrir un soutien aux femmes et d'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
<NOTES>Using Smart Source Parsing 1994; (67-68) 38-42 ill French</NOTES>
<CALL_NUMBER><styles></styles>5339610173</CALL_NUMBER>
</RECORD>

<RECORD>
<REFERENCE_TYPE>0</REFERENCE_TYPE>
<REFNUM>2</REFNUM>

Fortino, Sabine

<YEAR>1999</YEAR>
<TITLE>De la ségrégation sexuelle des postes à la mixité au travail : étude d'un processus</TITLE>
<SECONDARY_TITLE>Sociologie du travail</SECONDARY_TITLE>
<VOLUME>41</VOLUME>
<NUMBER>4</NUMBER>
363-384


<CUSTOM4>T & M</CUSTOM4>
<LABEL>Ladyss ; T & M</LABEL>
<KEYWORDS>
<KEYWORD>Discrimination sexuelle dans l'emploi</KEYWORD>
<KEYWORD>Femmes - conditions sociales </KEYWORD>
<KEYWORD>Travail - conditions féminines</KEYWORD>
<KEYWORD>Mixité au travail</KEYWORD>
</KEYWORDS>
A partir de deux etudes de terrain conduites dans une administration d'Etat et dans une grande entreprise nationalisee a vocation industrielle et commerciale, cet article s'efforce de montrer que la feminisation des emplois (au niveau de la societe globale) n'est pas forcement synonyme de "mixite sociale" au travail (dans les bureaux et les ateliers). L'egalisation des positions respectives entre hommes et femmes ne semble pas assuree pour une serie de raisons que l'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
</RECORD>


Voilà ça fait beaucoup !
Merci d'avance
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.