Xml et php

Résolu/Fermé
xb093 - 20 févr. 2009 à 13:36
 xb093 - 20 févr. 2009 à 17:15
Bonjour, je suis entrain de faire un script afin de remplir un fichier xml qui devrait ressembler a ça...

<category>
<menu title="La Radio">
<img sImgRoute="gallerie/image/thumb/image1.jpg":>
<img sImgRoute="gallerie/image/thumb/image2.jpg"/>
<img sImgRoute="gallerie/image/thumb/image3.jpg"/>
</menu>
<menu title="Les animateurs">
<img sImgRoute="gallerie/image/thumb/image1.jpg"/>
<img sImgRoute="gallerie/image/thumb/image2.jpg"/>
<img sImgRoute="gallerie/image/thumb/image3.jpg"/>
</menu>
<menu title="Les Invités">
<img sImgRoute="gallerie/image/thumb/image1.jpg"/>
<img sImgRoute="gallerie/image/thumb/image2.jpg"/>
<img sImgRoute="gallerie/image/thumb/image3.jpg"/>
</menu>
</category>

Voici mon code php

$db_name = "*********";
$connection = mysql_connect("*******", "********", "*********") or die("Connexion impossible.");
$db = mysql_select_db($db_name, $connection);
$query = "SELECT * FROM diapo_categorie, diapo_images WHERE diapo_images.categorie = diapo_categorie.id_categorie ";
$result = mysql_query($query, $connection) or die("Impossible d'interroger la base de données");
$num = mysql_num_rows($result);


$file= fopen("results.xml", "w");
$_xml ="<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\r\n";
$_xml .="<category>\r\n";
while ($row = mysql_fetch_array($result)) {
$_xml .="\t<menu title=\"" . $row["nom_categorie"] . "\">\r\n";
$_xml .="\t\t<img sImgRoute=\"gallerie/image/thumb/" . $row["image"] . ".jpg\"/>\r\n";
$_xml .="\t\t<file>" . $row["image"] . "</file>\r\n";
$_xml .="\t</menu>\r\n";
}
$_xml .="</category>";
fwrite($file, $_xml);
fclose($file);
echo "XML conforme. <a href=\"results.xml\">Voir le XML.</a>";


Ce qui me donne ceci...

- <category>
- <menu title="La Radio">
<img sImgRoute="gallerie/image/thumb/image1.jpg" />
</menu>
- <menu title="La Radio">
<img sImgRoute="gallerie/image/thumb/image2.jpg" />
</menu>
- <menu title="La Radio">
<img sImgRoute="gallerie/image/thumb/image3.jpg" />
</menu>
- <menu title="Les animateurs">
<img sImgRoute="gallerie/image/thumb/image17.jpg" />
</menu>
- <menu title="Les animateurs">
<img sImgRoute="gallerie/image/thumb/image18.jpg" />
</menu>
- <menu title="Les Invités">
<img sImgRoute="gallerie/image/thumb/image19.jpg" />
</menu>
- <menu title="Les Invités">
<img sImgRoute="gallerie/image/thumb/image20.jpg" />
</menu>
- <menu title="Les Invités">
<img sImgRoute="gallerie/image/thumb/image21.jpg" />
</menu>
- </category>


Comment réunir les <img> dans leurs menus respectifs????


Merci...
A voir également:

1 réponse

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
20 févr. 2009 à 14:56
Bonjour,

D'une part je pense qu'il faut faire un GROUP BY sur la catégorie dans ta requête SQL de manière à être sur que tes résultats ressortent groupés par catégorie.

Ensuite il faut adapter ton code PHP pour qu'il gère le passage d'une catégorie à l'autre à l'intérieur de ta boucle.
Exemple : dès qu'il rencontre une nouvelle catégorie, il ferme la précédente si elle existe (cas du début ou elle n'existe pas lorsqu'on rencontre la première), puis rouvre avec la nouvelle.
Par défaut lorsque ta boucle de traitement des résultats est terminer il te faudra fermer ta dernière catégorie (si non nulle) avant de pouvoir fermer le reste.

Concrètement dans ton code PHP ça donne ça:
$file= fopen("results.xml", "w");
$_xml ="<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\r\n";
$_xml .="<category>\r\n";

$currentCategory = "";

while ($row = mysql_fetch_array($result)) {

   if ( $currentCategory != $row["nom_categorie"] ){
       // --- Close previous categorie if exists
       if ( $currentCategory != "" )
          $_xml .="\t</menu>\r\n";
       // --- Open the new 
       $_xml .="\t<menu title=\"" . $row["nom_categorie"] . "\">\r\n";
   }

   $_xml .="\t\t<img sImgRoute=\"gallerie/image/thumb/" . $row["image"] . ".jpg\"/>\r\n";
   $_xml .="\t\t<file>" . $row["image"] . "</file>\r\n";

}

// --- Close last category encountered
if ( $currentCategory != "" ){
   $_xml .="\t</menu>\r\n";
}

$_xml .="</category>";
fwrite($file, $_xml);
fclose($file);
echo "XML conforme. <a href=\"results.xml\">Voir le XML.</a>"; 


Il ne te reste plus qu'à faire un group by dans ta requête :
SELECT * FROM diapo_categorie, diapo_images WHERE diapo_images.categorie = diapo_categorie.id_categorie GROUP BY diapo_categorie.nom_categorie


Code non testé mais qui devrait fonctionner normalement. Pour tout problème fais le moi savoir.
0
Salut kij_82, merci de ton aide...

Il y a juste un petit soucis le xml me renvoi ça

La balise de fin category ne correspond pas à la balise de début menu. Erreur de traitement de la ressource

<?xml version="1.0" encoding="iso-8859-1" ?>
<category>
<menu title="titre1">
<img sImgRoute="gallerie/image/thumb/image1.jpg"/>

<menu title="titre2">
<img sImgRoute="gallerie/image/thumb/image9.jpg"/>

<menu title="titre3">
<img sImgRoute="gallerie/image/thumb/image19.jpg"/>

</category>


La balise <menu> ne se ferme pas
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > xb093
20 févr. 2009 à 17:11
Re,

Effectivement mea culpa, j'ai oublié ce petit détail : chaque fois que ta partie change il faut mettre à jour la variable pour que ce soit pris en compte, sinon effectivement ça n'est jamais fermé.

Correction de la partie du code concernée :
   if ( $currentCategory != $row["nom_categorie"] ){
       // --- Close previous categorie if exists
       if ( $currentCategory != "" )
          $_xml .="\t</menu>\r\n";
       // --- Update the category value
       $currentCategory = $row["nom_categorie"];
       // --- Open the new 
       $_xml .="\t<menu title=\"" . $row["nom_categorie"] . "\">\r\n";
   }


Ca devrait fonctionner désormais.
0
xb093 > kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
20 févr. 2009 à 17:15
Merci ça fonctionne parfaitement...
0