Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2011, 10h58   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 0
Points : 0
Par défaut Insert fichier xml dans BDD avec des sous noeuds

Bonjour,

Je recherche de l'aide concernant une insertion en php d'un fichier xml avec des sous noeuds identique.
Le fichier xml est envoyé automatiquement tous les jours sur un ftp.

Code fichier immo.xml :

Code xml :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="iso-8859-15" standalone="yes"?> 
<biens> 
<bien id="0"> 
<reference>1234</reference> 
<code_agence>1</code_agence> 
<num_mandat>m1</num_mandat> 
<nom_agence>xxx</nom_agence> 
<code_postal>00000</code_postal> 
<ville>XXXX</ville> 
<type_bien>maison</type_bien> 
<prix>72000</prix> 
<images> 
<image>http://xxx.com/image/1234_1_1_M.jpg</image> 
<image>http://xxx.com/image/1234_1_2_M.jpg</image> 
<image>http://xxx.com/image/1234_1_3_M.jpg</image> 
<image>http://xxx.com/image/1234_1_4_M.jpg</image> 
<image>http://xxx.com/image/1234_1_5_M.jpg</image> 
</images> 
</bien> 
<bien id="1"> 
<reference>5678</reference> 
<code_agence>1</code_agence> 
<num_mandat>m2</num_mandat> 
<nom_agence>xxx</nom_agence> 
<code_postal>00000</code_postal> 
<ville>XXXX</ville> 
<type_bien>appartement</type_bien> 
<prix>52000</prix> 
<images> 
<image>http://xxx.com/image/5678_1_1_M.jpg</image> 
<image>http://xxx.com/image/5678_1_2_M.jpg</image> 
<image>http://xxx.com/image/5678_1_3_M.jpg</image> 
</images> 
</bien> 
</biens>

J'arrive à insérer tous les champs dans ma base de données sauf les images. C'est que la 1ère image qui est insérée. Mon problème se situe donc sur l'insertion des images.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
Code insert.php : 
 
<?php 
function apo($s1) 
{ 
$s1 = trim($s1); // suppr les espaces 
$s1 = trim($s1, "\xA0" ); // suppr les nbsp 
$s1 = stripslashes($s1); // suppr les slashs avant les apostrophes 
$s1 = str_replace("'", "''", $s1); // remplace les guillemets 
 
// supprime les caractères non imprimables 
$s2 = ""; 
for ($i = 0; $i < strlen($s1); $i++) { 
$c = substr($s1, $i, 1); 
if (ord($c) >= 32) 
$s2 .= $c; 
} 
return($s2); 
} 
 
// Récupération du fichier 
$recup = simplexml_load_file("http://www.xxx.com/dossier/immo.xml"); 
 
// On lance la fonction 
frecur($recup); 
 
/** 
Fonction frecur 
*/ 
function frecur($racine, $niveau = 0) { 
// Pour chaque item 
foreach($racine as $nom=>$texte) { 
// Pour le noeud enfant 
if(trim($texte) == "") { 
for($i=1;$i<=$niveau;$i++) { echo " "; } 
// on affiche le nom 
echo "La balise <strong>".$nom."</strong>"; 
// on récupere les enfants 
$enfants = $texte->children(); 
// on récupere les attributs s'ils sont présents 
$str = ""; 
$attributs = $texte->attributes(); 
 
if(trim($attributs) != "") { 
$str = "("; 
foreach($attributs as $index=>$contenu) { 
$str .= "[<strong>".$index."</strong>] <em>".$contenu."</em>, "; 
} 
$str = substr($str, 0, -2).")"; // Pour la mise en forme 
} 
echo $str." 
"; 
 
// comme on a un enfant, on réappelle la fonction (le niveau sert juste à la mise en forme) 
frecur($enfants, $niveau + 0); 
 
$bien=$texte; 
} else { 
// si on n'a pas d'enfant, on affiche ce qu'il y a dedans 
for($i=1;$i<=$niveau;$i++) { echo " ";} 
echo "La balise <strong>".$nom."</strong> contient <em>".$texte."<br />\n</em> 
"; 
} 
mysql_query("INSERT INTO table SET BienReference='".apo($bien->reference)."' ,BienAgence='".apo($bien->code_agence)."' ,BienMandat='".apo($bien->num_mandat)."' ,AgenceNom='".apo($bien->nom_agence)."' ,BienCodePostal='".apo($bien->code_postal)."' ,BienVille='".apo($bien->ville)."' ,BienType='".apo($bien->type_bien)."' ,BienPrix='".apo($bien->prix)."' ,BienImages1='".apo($elem->images->image)."' ,BienImages2='".apo($elem->images->image)."' ,BienImages3='".apo($enfants->images->image)."' ,BienImages4='".apo($enfants->images->image)."' ,BienImages5='".apo($enfants->images->image)."'") or die("Erreur MySQL : ".mysql_error()); 
} 
} 
?>

