Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/07/2011, 20h42   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 1
Points : 1
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 :
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 :
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 :
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
Diaboloz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 20h59   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
ça vient de quelle lib le sql_query ?

t'as pas PDO ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 21h08   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 1
Points : 1
Slt,

Citation:
ça vient de quelle lib le sql_query ?

t'as pas PDO ?
Non c'est une api propre au forum en question.
Diaboloz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 09h54   #4
Membre régulier
 
Inscription : 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 : 82
Points : 82
ç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
kodeya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h27   #5
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 1
Points : 1
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
Diaboloz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h51   #6
Membre régulier
 
Inscription : 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 : 82
Points : 82
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.
kodeya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h58   #7
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 1
Points : 1
Oui en fait forum et sous-forum sont sur la même table

Citation:
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'.
Diaboloz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 11h07   #8
Membre régulier
 
Inscription : 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 : 82
Points : 82
alors il faut ajouter le champ fup dans le sql des sous forum :
Code :
SELECT name, moderator, fid , fup ...etc
et tester si fup correspond au fid dans le template
kodeya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 11h31   #9
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 1
Points : 1
Merci cela résoud le prob, en fait j'ai mis ça pour la deuxième requête:

Code :
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 :
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
Diaboloz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 11h50   #10
Membre régulier
 
Inscription : 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 : 82
Points : 82
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 :
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!
kodeya est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h59.


 
 
 
 
Partenaires

Hébergement Web