Modérateur PHPfrance |
2575 Messages
07 janv. 2009, 11:18
L'idée est de n'afficher un critère ou un sous-critère qu'une seule fois sachant que dans la base de données on en a des doublons selon la multiplicité des questions. Moi, je ferais un regroupement/classement des questions par critère et sous-critère dans la requête exécutée avant d'afficher la table HTML. Et grâce à ce classement, j'afficherais les questions tout en évitant d'afficher les mêmes critères et sous-critères plus d'une fois. Voici comment:
// Exécution de la requête SQL
$sql = "SELECT critere_question, sous_critere_question, question, reponse, remarque FROM mes tables ... ORDER BY critere_question, sous_critere_question";
$resultat = mysql_query($sql);
// Lecture du résultat et affichage
$critere_en_cours = ""; // variable permettant de mémoriser un critère traité pour éviter de le réafficher plus d'une fois
$sous_critere_en_cours = ""; // variable permettant de mémoriser un sous-critère traité pour éviter de le réafficher plus d'une fois
echo '<table>';
while ($resultat && $row = mysql_fetch_array($resultat)){
// Afficher une seule fois le critère en cours de traitement
if ($critere_en_cours != $row['critere_question']){
echo '<tr><th colspan="5">' . $row['critere_question'] . '</th></tr>';
// Mémoriser le critère en cours
$critere_en_cours = $row['critere_question'];
}
// Afficher une seule fois le sous-critère en cours de traitement
if ($sous_critere_en_cours != $row['sous_critere_question']){
echo '<tr><td><th colspan="5">' . $row['sous_critere_question'] . '</th></tr>';
// Mémoriser le sous-critère en cours
$sous_critere_en_cours = $row['sous_critere_question'];
}
// Et dans tous les cas, afficher la question en cours
echo '<tr><td>' . $row['question'] . '</td><td>' . $row['reponse'] . '</td><td>' . $row['remarque'] . '</td></tr>';
}
echo '</table>';
Alors, comme tu vois, les deux IF dans la boucle WHILE permettent d'éviter de réafficher le même critère et le même sous-critère plusieurs fois.
Mais il faut noter que le classement ORDER BY de la requête de base est obligatoire pour ce programme car c'est lui qui va rassembler les questions dans des blocs de même critère et sous-critère ce qui permet de les lire séquentiellement dans l'ordre.
Ainsi, par exemple, le résultat suivant qui contient 8 questions classées par critère et sous-critère:
- c1, sc1, q1, ...
c1, sc1, q2, ...
c1, sc2, q3, ...
c1, sc2, q4, ...
c2, sc1, q5, ...
c2, sc1, q6, ...
c2, sc2, q7, ...
c2, sc2, q8, ...
sera affiché comme ça:
-----
c1
-----
- sc1
-----
q1, ...
q2, ...
-----
sc2
-----
q3, ...
q4, ...
-----
c2
-----
- sc1
-----
q5, ...
q6, ...
-----
sc2
-----
q7, ...
q8, ...
--------
//////----
//---
//----
//////
-------
//---
//----
//---
//----
//---
//
------
//////----
//////-----
//////
-----
||--------
||--
||---
||
Prendre le recul n'est pas une perte de temps.
ps:
Affrontez moi dans l'arène