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

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

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.