Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de boucle

eviter les doublons

Sujet résolu
    7 juin 2007 à 20:23:03

    Bien le bonjour,

    Pour un ami, je veux faire un systeme qui lui permet de mettre une liste sur son site avec les 4 derniers topics du forum sur lequels ont été posté des réponses (et non pas le topic des 4 dernieres reponses :-° ).
    J'ai donc codé ce que je pensais être juste (ultra lourd... ^^ ) mais, il y a un probleme, le navigateur rame (façon de parlé) et au bout de 10 000 ans, il me met une erreur 500.
    J'en suis venu à me poser la question suivante qui ne m'etait jamais venu à l'esprit (j'ai cherché un peu et pas trouve de reponse) : peut-on mettre une boucle (while()) dans une autre boucle (while()) ???
    Voici le code en question :

    <?PHP
    // En tete du tableau
    echo '<table style="margin-left: auto;margin-right: auto;text-align: left;width: 100%;  padding-top:0px;border:0px;" cellspacing="4" cellpadding="1">\n';

    $i = '0';
    $retour = mysql_query("SELECT * FROM nuked_forums_messages ORDER BY id DESC");
    while($donnees = mysql_fetch_array($retour) AND $i <= '4')
            {
            // Si c'est le premier tout : on enregistre le titre, il est forcement nouveau !
            if($i == '0')
                    {
                    $titre1 = $donnees['titre'];
                    $forum_id1 = $donnees['forum_id'];
                    $thread_id1 = $donnees['thread_id'];
                    $i++;
                    }
            // Si c'est le 2eme tour ou temps qu'on a pas de 2eme texte different du premier
            elseif($i == '1')
                    {
                    $j = '0';
                    while($j < '1')
                            {
                            // Si le titre est different du premier : on enregistre et on augmente $j et $i
                            if($donnees['titre'] != $titre1)
                                    {
                                    $titre2 = stripslashes($donnees['titre']);
                                    $forum_id2 = $donnees['forum_id'];
                                    $thread_id2 = $donnees['thread_id'];
                                    $i++;
                                    $j++;
                                    }
                            // Si titre identique on refait la boucle
                            else
                                    {
                                    $i = '1';
                                    $j = '0';
                                    }
                            }
                    }
                   
            // Si c'est le 3eme tour ou temps qu'on a pas de 3eme texte different du premier et 2eme
            elseif($i == '2')
                    {
                    $j = '0';
                    while($j < '1')
                            {
                            // Si le titre est different du premier : on enregistre et on augmente $j et $i
                            if($donnees['titre'] != $titre1 AND $donnees['titre'] != $titre2)
                                    {

                                            $titre3 = stripslashes($donnees['titre']);
                                            $forum_id3 = $donnees['forum_id'];
                                            $thread_id3 = $donnees['thread_id'];
                                            $i++;
                                            $j++;
                                    }
                           
                            // Si titre identique on refait la boucle
                            else
                                    {
                                    $i = '2';
                                    $j = '0';
                                    }
                            }
                    }

            // Si c'est le 4eme tour ou temps qu'on a pas de 4eme texte different du premier et 2eme et 3eme
            elseif($i == '3')
                    {
                    $j = '0';
                    while($j < '1')
                            {
                            // Si le titre est different du premier : on enregistre et on augmente $j et $i
                            if($donnees['titre'] != $titre1 AND $donnees['titre'] != $titre2 AND $donnees['titre'] != $titre3)
                                    {

                                            $titre4 = stripslashes($donnees['titre']);
                                            $forum_id4 = $donnees['forum_id'];
                                            $thread_id4 = $donnees['thread_id'];
                                            $i++;
                                            $j++;
                                    }
                           
                            // Si titre identique on refait la boucle
                            else
                                    {
                                    $i = '3';
                                    $j = '0';
                                    }
                            }
                    }

                   
            elseif($i == '4')
                    {
                    // 1er
                    echo "<tr><td style=\"padding-left:20px;\">&nbsp;<a href=\"index.php?file=Forum&amp;page=viewtopic&amp;forum_id=" . $forum_id1 . "&amp;thread_id=" . $thread_id1 . "\" style=\"color:#9f9f9f;\">" . $titre1 . "</a></td>\n"
                    . "</tr>\n";
                    // 2eme
                    echo "<tr><td style=\"padding-left:20px;\">&nbsp;<a href=\"index.php?file=Forum&amp;page=viewtopic&amp;forum_id=" . $forum_id2 . "&amp;thread_id=" . $thread_id2 . "\" style=\"color:#9f9f9f;\">" . $titre2 . "</a></td>\n"
                    . "</tr>\n";
                    // 3eme
                    echo "<tr><td style=\"padding-left:20px;\">&nbsp;<a href=\"index.php?file=Forum&amp;page=viewtopic&amp;forum_id=" . $forum_id3 . "&amp;thread_id=" . $thread_id3 . "\" style=\"color:#9f9f9f;\">" . $titre3 . "</a></td>\n"
                    . "</tr>\n";       
                    // 4eme
                    echo "<tr><td style=\"padding-left:20px;\">&nbsp;<a href=\"index.php?file=Forum&amp;page=viewtopic&amp;forum_id=" . $forum_id4 . "&amp;thread_id=" . $thread_id4 . "\" style=\"color:#9f9f9f;\">" . $titre4 . "</a></td>\n"
                    . "</tr>\n";
                    $i++;
                    }
            else
                    {
                    }
            }
    // Fin du tableau
    echo "</table>\n";
    ?>


    Je vous explique en gros le fonctionnement que j'ai voulu appliquer : on enregistre le premier (dernier (ORDER BY id DESC)) dans $titre1 car il ne peut pas exister de titre du même nom plus haut (si si réfléchissez, c'est logique ;) ) puis on test à chaque fois si c'est bien different des textes precedents (pour les 2 premiers c'est bon, mais, dès que je rajoute le 3eme, ça marche plus (la 3eme condtiton) ...
    Merci d'avance pour vos reponses !

    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2007 à 21:57:28

      Pour répondre à la question sans chercher à comprendre le reste (Trop tard pour réfléchir, désolé ^^ ) : Oui, tu peux imbriquer les while. Mais attention à ne pas faire de boucles infinies, ou de boucles trop longue.

      Si tu as un while qui s'exécute 10 fois, à l'intérieur d'un autre while qui s'exécute 10 fois, à l'intérieur d'un 3ème... Tu as une boucle qui tourne 1000 fois : Ca monte vite, et ça peut bouffer pas mal (Et c'est généralement pas utile en php :p )

      L'essentiel est de ne jamais mettre de boucle dans un while (A de rares exceptions, mais normalement avec les jointures tu peux t'en sortir).


      L'erreur 500 est étrange par contre. J'aurais plutôt vu un "Maximum execution time of 30 seconds exceeded" ou quelque chose comme ça.

      Citation : Pas de titre

      Erreur 500 Erreur de configuration (Internal server error)



      Tu n'as le problème que sur cette page ?

      J'essaierai de regarder le code de plus près demain.
      • Partager sur Facebook
      • Partager sur Twitter
        8 juin 2007 à 11:36:26

        .

        -
        Edité par Firebayll 23 mai 2013 à 15:15:29

        • Partager sur Facebook
        • Partager sur Twitter

        Probleme de boucle

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown