Page 1 sur 2

Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 02:48
par Natty
Bonjour à tous,

Cette fois ma boucle "album" ($data7) s'effectue correctement mais (tous mes albums sont bien listés) mais la boucle des "sons" a un problème... Elle s'effectue mais pas correctement... J'ai essayé deux manières de l'écrire (avec jointure et sans jointure) mais le résultat n'est jamais le bon.

Voilà ce que je fais et ce que j'obtiens:

Sans jointure:
<?php require "configedition.php";
						
mysql_connect(DB_HOST, DB_LOGIN, DB_PASS);
mysql_select_db(DB_BDD);

$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml';


$sql7 = "SELECT * FROM albums";
$req7 = mysql_query($sql7) or die();
									

						
while ($data7=mysql_fetch_array($req7)) 
{
	$id = $data7['id'];
	$sql8 = "SELECT * FROM songs WHERE album_id = '".$id7."'";
	$req8 = mysql_query($sql8) or die();
									
											
	while ($data8=mysql_fetch_array($req8)) 
	{
	        $titre8= $data8['titre'];
		$duree8= $data8['duree'];
		$song8= $data8['song_name'];
											
		$g.=( '<song name="'.$titre8.'" duration="'.$duree8.'" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/'.$titre8.'">songs/'.$song8.'</song>');
											
	}
										
	$titre7= $data7['titre'];
	$artiste7 = $data7['artiste'];
	$img7 = $data7['img_name'];
										
	$h.=('<album name="'.$titre7.'" author="'.$artiste7.'" imageUrl="images/'.$titre7.'/'.$img7.'" link="http://flabell.com/">'.$g.'</album>'); 
									
}


$content7 =  "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>
<featureset>".$h."</featureset>";
						

$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); ?>
Ici j'obtiens:

Code : Tout sélectionner

<?xml version='1.0' encoding='UTF-8' standalone='no' ?> <featureset> <album name="erkioperigr" author="Meven" imageUrl="images/erkioperigr/20090118IGP6464.jpg" link="http://flabell.com/"> <song name="erkioperigr" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/erkioperigr">songs/beeat.mp3</song> <song name="kjlkjfgf" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/kjlkjfgf">songs/beeat.mp3</song> <song name="gykigyi" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/gykigyi">songs/new1.mp3</song> <song name="fdsgdg" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/fdsgdg">songs/new 1.mp3</song> </album> <album name="klr" author="Specta" imageUrl="images/klr/klr.jpg" link="http://flabell.com/"> <song name="erkioperigr" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/erkioperigr">songs/beeat.mp3</song> <song name="kjlkjfgf" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/kjlkjfgf">songs/beeat.mp3</song> <song name="gykigyi" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/gykigyi">songs/new1.mp3</song> <song name="fdsgdg" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/fdsgdg">songs/new 1.mp3</song> </album> <album name="R.A.P." author="Specta" imageUrl="images/R.A.P./R.A.P..jpg" link="http://flabell.com/"> <song name="erkioperigr" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/erkioperigr">songs/beeat.mp3</song> <song name="kjlkjfgf" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/kjlkjfgf">songs/beeat.mp3</song> <song name="gykigyi" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/gykigyi">songs/new1.mp3</song> <song name="fdsgdg" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/fdsgdg">songs/new 1.mp3</song> </album> </featureset>
LA deuxième boucle ($data8) récupère directement toutes les pistes sans tenir compte du WHERE album_id = '".$id7."'"...

Que puis je faire?

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 04:58
par stealth35
$id = $data7['id'];
$sql8 = "SELECT * FROM songs WHERE album_id = '".$id7."'";
tu créer $id mais tu va chercher $id7

faut bosser en erreur E_ALL | E_STRICT, ca apparatera tout de suite :wink:

sinon ta quelle version de PHP ?

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:22
par Invité
En fait j'ai corrigé et ça donne ça:
									$sql1 = "SELECT * FROM albums WHERE artiste ='".$_GET["pseudo"]."'";
									$req1 = mysql_query($sql1) or die();
									

									while ($data1=mysql_fetch_array($req1)) 
									{
									
									$id1 = $data1['id'];
									$sql2 = "SELECT * FROM songs WHERE album_id ='".$id1."'";
									$req2 = mysql_query($sql2) or die();
									
									
									while ($data2=mysql_fetch_array($req2)) 
									{
										$titre2= $data2['titre'];
										$duree2= $data2['duree'];
										$song2= $data2['song_name'];
										
										$f.=( '<song name="'.$titre2.'" duration="'.$duree2.'" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/'.$titre2.'">songs/'.$song2.'</song>');
									}
									
									$titre1= $data1['titre'];
									$artiste1 = $data1['artiste'];
									$img1 = $data1['img_name'];
									
									
									
									//C'est la variable qui contient le résultat
									$e.=('<album name="'.$titre1.'" author="'.$artiste1.'" imageUrl="images/'.$titre1.'/'.$img1.'" link="http://flabell.com/">'.$f.'</album>'); 
									
									$i++;
									}
(bon c pas exactement la meme version du code je m'en sert pour plusieurs fichiers différent mais le principe et le même.
Cette fois j'obtiens:

Code : Tout sélectionner

<?xml version='1.0' encoding='UTF-8' standalone='no' ?> <featureset> <album name="erkioperigr" author="Meven" imageUrl="images/erkioperigr/20090118IGP6464.jpg" link="http://flabell.com/"> <song name="erkioperigr" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/erkioperigr">songs/beeat.mp3</song> <song name="x1" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/x1">songs/new 1.mp3</song> </album> <album name="Test" author="Meven" imageUrl="images/Test/20090118-_IGP6494.jpg" link="http://flabell.com/"> <song name="erkioperigr" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/erkioperigr">songs/beeat.mp3</song> <song name="x1" duration="00 : 00" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/x1">songs/new 1.mp3</song> <song name="Immature" duration="04 : 15" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/Immature">songs/immature.mp3</song> <song name="Freestyle de batard vol.7" duration="04 : 15" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/Freestyle de batard vol.7">songs/Meven - Freestyle de batard Vol 7.mp3</song> </album> </featureset>
LA deuxième boucle récupère correctement les infos du premier album... mais pour les albums qu'ils suivent elle ajoute les pistes des précédents albums plus celle de l'album actuellement selectionne.

J'utilise php5. Merci de ton aide au fait!

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:29
par stealth35
si t'as php5 utilises les outils pour le xml ca sera plus simple

ca serait plus beau comme ca non ?
mysql_connect(DB_HOST, DB_LOGIN, DB_PASS) or exit(mysql_error());
mysql_select_db(DB_BDD) or exit(mysql_error());

$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml';

$sql7 = "SELECT `titre`, `artiste`, `img_name` FROM albums`";
$req7 = mysql_query($sql7) or exit(mysql_error());

$dom = new DOMDocument();
$dom->formatOutput = true;

$featureset = $dom->createElement('featureset');    
$dom->appendChild($featureset);
                  
while($album = mysql_fetch_object($req7))
{
    $albumnode = $dom->createElement('album');
    
    $albumnode->setAttribute('name', $album->titre);
    $albumnode->setAttribute('author', $album->artiste);
    $albumnode->setAttribute('imageUrl', $album->img_name);
    $albumnode->setAttribute('link', 'http://flabell.com/');
    
    $featureset->appendChild($albumnode);
    
    $sql8 = "SELECT `titre`, `duree`, `song_name` FROM songs` WHERE `album_id` = {$album->id}";
    $req8 = mysql_query($sql8) or exit(mysql_error());
    
    while($song = mysql_fetch_object($req8))
    {
        $songnode = $dom->createElement('song', "song/{$song->titre}");
        
        $songnode->setAttribute('name', $album->titre);
        $songnode->setAttribute('duration', $album->duree);
        $songnode->setAttribute('buy', 'false');
        $songnode->setAttribute('download', 'true');
        $songnode->setAttribute('buyLink', 'true');
        $songnode->setAttribute('downloadSource', "player/download/{$song->titre}");
        
        $albumnode->appendChild($songnode);
    }        
}

$dom->save($fichierXML7);

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:34
par Invité
Je sais pas si c'est plus joli mais en tous cas c'est plus lisible lol

MAis bon après avoir testé j'obtiens ces erreurs:


Warning: domdocument() expects at least 1 parameter, 0 given in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 139

Fatal error: Call to undefined method: domdocument->createelement() in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 142

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:37
par stealth35
essaye avec
$dom = new DOMDocument('1.0', 'UTF-8');
c'est quelle version de php (plus précisément)

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:46
par Invité
ben j'ai voulu aller verifier la version sur ovh mais c'est pas mon site j'avais identifie les identifiants sur le pc et plus rien donc chaipas je peux pas acceder pour le moment je dois redemander les identifiants a mon pote (je sais c'est **** mais bon...)

du coups j'ai teste ça me renvoit cette erreur cette fois:


Warning: domdocument() expects parameter 2 to be long, string given in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 139

Fatal error: Call to undefined method: domdocument->createelement() in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 142

du coups par la meme occasion j'ai essayé avec

Code : Tout sélectionner

$dom = new DOMDocument('1.0');
et cette fois j'obtiens:

Warning: domdocument() [function.domdocument]: Start tag expected, '<' not found in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 139

Fatal error: Call to undefined method: domdocument->createelement() in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 142

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:48
par Invité
ah oui en cherchant j'ai trouvé ça:

The following appears to work fine:

$dom = new DomDocument('<root />');

Du coups j'y mettrais bien le fieldset mais j'hésite pour la suite du code

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:51
par Invité
Bon ben je me suis lancée ça donne ça:
$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml';

$sql7 = "SELECT `titre`, `artiste`, `img_name` FROM albums`";
$req7 = mysql_query($sql7) or exit(mysql_error());

$dom = new DOMDocument('<root/>');
$dom->formatOutput = true;

$featureset = $dom->createElement('featureset');    
$dom->appendChild($featureset);
                 
while($album = mysql_fetch_object($req7))
{
    $albumnode = $dom->createElement('album');
   
    $albumnode->setAttribute('name', $album->titre);
    $albumnode->setAttribute('author', $album->artiste);
    $albumnode->setAttribute('imageUrl', $album->img_name);
    $albumnode->setAttribute('link', 'http://flabell.com/');
   
    $featureset->appendChild($albumnode);
   
    $sql8 = "SELECT `titre`, `duree`, `song_name` FROM songs` WHERE `album_id` = {$album->id}";
    $req8 = mysql_query($sql8) or exit(mysql_error());
   
    while($song = mysql_fetch_object($req8))
    {
        $songnode = $dom->createElement('song', "song/{$song->titre}");
       
        $songnode->setAttribute('name', $album->titre);
        $songnode->setAttribute('duration', $album->duree);
        $songnode->setAttribute('buy', 'false');
        $songnode->setAttribute('download', 'true');
        $songnode->setAttribute('buyLink', 'true');
        $songnode->setAttribute('downloadSource', "player/download/{$song->titre}");
       
        $albumnode->appendChild($songnode);
    }        
}

$dom->save($fichierXML7);
et j'obtiens
Fatal error: Call to undefined method: domdocument->createelement() in /homez.195/toxicvis/www/admin/includes/trait-uploadsong.php on line 142
L'autre erreur a disparue mais celle ci subsiste

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:52
par stealth35
je vois, c'est la conf qu'est foireuse il va cherché une extension php 4
donc en gros t'as pas domdocument

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 05:54
par Invité
rolala j fais quoi maintenant?? mdrrr

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 06:08
par stealth35
rolala j fais quoi maintenant?? mdrrr

essayes comme ca
mysql_connect(DB_HOST, DB_LOGIN, DB_PASS) or exit(mysql_error());
mysql_select_db(DB_BDD) or exit(mysql_error());

$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml';

$xml = '<?xml version="1.0" encoding="UTF-8"?>'
	 . '<featureset>';

$sql7 = "SELECT `titre`, `artiste`, `img_name` FROM albums`";
$req7 = mysql_query($sql7) or exit(mysql_error());
	 
while ($album = mysql_fetch_object($req7))
{
	
	$xml .= "<album"
		  . " name=\"{$album->titre}\"" 
		  . " author=\"{$album->artiste}\""
		  . " imageUrl=\"{$album->img_name}\""
		  . " link=\"http://flabell.com/\">";    
  
    $sql8 = "SELECT `titre`, `duree`, `song_name` FROM songs` WHERE `album_id` = {$album->id}";
    $req8 = mysql_query($sql8) or exit(mysql_error());
    
    while($song = mysql_fetch_object($req8))
    {
        $xml .= "<song"
        	  . " name=\"{$song->titre}\""
        	  . " duration=\"{$song->duree}\""
        	  . " buy=\"false\"" 
        	  . " download=\"true\"" 
        	  . " buyLink=\"http://www.flabell.com/\"" 
        	  . " downloadSource=\"player/download/{$song->titre}\">"
        	  . "songs/{$song->song_name}"
        	  . "</song>";
    }

    $xml .= '</album>';
}

$xml .= '</featureset>';

file_put_contents($fichierXML7, $xml);

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 25 août 2010, 14:44
par Invité
okok alors finalement le robleme venait dela variable g que j'avais pas vidé! ça donne:

Code : Tout sélectionner

$fichierXML7 = '../../FlashBanner/player/xml/mp3_player.xml'; $compteur7 = 0; $sql7 = "SELECT * FROM albums"; $req7 = mysql_query($sql7) or die(); $compteur7++; while ($data7=mysql_fetch_array($req7)) { $g=""; $sql8 = "SELECT * FROM songs WHERE album_id = '".$data7['id']."'"; $req8 = mysql_query($sql8) or die(); while ($data8=mysql_fetch_array($req8)) { $titre8= $data8['titre']; $duree8= $data8['duree']; $song8= $data8['song_name']; $g.=( '<song name="'.$titre8.'" duration="'.$duree8.'" buy="false" download="true" buyLink="http://www.flabell.com/" downloadSource="player/download/'.$titre8.'">songs/'.$song8.'</song>'); } $titre7= $data7['titre']; $artiste7 = $data7['artiste']; $img7 = $data7['img_name']; //C'est la variable qui contient le résultat $h.=('<album name="'.$titre7.'" author="'.$artiste7.'" imageUrl="images/'.$titre7.'/'.$img7.'" link="http://flabell.com/">'.$g.'</album>'); } //variable retournée par la fonction $content7 = "<?xml version='1.0' encoding='UTF-8' standalone='no' ?> <featureset>".$h."</featureset>";
Et là ça marche!! Merci pour ton aide!!

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 27 août 2010, 00:12
par Cyrano
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 ;)

Re: Problème boucle while imbriquée dans autre boucle while

Posté : 27 août 2010, 00:18
par stealth35
pourquoi tu fais ?
false !== ($datas = mysql_fetch_assoc($exec))