Créer un xml via php

Fermé
dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009 - 18 mars 2009 à 19:30
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 - 19 mars 2009 à 12:57
Bonjour, j'effectue cette requete sur une Bdd Mysql:


SELECT tb_gallery.title, artIcon,
tb_gallery_item.icon, full, title_item
FROM tb_gallery INNER JOIN tb_gallery_item ON tb_gallery.id=tb_gallery_item.gallery

et j'aimerais formater le resultat de cette requete en un fichier xml de cette forme:

<gallery title=" " artIcon="">

<item icon="" full="">
<title_item>

</title_item>

</item>

</gallery>

Est ce que quelqu'un a une idée de code php afin d'arriver à ce XML

Merci d'avance

DUAL+++

2 réponses

sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 10
18 mars 2009 à 21:40
Salut!
Qu'est ce que tu n'arrive pas à faire?
0
dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009
18 mars 2009 à 22:18
ben en fait, j'arrive pas a formater les infos dans mon xml comme je le souhaite...

J'ai une table tb_galery avec 3 champs: id, title et artIcon

et j'ai une autre table tb_galery_item avec 5 champs: id , icon, full, title_item et gallery

le champ galery et relié à la table tb_galery via id

En gros j'ai une table qui gére les galeries avec un icon par galerie et j'ai une table qui gère les images que j'affecte à une galerie.

J'emploi donc la requete Sql suivante:

SELECT tb_gallery.title, artIcon, icon, full, title_item FROM tb_gallery INNER JOIN tb_gallery_item ON tb_gallery.id=tb_gallery_item.gallery

Dans mon exemple j'ai 2 galeries avec 2 images dans chaque gallerie, cette requete me renvoi donc un tableau :

title artIcon icon full title_item
J'Aime Pas l'Amour image-mini1.jpg micheli7-pt.jpg micheli7.jpg micheli7
J'Aime Pas l'Amour image-mini1.jpg fourez1-pt.jpg fourez1.jpg fourez
RockFest 2009 album_1_icon.png icon_1.png full_1.png titre 1
RockFest 2009 album_1_icon.png icon_2.png full_2.png titre 2

je veux trouver une commande php pour formater c'est données sous la forme d'un XML qui respecte ce format:

<gallery title="J'Aime Pas l'Amour " artIcon="image-mini1.jpg">

<item icon="micheli7-pt.jpg" full="micheli7.jpg">
<title>
micheli7
</title>

</item>

<item icon="fourez1-pt.jpg" full="fourez1.jpg">
<title>
fourez
</title>

</item>

</gallery>


<gallery title="RockFest 2009" artIcon="album_1_icon.png">

<item icon="icon_1.png" full="full_1.png">
<title>
titre 1
</title>

</item>

<item icon="icon_2.png" full="full_2.png">
<title>
titre2
</title>

</item>
</gallery>
0
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 10 > dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009
18 mars 2009 à 23:24
Bein... ça me parait pas trop compliqué!tu ressort ta requête via un truc dans le genre
$xml="";
$a=0;
while($row=mysql_fetch_array($ResultatDeTaRequête))
{
$header = ($a++ & 1) ? 1 : 0;
if ($header===1)
$xml.='<gallery title=\"'.$row['title'].'\" artIcon=\"'.$row['artIcon'].'\">\n\r';
$xml.='<item icon=\"'.$row['icon'].'\" full=\"'.$row['full'].'\">\n\r';
$xml.='<title>'.$row['title_item'].'</title>\n\r';
$xml.='</item>\n\r';
$xml.='<item icon=\"'.$row['icon'].'\" full=\"'.$row['full'].'\">\n\r';
$xml.='<title>'.$row['title_item'].'</title>\n\r';
$xml.='</item>\n\r';
}
Petit bout de code fait à l'arrache, dans le cas ou tu n'as qu'un title_item par galerie...

Tien smoi au jus si ça marche... je peux te conseiller autre chose sinon...
0
dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009 > sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010
18 mars 2009 à 23:56
Merci pour ta réponse mais je veux que ce soit dynamique, il pourra y avoir jusqu'a une vingtaine d'image par galerie... Je pense que ton code marche mais ne s'applique que si il y a 2 items par galeries.


moi je faisais sa pour le moment:

<?php

//connexion à la database
$db = mysql_connect("localhost", "root", "mysql");

//séléction de la base
mysql_select_db("olivia" , $db);

//requête


$Requete = " SELECT tb_gallery.title, artIcon, icon, full, title_item FROM tb_gallery INNER JOIN tb_gallery_item ON tb_gallery.id=tb_gallery_item.gallery";

//resultat
$Resultat = mysql_query( $Requete ) or die(mysql_error());

$num = mysql_num_rows($Resultat);

if ($num != 0) {
$file= fopen("media.xml", "w");
$_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
$_xml .="<xml>\r\n";
while ($row = mysql_fetch_array($Resultat)) {
if ($row["title"]) {
$_xml .="\t<gallery title=\"" . $row["title"] . "\" artIcon=\"" . $row["artIcon"] . "\">\r\n";
$_xml .="\t<item icon=\"" . $row["icon"] . "\" full=\"" . $row["full"] . "\">\r\n";
$_xml .="\t\t<title>" . $row["title_item"] . "</title>\r\n";
$_xml .="\t</item>\r\n";
$_xml .="\t</gallery>\r\n";
} else {
$_xml .="\t<gallery title=\"Nothing Returned\">\r\n";
$_xml .="\t\t<title>none</title>\r\n";

$_xml .="\t</gallery>\r\n";
} }
$_xml .="</xml>";
fwrite($file, $_xml);
fclose($file);
echo "XML has been written. <a href=\"media.xml\">View the XML.</a>";

} else {
echo "No Records found";
}

mais du coup j'obtient un xml formaté comme sa:

<xml>

<gallery title="J'Aime Pas l'Amour" artIcon="media_gallery_assets/image-mini1.jpg">

<item icon="media_gallery_assets/micheli7-pt.jpg" full="media_gallery_assets/micheli7.jpg">
<title>micheli7</title>
</item>
</gallery>

<gallery title="J'Aime Pas l'Amour" artIcon="media_gallery_assets/image-mini1.jpg">

<item icon="media_gallery_assets/fourez1-pt.jpg" full="media_gallery_assets/fourez1.jpg">
<title>fourez</title>
</item>
</gallery>

<gallery title="RockFest 2009" artIcon="album_art/album_1_icon.png">

<item icon="media_gallery_assets/icon_1.png" full="media_gallery_assets/full_1.png">
<title>image 1</title>
</item>
</gallery>

<gallery title="RockFest 2009" artIcon="album_art/album_1_icon.png">

<item icon="media_gallery_assets/icon_2.png" full="media_gallery_assets/full_2.png">
<title>image 2</title>
</item>
</gallery>
</xml>

et comme tu le vois c pas ce que je veux...

si tu pense a quelque chose n'hésite pas...

Merci d'avance

Dual
0
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 10 > dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009
19 mars 2009 à 00:13
C'est une grosse quantité de données qui ressort de ta base?
Parce que si non, j'ai bien une idée...
0
dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009
19 mars 2009 à 00:20
non pas enorme de donnée par contre elle est succeptible de changer souvent ... donc faut que ce soit dynamique et le xml soit formater exactement de la bonne maniere vu que c'est lu via une anim flash.
0
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 10
19 mars 2009 à 00:27
ok, je regarde ça de suite et te propose un code...
à revoir parce que si ton modèle de données ou la quantité varie (en augmentant, ce qui est toujours le cas)
il faudra repenser la fonction...
A dans pas longtemps...
0
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 10 > sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010
19 mars 2009 à 00:53
Bon, ce n'est pas testé c'est plus pour la logique de fonctionnement...
Donne moi ton avis...

$xml="";
$title='';
$Requete = " SELECT title, artIcon FROM tb_gallery ";
$ResultTitle=mysql_query($Requete)
while($row=mysql_fetch_array($ResultTitle))
{
	$xml.='<gallery title=\"'.$row['title'].'\" artIcon=\"'.$row['artIcon'].'\">\n\r';
	$RequeteItem = " SELECT icon, full, title_item FROM tb_gallery_item WHERE idTitle=idItem";
	//je ne connais pas la structure de ta table mais je suppose qu'il y a un id pour chaque table qui             te  permet de retrouver tes petits......
	$ResultItem=mysql_query($RequeteItem)
	while($rowItem=mysql_fetch_array($ResultItem))
	{
		$xml.='<item icon=\"'.$rowItem['icon'].'\" full=\"'.$rowItem['full'].'\">\n\r';
		$xml.='<title>'.$rowItem['title_item'].'</title>\n\r';
		$xml.='</item>\n\r';
		$xml.='<item icon=\"'.$rowItem['icon'].'\" full=\"'.$rowItem['full'].'\">\n\r';
		$xml.='<title>'.$rowItem['title_item'].'</title>\n\r';
		$xml.='</item>\n\r';
}

0
dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009 > sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010
19 mars 2009 à 12:43
Salut sebshiva, merci pour ton aide, ton idée ma fait réfléchir à un système et j epense que j'y suis arrivé, je vais faire des test avec différentes entrées dans la base de donnée mais pour le moment sa marche.

Mon php:

<?php

//connexion à la database
$db = mysql_connect("localhost", "root", "mysql");

//séléction de la base
mysql_select_db("olivia" , $db);

//requête
//$Requete = " SELECT menuLabel, title, subHeader, body FROM news ";

//$Requete = " SELECT tb_gallery.title, artIcon, icon, full, title_item FROM tb_gallery INNER JOIN tb_gallery_item ON tb_gallery.id=tb_gallery_item.gallery";

$Requete = " SELECT id, title, artIcon FROM tb_gallery ";

//resultat
$Resultat = mysql_query( $Requete ) or die(mysql_error());

$num = mysql_num_rows($Resultat);

//echo ($num);

if ($num != 0) {
$file= fopen("media.xml", "w");
$_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
$_xml .="<xml>\r\n";
while ($row = mysql_fetch_array($Resultat)) {
$_xml .="\t<gallery title=\"" . $row["title"] . "\" artIcon=\"" . $row["artIcon"] . "\">\r\n";


$RequeteItem = " SELECT tb_gallery_item.icon, full, title_item FROM tb_gallery INNER JOIN tb_gallery_item ON tb_gallery.id=tb_gallery_item.gallery WHERE tb_gallery.id= ". $row["id"]." " ;
$ResultatItem = mysql_query( $RequeteItem ) or die(mysql_error());

while ($rowItem = mysql_fetch_array($ResultatItem)) {
$_xml .="\t<item icon=\"" . $rowItem["icon"] . "\" full=\"" . $rowItem["full"] . "\">\r\n";
$_xml .="\t\t<title>" . $rowItem["title_item"] . "</title>\r\n";
$_xml .="\t</item>\r\n";
}

$_xml .="\t</gallery>\r\n";}

$_xml .="</xml>";
fwrite($file, $_xml);
fclose($file);
echo "XML has been written. <a href=\"media.xml\">View the XML.</a>";

} else {
echo "No Records found";
}


?>

qu'est ce que tu en pense?
0
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 10 > dualengine Messages postés 5 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 19 mars 2009
19 mars 2009 à 12:57
Salut,

J'en pense que c'est mon idée que tu as retenu et c'est 100€...
Nan, j'déconne.
Je ne comprend pas pourquoi tu lie tes deux tables dans la sous requête...
J'en vois pas trop l'intérêt (je suis sans doute passé à côté de quelque chose...)...
Sinon, l'autre idée que j'avais hier soir, (je rencontre un problème un peu similaire au tiens en terme de requêtes imbriquées en ce moment...) Afin de limiter le nombre de requête au serveur MySQL (qui suivant le nombre d'enregistrement risque de morfler) , ne faire qu'une requête pour récupérer toutes les infos dont tu as besoin et de les stocker dans un array bien indexé afin de pouvoir les re-manipuler comme tu veux et à volonté sans re-soliciter le seveur MySQL...
J'espère avoir été clair...
Ton avis est aussi le bienvenue! ;)
0