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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème boucle while imbriquée dans autre boucle while

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

par Cyrano » 27 août 2010, 03:18

Si c'est pour mettre dans du XML, il faut utiliser les entités XML dans ce cas : < et >
J'ai pas testé, mais ça devrait mieux passer.

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

par stealth35 » 27 août 2010, 03:05

et oui, dommage que le DOMDocument marchait pas, parce que si y'a un <, >, " dans le titre ça risque de par marcher

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

par Cyrano » 27 août 2010, 03:01

Ce qu'il faut chopper, ce sont des bonnes habitudes et rester strict et discipliné : avec l'habitude, on le fait sans même y penser et au bout du compte, les bugs qu'on trouve sont en général bien plus souvent des problèmes conceptuels ou encore un oubli.

Mais c'est aussi pour ça que mon intervention sur ce sujet concernait de l'optimisation : on aligne son code, on le découpe logiquement et au final on obtient un résultat au moins aussi efficace et surtout plus facile à relire plus tard si on doit y faire une modification ou un ajout (cf ma signature ;) )

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

par stealth35 » 27 août 2010, 02:55

Pour te répondre, j'ai créé précisément ce bout de code avec un WHILE pour récupérer les messages de ZDE que j'ai mis au dessus.

Disons que c'est du mode super-strict ;)
ouais mais c'est pas mal, fraudais que je choppe ça doit y avoir plein de petit optimisation du genre :wink:

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

par Cyrano » 27 août 2010, 02:49

Pour te répondre, j'ai créé précisément ce bout de code avec un WHILE pour récupérer les messages de ZDE que j'ai mis au dessus.

Disons que c'est du mode super-strict ;)

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

par stealth35 » 27 août 2010, 02:45

ah oui ok, c'est bien et c'est pas bien, parce que avec un truc bon on a l'impression que c'est faux, mais c'est interssant
si tu fais ça ta une erreur aussi ?
while(($ligne = mysql_fetch_assoc($exec)))

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

par Cyrano » 27 août 2010, 02:25

Je viens de réaliser que ce n'est pas à l'affichage dans un navigateur que j'ai ça mais dans Zend Studio.
Si je fais un truc du genre
while($ligne = mysql_fetch_assoc($exec))
Dans ZDE j'obtiens le message : « Assignation dans une condition (ligne 4)»
Avec la description suivante :
Description
Les assignation dans une structure conditionnelle sont généralement le résultat d'une coquille. Dans de nombreux cas, au lieu du signe =, l'opérateur d'égalité devrait être utilisé. Lorsque vous comparez une variable et une expression non-variable, il es courant de placer la variable à droite de l'opérateur d'égalité. De cette manière, si l'opérateur d'égalité est transformé en opérateur d'assignation par erreur, PHP indiquera immédiatement une erreur. Cela vous aidera à éviter toute la famille de ce bug.
Exemple
if($a = 1){ // il est probable que $a == 1 soit plus approprié.
    ...
}

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

par stealth35 » 27 août 2010, 00:36

pourquoi tu fais ?
false !== ($datas = mysql_fetch_assoc($exec))
Configure ton php.ini en E_STRICT et essaye sans, tu verras pourquoi ;)
On ne devrait jamais utiliser d'opérateur d'affectation dans une structure de contrôle : donc, on crée une vraie condition en testant le résultat booléen produit par l'affectation.
bizarre je bosse toujours en strict jamais eu de problème, le while est deja une condition (et s’arrête quand il est a false), mysql_fetch_* renvoie deja false a la fin
ca reviens a faire :
var_dump($data = false);
//(bool) false
toi tu fais
var_dump(false !== ($data = false));
//(bool) false
ce qui reviens au même, en strict t'as quoi comme message d'erreur ?

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

par Cyrano » 27 août 2010, 00:26

pourquoi tu fais ?
false !== ($datas = mysql_fetch_assoc($exec))
Configure ton php.ini en E_STRICT et essaye sans, tu verras pourquoi ;)
On ne devrait jamais utiliser d'opérateur d'affectation dans une structure de contrôle : donc, on crée une vraie condition en testant le résultat booléen produit par l'affectation.

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

par stealth35 » 27 août 2010, 00:18

pourquoi tu fais ?
false !== ($datas = mysql_fetch_assoc($exec))

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

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 ;)

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

par Invité » 25 août 2010, 14:44

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

par stealth35 » 25 août 2010, 06:08

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

par Invité » 25 août 2010, 05:54

rolala j fais quoi maintenant?? mdrrr

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

par stealth35 » 25 août 2010, 05:52

je vois, c'est la conf qu'est foireuse il va cherché une extension php 4
donc en gros t'as pas domdocument