Merci pour votre aide.
AntonyG43 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 11h11   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Hello

J'ai pas spécialement envie de tout lire mais si je peux te donner un conseil: utilise les itérateurs de la SPL pour fabriquer un arbre qui représente ton XML (RecursiveArrayIterator), ensuite, utilise un wrapper objet relationnel capable d'enregistrer chaque noeud (que tu parcours avec un RecursiveTreeIterator sur ton ReccursiveArrayIterator) en utilisant notament getDepth et tu peux faire ça en un minimum de lignes de code en conservant une grande rapidité d'execution et une grande flexibilité.

Bon courage.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 11h17   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 0
Points : 0
Merci pour ta réponse, je regarderai tout ça dans la soirée !

Citation:
Envoyé par Benjamin Delespierre Voir le message
Hello

J'ai pas spécialement envie de tout lire mais si je peux te donner un conseil: utilise les itérateurs de la SPL pour fabriquer un arbre qui représente ton XML (RecursiveArrayIterator), ensuite, utilise un wrapper objet relationnel capable d'enregistrer chaque noeud (que tu parcours avec un RecursiveTreeIterator sur ton ReccursiveArrayIterator) en utilisant notament getDepth et tu peux faire ça en un minimum de lignes de code en conservant une grande rapidité d'execution et une grande flexibilité.

Bon courage.
AntonyG43 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 14h11   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Pour t'aider, voici à quoi pourrait ressembler ton algo:

On va partir de cette structure XML:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
$buffer = <<< XML
<?xml version="1.0" encoding="iso-8859-15" standalone="yes"?>
<biens>
	<bien id="0">
		<reference>1234</reference>
		<code_agence>1</code_agence>
		<num_mandat>m1</num_mandat>
		<nom_agence>xxx</nom_agence>
		<code_postal>00000</code_postal>
		<ville>XXXX</ville>
		<type_bien>maison</type_bien>
		<prix>72000</prix>
		<images>
		<image>http://xxx.com/image/1234_1_1_M.jpg</image>
		<image>http://xxx.com/image/1234_1_2_M.jpg</image>
		<image>http://xxx.com/image/1234_1_3_M.jpg</image>
		<image>http://xxx.com/image/1234_1_4_M.jpg</image>
		<image>http://xxx.com/image/1234_1_5_M.jpg</image>
		</images>
	</bien>
	<bien id="1">
		<reference>5678</reference>
		<code_agence>1</code_agence>
		<num_mandat>m2</num_mandat>
		<nom_agence>xxx</nom_agence>
		<code_postal>00000</code_postal>
		<ville>XXXX</ville>
		<type_bien>appartement</type_bien>
		<prix>52000</prix>
		<images>
		<image>http://xxx.com/image/5678_1_1_M.jpg</image>
		<image>http://xxx.com/image/5678_1_2_M.jpg</image>
		<image>http://xxx.com/image/5678_1_3_M.jpg</image>
		</images>
	</bien>
</biens>
XML;
que je mets dans un buffer pour l'exercice, mais on peut tout à fait ouvrir un flux réseau ou un fichier avec SimpleXMLIterator (regarde la doc).
On va ensuite créer notre arbre XML:
Code :
1
2
3
 
$it = new SimpleXMLIterator(str_replace(array("\t", "\r\n"), "",$buffer));
$itit = new RecursiveTreeIterator($it);
Notre SimpleXMLIterator nous permet d'obtenir une structure Objet de ton XML (dommage que DOMXMLIterator n'existe pas...), on mets dessus un RecursiveTreeIterator qui va nous permettre d'itérer en profondeur:

