IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation requete dans while imbriqué et foreach


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Optimisation requete dans while imbriqué et foreach
    Bonjour,
    J'ai un soucis d'optimisation et de modification, à l'initial le code ressemblai à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
            $queryf = sql_query("SELECT name, moderator, fid FROM $table_forums WHERE type='forum'");
            while ($mod = sql_fetch_object($queryf)) {
     
                ?>
     
    <tr class="tablerow altbg2">
    <td><?php echo $mod->name ?></td>
    <td><input type="text" size="60" name="mod<?php echo $mod->fid ?>" value="<?php echo htmlspecialchars($mod->moderator) ?>" /></td>
    </tr>
     
    <?php
     
                $querys = sql_query("SELECT name, moderator, fid FROM $table_forums WHERE type='sub' AND fup='" . intval($mod->fid) . "' ORDER BY displayorder");
                while ($mod = sql_fetch_object($querys)) {
     
                    ?>
     
    <tr class="tablerow altbg2">
    <td align="right">&nbsp;&nbsp;<?php echo $mod->name ?></td>
    <td align="right">&nbsp;&nbsp;<input type="text" size="55" name="mod<?php echo $mod->fid ?>" value="<?php echo htmlspecialchars($mod->moderator) ?>" /></td>
    </tr>
     
    <?php
                }
            }
     
            ?>
    En fait le script est un forum et cette portion de code permet l'affichage:

    -De nom du forum et ses modérateurs
    -Des noms des sous-forums (du forum 'fid') et ses modérateurs

    ex:
    - Forum1 (modérateur:toto, titi, tata)
    • -Sous-forum1 (modérateur:toto, titi, tata)
    • -Sous-forum2 (modérateur:toto)

    - Forum2 (modérateur:tata)

    • -Sous-forum1 (modérateur:toto, titi, tata)
    • -etc


    Les deux requêtes se font sur la même table $table_forums

    De mon coté, je souhaite optimiser tout ça par une séparation php/html via un moteur de template et optimisation de cette boucle.

    J'ai donc fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
                    $mod1 = array();
                    $modforumlist = array();
                    $mod2 = array();
                    $modsubforumlist = array();
            $queryf = sql_query("SELECT name, moderator, fid 
                                                     FROM $table_forums 
                                                     WHERE type='forum'");
            while ($mod1 = sql_fetch_assoc($queryf)) {   
                     $modforumlist[] = $mod1;
     
                $querys = sql_query("SELECT name, moderator, fid 
                                                         FROM $table_forums 
                                                         WHERE type='sub' 
                                                         AND fup='" . intval($mod1['fid']) . "' 
                                                         ORDER BY displayorder");
                while ($mod2 = sql_fetch_assoc($querys)) {
                    $modsubforumlist[] = $mod2;
                }
     
            }
            /* Template initialisieren */
                    $template = load_class('Template');
                    $template->init_path(__FILE__);
     
                    $template->modforumlist = $modforumlist;
                    $template->modsubforumlist = $modsubforumlist;
                    $template->display('admin.mods.html');
    Et pour la sortie template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                <?php foreach ($this->modforumlist as $mod1) : ?>
                <tr>
                      <td><?php echo $mod1['name'] ?></td>
                        <td><input type="text" size="60" name="mod<?php echo $mod1['fid'] ?>" value="<?php echo htmlspecialchars($mod1['moderator']) ?>" /></td>
                    </tr>
                    <?php foreach ($this->modsubforumlist as $mod2) : ?>
                    <tr class="tablerow altbg2">
                            <td align="right">&nbsp;&nbsp;<?php echo $mod2['name'] ?></td>
                            <td align="right">&nbsp;&nbsp;<input type="text" size="55" name="mod<?php echo $mod2['fid'] ?>" value="<?php echo htmlspecialchars($mod2['moderator']) ?>" /></td>
                        </tr>
                <?php endforeach ?>
            <?php endforeach ?>
    Mais ça m'a pas lair très propre , ainsi si quelqu'un a une ou des idées merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2010
    Messages : 7 920
    Points : 10 724
    Points
    10 724
    Par défaut
    ça vient de quelle lib le sql_query ?

    t'as pas PDO ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Slt,

    ça vient de quelle lib le sql_query ?

    t'as pas PDO ?
    Non c'est une api propre au forum en question.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2007
    Messages : 62
    Points : 84
    Points
    84
    Par défaut
    ça a l'air nickel pour moi ! il y a une séparation entre la récup de données et l'affichage. Presque MVC. C'est plus facile à entretenir. C'est parfait

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Slt,
    Bien en fait je viens de me rendre compte qu'il y a une erreur dans le code.

    L'affichage des sous forums ne tient pas compte de l'id du forum et tous les sous forums sont systématiquement affichés pour tous les forums alors que ce doit pas être le cas.

    - Forum1 (modérateur:toto, titi, tata)
    • -Sous-forum1 (modérateur:toto, titi, tata)
    • -Sous-forum2 (modérateur:toto)

    - Forum2 (modérateur:tata)

    • -Sous-forum1 (modérateur:toto, titi, tata)
    • -Sous-forum2 (modérateur:toto)

    Je cherche mais si quelqu'un a une idée je suis preneur

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2007
    Messages : 62
    Points : 84
    Points
    84
    Par défaut
    C'est clair que si tu fais pas le test sur l'id du forum dans la boucle d'affichage des sous forums t'auras ce résultat. Pourtant je vois 'fid' dans 2 requetes. ça doit être l'id du forum.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Oui en fait forum et sous-forum sont sur la même table

    type fid name status lastpost moderator displayorder private description allowhtml allowsmilies allowbbcode guestposting userlist theme posts threads fup postperm allowimgcode totaltime
    La deuxième requête sql doit récupérer tous les sous-forum (sub) du forum ayant l'id (fid) trouvé entre autres dans la première requête sql. La correspondance entre deux se faisant via le champ 'fup'.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2007
    Messages : 62
    Points : 84
    Points
    84
    Par défaut
    alors il faut ajouter le champ fup dans le sql des sous forum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT name, moderator, fid , fup ...etc
    et tester si fup correspond au fid dans le template

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci cela résoud le prob, en fait j'ai mis ça pour la deuxième requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $querys = sql_query("SELECT name, moderator, fid, fup 
                                                         FROM $table_forums 
                                                         WHERE type='sub' 
                                                         AND fup='" . intval($mod1['fid']) . "' 
                                                         ORDER BY displayorder");
    et coté template j'ai rajouté un if pour les sous-forum qui s'affiche seulement quand fup == fid

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    <?php foreach ($this->modsubforumlist as $mod2) : ?>
                        <?php if ($mod2['fup'] === $mod1['fid']) { ?>
                        <tr class="bg2">
                                <td align="right">&nbsp;&nbsp;<?php echo $mod2['name'] ?></td>
                                <td align="right">&nbsp;&nbsp;<input type="text" size="55" name="mod<?php echo $mod2['fid'] ?>" value="<?php echo htmlspecialchars($mod2['moderator']) ?>" /></td>
                            </tr>
                        <?php }    ?>    
                <?php endforeach ?>
    Par contre de mon avis personnel (pas forcément très connaisseur) ça me parait pas très propre comme solution, comme c'est une portion de code que je risque de pas mal réutiliser je vais essayer de trouver voir si y a mieux (plus clair, simple)à faire.


    Merci en tous cas pour ton intérêt, si tu vois autres possibilités n'hésite pas

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2007
    Messages : 62
    Points : 84
    Points
    84
    Par défaut
    Je vois ce que tu veux dire. Si tu cherches à réutiliser le même code il n'y a rien de mieux que faire une petite class ou une fonction pour ça. Je parle de cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $mod1 = array();
                    $modforumlist = array();
                    $mod2 = array();
                    $modsubforumlist = array();
            $queryf = sql_query("SELECT name, moderator, fid 
                                                     FROM $table_forums 
                                                     WHERE type='forum'");
            while ($mod1 = sql_fetch_assoc($queryf)) {   
                     $modforumlist[] = $mod1;
     
                $querys = sql_query("SELECT name, moderator, fid 
                                                         FROM $table_forums 
                                                         WHERE type='sub' 
                                                         AND fup='" . intval($mod1['fid']) . "' 
                                                         ORDER BY displayorder");
                while ($mod2 = sql_fetch_assoc($querys)) {
                    $modsubforumlist[] = $mod2;
                }
     
            }
    Coté mise en page/template , tu peux sortir tous ces align="right" et même size="60"(<input>) dans css.
    En fait, la perfection n'a pas de limite. Alors courage!

Discussions similaires

  1. Problème boucle while imbriquée dans autre boucle while
    Par nattydreadnatty dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2010, 14h58
  2. [MySQL] optimisation requete mysql - while imbriquée
    Par Sbeuh dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/08/2010, 00h43
  3. Optimisation requete avec select Imbriqué
    Par sintesi974 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/08/2010, 17h18
  4. optimiser une boucle while imbriquer dans une boucle for
    Par bakaratoun dans le forum MATLAB
    Réponses: 0
    Dernier message: 28/01/2010, 15h35
  5. Réponses: 2
    Dernier message: 18/09/2007, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo