par
Cyrano » 27 août 2010, 00:12
Allez, je me sens en forme, cadeau : comment faire la même chose avec une seule requête SQL et une seule boucle
Sur la base de ton code de départ, on va optimiser un peu :
<?php
require "configedition.php";
mysql_connect (DB_HOST, DB_LOGIN, DB_PASS);
mysql_select_db (DB_BDD);
$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml';
/**
* On définit les éléments du code XML
*/
$sLigneSong = <<<CODE_XML
<song name="%s" duration="%s" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/%s">
songs/%s
</song>
CODE_XML;
$sLigneAlbum = <<<CODE_XML
<album name="%s" author="%s" imageUrl="images/%s/%s" link="http://flabell.com/">
%s
</album>
CODE_XML;
$sFichierXml = <<<CODE_XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<featureset>
%s
</featureset>
CODE_XML;
/**
* On définit la requête SQL
*/
$sql = "SELECT ".
" a.id AS id_album, ".
" a.titre AS titre_album, ".
" a.artiste AS artiste, ".
" a.img_name AS img_name, ".
" s.titre AS song_titre, ".
" s.duree AS duree, ".
" s.song_name AS song_name ".
"FROM albums a".
" INNER JOIN songs ON a.id = s.album_id ".
"ORDER BY a.id, s.id";
$exec = mysql_query($sql);
/**
* Création d'un point de repère et des contenants de stockage;
*/
$ida = 0;
$sTitre = '';
$h = '';
/**
* La boucle, unique, pas d'imbrication :
*/
while(false !== ($datas = mysql_fetch_assoc($exec)))
{
/**
* Notre point de repère : l'identifiant de l'album : s'il est différent du
* tour précédent (ou au départ puisqu'il était vide) c'est qu'on traite un
* nouvel album
*/
if($ida != $datas['id_album'])
{
/**
* Si notre repère est différent de zéro, c'Est qu'on a traité au moins un album.
* On a donc les titres stockés dans notre variable $sTitre.
* On crée donc un contenuer <album> avec les lignes de titres.
*/
if($ida !== 0)
{
$h .= sprintf($sLigneAlbum, $data['titre_album'], $datas['artiste'], $datas['titre_album'], $datas['img_name'], $titres);
/**
* Comme on va traiter un nouvel album, on oublie pas de vider notre container de stockage;
*/
$sTitre = '';
}
/**
* On initialise notre point de repère pour ne pas créer un nouvel album avec le
* même au prochain tour si c'est le même identifiant.
*/
$ida = $datas['id_album'];
}
/**
* On crée la ligne de titre traité pour ce tour.
*/
$sTitre .= sprintf($sLigneSong, $data['song_titre'], $data['duree'], $data['song_titre'], $data['song_name']);
}
/**
* La boucle est terminée, mais...
* Attention, il reste les titres du dernier album qui n'ont pas été ajoutés
*/
$h .= sprintf($sLigneAlbum, $data['titre_album'], $datas['artiste'], $datas['titre_album'], $datas['img_name'], $titres);
/**
* Terminé, on crée le code global XML
*/
$content7 = sprintf($sFichierXml, $h);
/**
* Ici ça ne change pas de l'ancien code.
*/
$dynamic_content7 = $content7;
$openfichier7 = fopen ($fichierXML7, "w");
fwrite ($openfichier7, "");
fwrite ($openfichier7, "");
fwrite ($openfichier7, $dynamic_content7);
fwrite ($openfichier7, "");
fclose ($openfichier7);
chmod ('../../FlashBanner/player/xml/mp3_player.xml', 0777);
?>
Attention aux commentaires, ils sont importants, donc à lire aussi

Allez, je me sens en forme, cadeau : comment faire la même chose avec une seule requête SQL et une seule boucle ;)
Sur la base de ton code de départ, on va optimiser un peu :
[php]<?php
require "configedition.php";
mysql_connect (DB_HOST, DB_LOGIN, DB_PASS);
mysql_select_db (DB_BDD);
$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml';
/**
* On définit les éléments du code XML
*/
$sLigneSong = <<<CODE_XML
<song name="%s" duration="%s" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/%s">
songs/%s
</song>
CODE_XML;
$sLigneAlbum = <<<CODE_XML
<album name="%s" author="%s" imageUrl="images/%s/%s" link="http://flabell.com/">
%s
</album>
CODE_XML;
$sFichierXml = <<<CODE_XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<featureset>
%s
</featureset>
CODE_XML;
/**
* On définit la requête SQL
*/
$sql = "SELECT ".
" a.id AS id_album, ".
" a.titre AS titre_album, ".
" a.artiste AS artiste, ".
" a.img_name AS img_name, ".
" s.titre AS song_titre, ".
" s.duree AS duree, ".
" s.song_name AS song_name ".
"FROM albums a".
" INNER JOIN songs ON a.id = s.album_id ".
"ORDER BY a.id, s.id";
$exec = mysql_query($sql);
/**
* Création d'un point de repère et des contenants de stockage;
*/
$ida = 0;
$sTitre = '';
$h = '';
/**
* La boucle, unique, pas d'imbrication :
*/
while(false !== ($datas = mysql_fetch_assoc($exec)))
{
/**
* Notre point de repère : l'identifiant de l'album : s'il est différent du
* tour précédent (ou au départ puisqu'il était vide) c'est qu'on traite un
* nouvel album
*/
if($ida != $datas['id_album'])
{
/**
* Si notre repère est différent de zéro, c'Est qu'on a traité au moins un album.
* On a donc les titres stockés dans notre variable $sTitre.
* On crée donc un contenuer <album> avec les lignes de titres.
*/
if($ida !== 0)
{
$h .= sprintf($sLigneAlbum, $data['titre_album'], $datas['artiste'], $datas['titre_album'], $datas['img_name'], $titres);
/**
* Comme on va traiter un nouvel album, on oublie pas de vider notre container de stockage;
*/
$sTitre = '';
}
/**
* On initialise notre point de repère pour ne pas créer un nouvel album avec le
* même au prochain tour si c'est le même identifiant.
*/
$ida = $datas['id_album'];
}
/**
* On crée la ligne de titre traité pour ce tour.
*/
$sTitre .= sprintf($sLigneSong, $data['song_titre'], $data['duree'], $data['song_titre'], $data['song_name']);
}
/**
* La boucle est terminée, mais...
* Attention, il reste les titres du dernier album qui n'ont pas été ajoutés
*/
$h .= sprintf($sLigneAlbum, $data['titre_album'], $datas['artiste'], $datas['titre_album'], $datas['img_name'], $titres);
/**
* Terminé, on crée le code global XML
*/
$content7 = sprintf($sFichierXml, $h);
/**
* Ici ça ne change pas de l'ancien code.
*/
$dynamic_content7 = $content7;
$openfichier7 = fopen ($fichierXML7, "w");
fwrite ($openfichier7, "");
fwrite ($openfichier7, "");
fwrite ($openfichier7, $dynamic_content7);
fwrite ($openfichier7, "");
fclose ($openfichier7);
chmod ('../../FlashBanner/player/xml/mp3_player.xml', 0777);
?>[/php]
Attention aux commentaires, ils sont importants, donc à lire aussi ;)