
12 février 2010
L’utilisation d’un fichier XML en PHP nécessite souvent des librairies externes ou des algorythmes complexes. Ici nous vous proposons deux fonctions simples pour transformer votre fichier XML en tableau associatif PHP puis en requête MySQL. Cette dernière permet de remplir une table MySQL à partir d’un fichier XML. Vous pouvez choisir les champs à inserer ou non.
Pré-requis
Avant toute chose, si vous voulez utiliser la fonction XMLtoSQL, il vous faut une fonction de connexion à une base de données. Ici la fonction getconnection() est utilisée. Elle se présente sous la forme :
<?php
function getConnection() {
$mysql = "localhost"; // nom du serveur
$login = "XXXXXX"; // identifiant de l'utilisateur
$pwd = "XXXXXX"; // mot de passe de l'utilisateur
$base = "nom_de_la_base"; // nom de la base
$id_connect = mysql_connect($mysql, $login, $pwd)
or die("Erreur interne : connexion au serveur de BD refusée<br>");
mysql_select_db($base)
or die("Erreur interne : connexion à la BD refusée<br>");
}
?>Parseur XMLtoARRAY
<?php
// FONCTION qui transforme le fichier XML en tableau associatif PHP
// IN
// $fichier : STRING, chemin complet vers le fichier
// $item : STRING, nom de l'objet principal XML
// $champs : ARRAY, tableau des champs que l'on veux récupérer
// OUT
// Tableau associatif de la forme :
// [0]=>{ "champs1"=>"valeur1", "champs2"=>"valeur2" }
// [1]=>{ "champs1"=>"valeur3", "champs2"=>"valeur4" }
function XMLtoARRAY($fichier,$item,$champs) {
// on lit le fichier
if(file_exists($fichier)){
if($chaine = @implode("",@file($fichier))) {
// on éclate les objets <item>
$tmp = preg_split("/<\/?".$item.">/",$chaine);
// on parcours les <item>
for($i=0;$i<sizeof($tmp)-1;$i+=1){
// on recherche les champs demandés
foreach($champs as $champ) {
$tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
// on ajoute l'élément au tableau
$tmp3[$i][$champ] = @$tmp2[1];
}
}
// retourne le tableau associatif
return $tmp3;
}
}else{
return "Le fichier n'existe pas";
}
}
?>Parseur XMLtoSQL
<?php
// FONCTION qui remplit une table MySQL à partir d'un fichier XML
// IN
// $fichier : STRING, chemin complet vers le fichier
// $item : STRING, nom de l'objet principal XML, sert aussi de nom pour la table MySQL
// $champs : ARRAY, tableau des champs que l'on veux récupérer, equivalent des champs pour MySQL
// $test : INT, vaut 1 si vous en voulez pas executer les requêtes
// OUT
// Phrase de notification
function XMLtoSQL($fichier,$item,$champs,$test=0){
//On recupère le tableau PHP correspondant au fichier XML
$xml = XMLtoARRAY($fichier,$item,$champs);
if(is_array($xml)){
getconnection();
$nom_table=$item;
$requetes_insert=array();
$requete="";
foreach($xml as $un_enregistrement){
$requete="INSERT INTO ".$nom_table." ";
$col_name="(";
$value="(";
foreach($un_enregistrement as $champs=>$valeur){
$col_name.=$champs.",";
$value.="\"".$valeur."\",";
}
$col_name=substr($col_name,0,-1);
$value=substr($value,0,-1);
$requete.=$col_name.") VALUES ".$value.")";
$requetes_insert[]=$requete;
}
//Si tout est ok on vide la table
$vidange_table="TRUNCATE TABLE ".$nom_table;
if($test==0){
$res_vidange=mysql_query($vidange_table);
if(!$res_vidange){
return "Erreur lors de la vidange de la table : ".$nom_table;
}
}
//Puis on execute les requêtes une par une
foreach($requetes_insert as $key=>$une_requete){
if($test==0){
$res_requete=mysql_query($une_requete);
if(!$res_requete){
return "Erreur lors de l'execution de la requete num ".$key." : ".$une_requete;
}
}
}
return "Importation des ".sizeof($requetes_insert)." requetes reussie";
}else{
return "L'erreur suivante a ete detectee : ".$xml;
}
}
?>Notre fichier XML : test.xml
<?xml version="1.0" encoding="UTF-8"?>
<personne>
<nom>MARTIN</nom>
<prenom>Julien</prenom>
<date_naissance>1996-10-06</date_naissance>
<num_tel>764704140</num_tel>
</personne>
<personne>
<nom>ROBERT</nom>
<prenom>Marcial</prenom>
<date_naissance>1996-10-06</date_naissance>
<num_tel>764704140</num_tel>
</personne>
<personne>
<nom>GRANDJEAN</nom>
<prenom>Pierre</prenom>
<date_naissance>1996-10-06</date_naissance>
<num_tel>764704140</num_tel>
</personne> Notre code PHP
<?php
echo XMLtoSQL("test.xml","personne",array("nom","prenom"));
?>Résultats
La table "personne" sera vidée
Elle ne sera remplie qu’avec les champs nom et prenom du fichier XML. Les autres champs sont ignorés.
La fonction affichera le nombre d’insertions dans la table
Code inspiré de la source : http://www.phpsources.org/scripts17...
Loïc Baumont
Vous devez être identifié pour poster un commentaire. Merci de vous enregistrer ou de vous connecter sur la page d'identification
Depuis le 3 Septembre 2010, les sites tournant sous la version 2.1 de Spip ont vu tous leurs (...)
Sur les RPS proposés par OVH, beaucoup de personnes ont des problèmes avec l’anti-virus Clamav qui (...)
Pourquoi mettre à jour votre serveur ? Les patchs : apportent des améliorations aux logiciels (...)
Cette fonction permet de mettre à jour une table MySQL à partir d’un fichier CSV. Si la valeur (...)
Lorsque vous redémarrez QMail ou si vous ne recevez plus d’e-mails et que l’une des erreurs (...)
.. Sites & applications pour mobiles
.. Conseil, Gestion de projet & A.M.O.
.. Formations
.. Infos du web
C-Stan, 42 rue de la gare - 54460 Liverdun / Mentions légales
Aucun commentaire