Code :
1
2
3
4
5
6
7
 
echo "<pre>";
foreach ($itit as $nodename => $node)
{
	echo "$node ($nodename)\n";
}
echo "</pre>";
Va afficher:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
|- (bien)
| |-1234 (reference)
| |-1 (code_agence)
| |-m1 (num_mandat)
| |-xxx (nom_agence)
| |-00000 (code_postal)
| |-XXXX (ville)
| |-maison (type_bien)
| |-72000 (prix)
| \- (images)
|   |-http://xxx.com/image/1234_1_1_M.jpg (image)
|   |-http://xxx.com/image/1234_1_2_M.jpg (image)
|   |-http://xxx.com/image/1234_1_3_M.jpg (image)
|   |-http://xxx.com/image/1234_1_4_M.jpg (image)
|   \-http://xxx.com/image/1234_1_5_M.jpg (image)
\- (bien)
  |-5678 (reference)
  |-1 (code_agence)
  |-m2 (num_mandat)
  |-xxx (nom_agence)
  |-00000 (code_postal)
  |-XXXX (ville)
  |-appartement (type_bien)
  |-52000 (prix)
  \- (images)
    |-http://xxx.com/image/5678_1_1_M.jpg (image)
    |-http://xxx.com/image/5678_1_2_M.jpg (image)
    \-http://xxx.com/image/5678_1_3_M.jpg (image)
A toi d'adapter à partir de là, tu vois qu'avec des itérateurs, parcourir une structure XML est un jeu d'enfant.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 17h40   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
y'a pas besoin de récursivité la dedans, faut juste recuprer les images et les mettre a plat, d'ailleurs le code est bien trop compliquer pour pas grand chose, on peux faire plus simple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ini_set('mysql.trace_mode', true);
 
$xml = simplexml_load_file('http://www.xxx.com/dossier/immo.xml');
 
$table = array(
    'reference'   => 'BienReference',
    'code_agence' => 'BienAgence',
    'num_mandat'  => 'BienMandat',
    'nom_agence'  => 'AgenceNom',
    'code_postal' => 'BienCodePostal',
    'ville'       => 'BienVille',
    'type_bien'   => 'BienType',
    'prix'        => 'BienPrix',
    'image1'      => 'BienImages1',
    'image2'      => 'BienImages2',
    'image3'      => 'BienImages3',
    'image4'      => 'BienImages4',
    'image5'      => 'BienImages5',
);
 
foreach($xml->bien as $bien)
{
    $data = array();
 
    foreach($bien as $key => $value)
    {
        if(array_key_exists($key, $table))
        {
            $data[$table[$key]] = sprintf("'%s'", mysql_real_escape_string($value->__toString()));
        }
    }    
 
    $images = (array) $bien->images;
 
    foreach($images['image'] as $key => $value)
    {
        $key = 'image' . (++$key);
 
        if(array_key_exists($key, $table))
        {
            $data[$table[$key]] = sprintf("'%s'", mysql_real_escape_string($value));
        }
    }
 
    print_r($data);
 
    $fields = implode(', ', array_keys($data));
    $values = implode(', ', $data);
 
    $sql = sprintf("INSERT INTO table (%s) VALUES(%s)", $fields, $values);
    echo $sql;
    //mysql_query($sql);
}
et avec PDO ca serait encore plus facil
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 12h22   #6
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 0
Points : 0
Bonjour stealth35 et Benjamin,

Merci pour ces différentes réponses ! J'ai analysé et testé vos méthodes, et j'ai gardé celle de stealth35 qui m'a paru plus simple à intégrer dans mon système.

Je suis encore en train de tester car j'avais vraiment simplifier le fichier xml pour le test et je vous tiendrai au courant !

Encore Merci à vous 2 !
AntonyG43 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 14h55   #7
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 0
Points : 0
Re,

Donc pour info, c'est parfait, j'ai pu en bidouillant un peu arriver à mes fins.

Encore merci !
AntonyG43 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 15h50   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par AntonyG43 Voir le message
Re,

Donc pour info, c'est parfait, j'ai pu en bidouillant un peu arriver à mes fins.

Encore merci !
pas trop de bidouille j'espère
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h33.


 
 
 
 
Partenaires

Hébergement Web