Bonjour.
C'est mon premier message, soyez indulgents !

A partir d'une table Planning contenant des données telles que :

date_elem nom_elem lieu_elem
2006-11-15 / evenement1 / endroit1
2006-11-16 / evenement1 / endroit1
2006-11-17 / evenement1 / endroit2
2006-12-07 / evenement1 / endroit2
2006-12-08 / evenement1 / endroit2
2006-12-09 / evenement1 / endroit2

Je voudrais récupérer : d'abord, chaque mois contenant un évènement, et celui-ci regroupant tous les évènements (dans le cas présent : 2006-11 et 2006-12) ; puis, pour chaque mois, afficher la liste de tous les endroits où l'évènement1 s'est produit (dans le cas présent : en 2006-11 -> endroit1 et endroit2 ; en 2006-12 -> endroit2). Mais je ne veux les afficher qu'une fois... (Compliqué, moi ? bah ouais...)

En gros je veux qu'à la fin, ça me donne ça :

En 2006-11, l'évènement1 s'est déroulé à endroit1, endroit2.
En 2006-12, l'évènement1 s'est déroule à endroit2.

Pour cela, j'utilise heu... une succession de boucles (on va dire) imbriquées les unes dans les autres... Enfin, voici mon 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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
$requete2 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' ORDER BY date_elem ASC";
// Je formule une requete pour récupérer toutes les
//dates correspondant à evenement1
$resultat2 = ExecRequete ($requete2,$connexion);
// Là, dans le résultat, j'ai toutes les dates.
// Il faut que j'arrive à grouper toutes les dates par mois. 
// ex : Mars 2006, Octobre 2006
 
// Je spécifie une variable $i, pour ma boucle.
$i = '1';
 
while ($planning = ObjetSuivant($resultat2)) { // Je crée une 
// boucle « Tant qu'il y a un résultat associé à ma requête... »
 
    // On spécifie une variable fourre-tout qui contient 
    //toutes les dates en $dateplanning[$1] en $i++
      $dateplanning[$i] = $planning->date_elem;
      // On crée, à partir de chaque date, une date de type 
    // AAAA/MM/01, pour, plus tard, comparer deux dates
      $datemoisencours = substr($dateplanning[$i],'0','4')."-".substr($dateplanning[$i],'5','2')."-01";
      // Je récupère le mois en cours, pour créer une date
      // de type AAAA/MM+1/01
      $moisencours = substr($dateplanning[$i],'5','2');
      // Si le mois en cours est inférieur à dix, j'ajoute 0,
    // et j'obtiens ainsi le mois suivant.
      if ($moisencours < '10') {
          $moissuivant = $moisencours+'1';
          $moissuivant = "0$moissuivant";
      }
      else {
          $moissuivant = $moisencours+'1';
      }
      // Là j'ai la date du mois suivant.
      $datemoisuivant = substr($dateplanning[$i],'0','4')."-".$moissuivant."-01";
    // Si ce n'est pas la première entrée, je peux demander 
    //la création d'une variable donnant la date
    // en format AAAA-MM-JJ de l'entrée précédente.
    if ($i != '1') {
          $dateentreeprecedente = substr($dateplanning[$i-'1'],'0','4')."-".substr($dateplanning[$i-'1'],'5','2')."-01";
    }
    // Si c'est la première entrée, je mets en écho le mois (en 
    //une seule fois), puis je spécifie comme requête : Choisir 
    // tous les éléments de planning quand le nom de l'élément
    // est égal à l'évenement1 et que la date qui lui est associée 
    // se situe entre le premier du mois en cours et le premier du 
    // mois suivant. Dans cette requête, je spécifie une option GROUP BY
    // pour éviter les éventuels doublons.
    if ($i == '1') {
          $datefinale = DateSimpleFr($datemoisencours);
          echo "en <b>$datefinale</b> ";
          $requete3 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' AND date_elem>='$datemoisencours' AND date_elem<'$datemoisuivant' GROUP BY lieu_elem ORDER BY date_elem ASC";
          $resultat3 = ExecRequete($requete3,$connexion);
          while ($donnees3 = ObjetSuivant($resultat3))
        {
              echo $donnees3->lieu_elem. ", ";
          }
      }
    // Si ce n'est pas la première entrée, et que le mois de la ligne
    // précédent n'est pas le même
    // Que le mois en cours, j'effectue la même requête.
      if ($i != '1' && $datemoisencours != $dateentreeprecedente)
    {
        $datefinale = DateSimpleFr($datemoisencours);
        echo "en <b>$datefinale (date$i)</b> ";
          $requete4 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' AND date_elem>='$datemoisencours' AND date_elem<'$datemoisuivant' GROUP BY lieu_elem ORDER BY date_elem ASC";
          $resultat4 = ExecRequete($requete4,$connexion);
          while ($donnees4 = ObjetSuivant($resultat4))
        {
         echo $donnees4->lieu_elem. ", ";
        }
      }
 
    // J'auto-ajoute $i
    $i++;
}
Je précise bien que, dans le futur, il y aura peut-être un mois où il n'y aura rien (voilà pourquoi je ne crée par de $datemoisprecedent, et plutôt une $dateentreeprecedente.

Donc voilà.

En local, cela fonctionne parfaitement. Cela m'affiche bien :

En 2006-11, l'évènement1 s'est déroulé à endroit1, endroit2.
En 2006-12, l'évènement1 s'est déroule à endroit2.

Mais sur le site où je publie ce code, cela m'affiche :

En 2006-11, l'évènement1 s'est déroulé à endroit1, endroit2.
En 2006-12, l'évènement1 s'est déroule à.

Et je ne comprends pas pourquoi.

Quelqu'un peut-il m'aider ?

Alex.