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

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 15 juin 2005 à 13:04
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005 - 25 nov. 2005 à 16:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32082-fonction-inserant-les-donnees-d-un-fichier-xml-dans-une-bdd-mysql

roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
25 nov. 2005 à 16:45
et plus de nouvelles depuis le 28/10 :)
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
28 oct. 2005 à 11:17
merci ça me rassure parce-que je suis bloqué :(
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 oct. 2005 à 11:08
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!
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
28 oct. 2005 à 11:01
plus de nouvelles :)
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
18 oct. 2005 à 16:36
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
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 oct. 2005 à 10:51
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 :-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 oct. 2005 à 09:57
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 :-)
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
18 oct. 2005 à 09:49
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>

Fortino, S. trad
Lara,S.

...
</RECORD>


A l'heure actuelle le script va récupérer la première valeur de pour l'insérer dans le array puis dans la bdd, mais pas la seconde valeur de 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>
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>
</RECORDS>
</XML>
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 oct. 2005 à 08:55
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 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.
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
17 oct. 2005 à 18:20
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 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
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 oct. 2005 à 05:49
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 :-)
}
}
?>
roro2005 Messages postés 7 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 25 novembre 2005
16 oct. 2005 à 17:30
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
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 sept. 2005 à 13:39
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.
schwera92 Messages postés 1 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 27 juillet 2005
27 juil. 2005 à 15:21
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
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juin 2005 à 09:17
Ben essaye avec ce code, ca devrait fonctionner en fait.
pappolypheme Messages postés 6 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 31 juillet 2005
20 juin 2005 à 23:52
comment faire pour mettre une vieille conversation msn en XML dans une base de donénes ? merci :D

(je sais, je suis un incapable)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
15 juin 2005 à 13:04
heu, desole pour l'indentation, il semble que le copier-coller ait eu un probleme...
Rejoignez-nous