Nombre de nouveaux membres inscrit par mois

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour, j'ai créer un script pour savoir le nombre de nouveaux membres mais ça ne marche pas comme je voudrais, voici une partie du code :
<?php 
   echo "Les membres inscrit par mois: <br />"; 
   $req = $bdd->prepare("SELECT * FROM membres");
   $req->execute();

    while($info = $req->fetch()){
        $date = date_parse($info['date_inscription']); 
            switch ($date['month']) {
                case 1:
                    $nb = count($date['month']);
                    echo "Le mois de janvier : ".$nb." nouveaux membres <br />"; 
                    break;
                case 2:
                    $nb = count($date['month']);
                    echo "Le mois de février : ".$nb." nouveaux membres <br />"; 
                    break;
                case 3:
                    $nb = count($date['month']);
                    echo "Le mois de mars : ".$nb." nouveaux membres <br />"; 
                    break;
                case 4:
                    $nb = count($date['month']);
                    echo "Le mois de avril : ".$nb." nouveaux membres <br />"; 
                    break;
                case 5:
                    $nb = count($date['month']);
                    echo "Le mois de mai : ".$nb." nouveaux membres <br />"; 
                    break;
                case 6:
                    $nb = count($date['month']);
                    echo "Le mois de juin : ".$nb." nouveaux membres <br />"; 
                    break;
                case 7:
                    $nb = count($date['month']);
                    echo "Le mois de juillet : ".$nb." nouveaux membres <br />"; 
                    break;
                case 8:
                    $nb = count($date['month']);
                    echo "Le mois de aout : ".$nb." nouveaux membres <br />"; 
                    break;
                case 9:
                    $nb = count($date['month']);
                    echo "Le mois de septembre : ".$nb." nouveaux membres <br />"; 
                    break;
                case 10:
                    $nb = count($date['month']);
                    echo "Le mois de octobre : ".$nb." nouveaux membres <br />"; 
                    break;
                case 11:
                    $nb = count($date['month']);
                    echo "Le mois de novembre : ".$nb." nouveaux membres <br />"; 
                    break;
                case 12:
                    $nb = count($date['month']);
                    echo "Le mois de decembre : ".$nb." nouveaux membres <br />"; 
                    break;
                default:
                    echo "erreur <br />";
            } 
    }
?>

ce code me donne ça :
Les membres inscrit par mois:
Le mois de septembre : 1 nouveaux membres
Le mois de janvier : 1 nouveaux membres
Le mois de janvier : 1 nouveaux membres

et je voudrais que par exemple au mois de janvier, ça affiche ça :
Le mois de janvier : 2 nouveaux membres
au lieu d'y mettre sur 2 lignes

Merci d'avance
Nils0

8 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    @Reivax :
    Il me semble que ça ne marchera pas, car la jointure sera satisfaite s'il y a des inscrits sur le même mois d'une autre année.
    Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.


    Voici ce que donne ma requête :


    Janvier 2016 -> 1 Inscrit
    Janvier 2017 -> 1 Inscrit
    Février 2017 -> 2 Inscrits
    Tous les autres mois (peu importe l'année...) 0 inscrit.

    Sinon, plus complet ... (là ça fera tout comme tu veux... :-) )

    set @dateDeb = '2015-01-01';
    set @datefin = '2020-01-01';
    SELECT M.ANNEE
          ,M.MOIS
         , coalesce(D.nombre,0) as NB
    FROM
    (SELECT YEAR(selected_date) as ANNEE
         , MONTH(selected_date) as MOIS 
    FROM 
    (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
     (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
     (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
     (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
     (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
     (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
    WHERE selected_date between @dateDeb and @datefin
    GROUP BY ANNEE,MOIS
    ) M
    LEFT JOIN (
    		SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
          FROM membres
          GROUP BY YEAR(date_inscription), MONTH(date_inscription)
          ORDER BY YEAR(date_inscription), MONTH(date_inscription)
       )D ON D.mois = M.MOIS AND D.annee = M.ANNEE
    
    
              
    

    2
    1. Utilisateur anonyme
       
      Merci beaucoup,
      set @dateDeb = '2015-01-01';
      set @datefin = '2020-01-01';
      c'est a mettre aussi dans la requete sql ?
      0
    2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Utilisateur anonyme
       
      Oui.
      Ou sinon tu remplaces directement les cariables dans la requete...(C'est plus simple )
      0
    3. Utilisateur anonyme
       
      comme ça ? :
         $req = $bdd->prepare("
      set @dateDeb = '2015-01-01';
      set @datefin = '2020-01-01';
      SELECT M.ANNEE
            ,M.MOIS
           , coalesce(D.nombre,0) as NB
      FROM
      (SELECT YEAR(selected_date) as ANNEE
           , MONTH(selected_date) as MOIS 
      FROM 
      (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
       (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
       (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
       (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
       (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
       (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
      WHERE selected_date between @dateDeb and @datefin
      GROUP BY ANNEE,MOIS
      ) M
      LEFT JOIN (
          SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
            FROM membres
            GROUP BY YEAR(date_inscription), MONTH(date_inscription)
            ORDER BY YEAR(date_inscription), MONTH(date_inscription)
         )D ON D.mois = M.MOIS AND D.annee = M.ANNEE
      ");
         $req->execute();
      0
    4. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Utilisateur anonyme
       
      Voici le code complet :

      
      
      $sql = "SELECT M.ANNEE
                    ,M.MOIS
                   , coalesce(D.nombre,0) as NB
              FROM
              (SELECT YEAR(selected_date) as ANNEE
                   , MONTH(selected_date) as MOIS 
              FROM 
              (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
               (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
               (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
               (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
               (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
               (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
              WHERE selected_date between :dateDeb and :datefin
              GROUP BY ANNEE,MOIS
              ) M
              LEFT JOIN (
                  SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
                    FROM membres
                    GROUP BY YEAR(date_inscription), MONTH(date_inscription)
                    ORDER BY YEAR(date_inscription), MONTH(date_inscription)
                 )D ON D.mois = M.MOIS AND D.annee = M.ANNEE";
                 
      
      // Période de date pour l'affichage :           
      $adatas = array(':dateDeb'=>'2010-01-01',':datefin'=>'2020-01-01');
      
      try{
        $req = $bdd->prepare($sql);
        $req->execute($adatas);
        //on stocke le resultat dans un array...
        $resultat = $req->fetchAll(); 
      }catch(Exception $e){
        //En cas de souci dans la requete.
        echo "Erreur ! " .$e->getMessage();
      }
      
      
      
      //on retravaille l'array pour avoir quelquechose de plus exploitable :
      //on boucle sur le resultat de la requete :
      $arrfinal = array();
      foreach($resultat as $R){
         $A = $R['ANNEE'];
         $M = $R['MOIS'];
         $NB = $R['NB'];  
         $arrfinal[$A][$M]=$NB; 
      }
      
      $a_mois = array('janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
      ?>
      
      
      <html>
        <head>
          <title> TEST </title>
          <meta charset="utf8">
        </head>
        <body>
          <?php
          //on boucle sur l'array retravaillé pour faire l'affichage ...
          
          foreach($arrfinal as $ANNEES=>$MOIS){
            echo "<br><b>Année :$ANNEES</b>";  
            foreach($MOIS as $mois=>$p){
              echo "<br>Le mois de ".$a_mois[$mois-1] ." : $p nouveau". ($p>1 ? "x" : "") . " membre". ($p>1 ? "s" : "");
            }  
          }
          ?>
        </body>
      </html>
      
      


      NB : N'oublie pas, si ce n'est pas déjà fait, d'activer la gestion des erreurs PDO
      https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

      try{
      $bdd =new PDO('mysql:host=localhost; 
       dbname=mabdd; charset=utf8', 'user', 'password');
       $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
       $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      } catch(PDOException $e) {
          die('Erreur : ' . $e->getMessage());
      }
      
      0
    5. Utilisateur anonyme
       
      super merci beaucoup, je ne sais pas comment te remercier vu le nombre de fois que tu m'as aidé ... :)
      0
  2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Nils0,

    Utilises les fonctions SQL "COUNT()", "MONTH()" et "YEAR()", et en faisant une requête comme cela :

    SELECT COUNT(*) FROM membres WHERE MONTH(date_inscription) = 1  and YEAR(date_inscription) = 2017

    Tu aurais directement le résultat fournit par ton SGBD du nombre de personnes inscrites en Janvier 2017.

    (sauf erreur, car non testé)

    Dal
    1
    1. Utilisateur anonyme
       
      J'ai modifié le code (ça s'améliore mais c'est toujours pas ça...), voici le code:
      <?php 
      
         echo "Les membres inscrit par mois: <br />"; 
         $req = $bdd->prepare("SELECT * FROM membres");
         $req->execute();
      
         while ($info = $req->fetch()){
          $date = date_parse($info['date_inscription']);
             switch($date['month']){
                      case 1:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 1");
                          $p = $req2->RowCount(); 
                          echo "Le mois de janvier : ".$p." nouveaux membres <br />"; 
                          break;
                      case 2:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 2");
                          $p = $req2->RowCount();
                          echo "Le mois de février : ".$p." nouveaux membres <br />"; 
                          break;
                      case 3:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 3");
                          $p = $req2->RowCount();
                          echo "Le mois de mars : ".$p." nouveaux membres <br />"; 
                          break;
                      case 4:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 4");
                          $p = $req2->RowCount();
                          echo "Le mois de avril : ".$p." nouveaux membres <br />"; 
                          break;
                      case 5:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 5");
                          $p = $req2->RowCount();
                          echo "Le mois de mai : ".$p." nouveaux membres <br />"; 
                          break;
                      case 6:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 6");
                          $p = $req2->RowCount();
                          echo "Le mois de juin : ".$p." nouveaux membres <br />"; 
                          break;
                      case 7:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 7");
                          $p = $req2->RowCount();
                          echo "Le mois de juillet : ".$p." nouveaux membres <br />"; 
                          break;
                      case 8:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 8");
                          $p = $req2->RowCount();
                          echo "Le mois de aout : ".$p." nouveaux membres <br />"; 
                          break;
                      case 9:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 9");
                          $p = $req2->RowCount();
                          echo "Le mois de septembre : ".$p." nouveaux membres <br />"; 
                          break;
                      case 10:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 10");
                          $p = $req2->RowCount();
                          echo "Le mois de octobre : ".$p." nouveaux membres <br />"; 
                          break;
                      case 11:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 11");
                          $p = $req2->RowCount();
                          echo "Le mois de novembre : ".$p." nouveaux membres <br />"; 
                          break;
                      case 12:
                          $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 12");
                          $p = $req2->RowCount();
                          echo "Le mois de decembre : ".$p." nouveaux membres <br />"; 
                          break;
                      default:
                          echo "erreur <br />";
                  }
         }
      
                   
      
      ?>
      

      ce qui me donne :
      Les membres inscrit par mois:
      Le mois de septembre : 1 nouveaux membres
      Le mois de janvier : 2 nouveaux membres
      Le mois de janvier : 2 nouveaux membres

      comment empécher qu'il y est 2 fois la même ligne ?
      0
  3. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    Comme [Dal], mais avec un GROUP BY tu peux obtenir directement tout ce que tu veux :
    SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
    FROM membres
    GROUP BY YEAR(date_inscription), MONTH(date_inscription)
    ORDER BY YEAR(date_inscription), MONTH(date_inscription)
    


    Xavier
    1
    1. Utilisateur anonyme
       
      super merci beacoup a vous deux pour votre réponse rapide
      je vais voir ce que je peux faire ...
      0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Pour préciser ma réponse, voici ce que tu pourrais écrire :
      <?php 
         function mois($numero)
         {
            switch ($numero)
            {
               case 1: return "janvier";
               case 2: return "février";
               case 3: return "mars";
               case 4: return "avril";
               case 5: return "mai";
               case 6: return "juin";
               case 7: return "juillet";
               case 8: return "août";
               case 9: return "septembre";
               case 10: return "octobre";
               case 11: return "novembre";
               case 12: return "décembre";
               default: return false;
            }
         }
         echo "Les membres inscrit par mois : <br />"; 
         $req = $bdd->prepare("SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
                FROM membres
                GROUP BY YEAR(date_inscription), MONTH(date_inscription)
                ORDER BY YEAR(date_inscription), MONTH(date_inscription)");
         $req->execute();
      
         while($info = $req->fetch())
         {
            $date = mois($info['mois']) . ' ' . $info['annee'];
            $nombre = $info['nombre'];
            echo "Le mois de $date : $nombre nouveaux membres. <br />";
         }
      ?>
      
      0
    3. Utilisateur anonyme
       
      super merci beacoup ça marche comme je veux...
      en réalité c'est tous simple :/
      0
  4. Utilisateur anonyme
     
    J'ai une dernière question, j'aimerais que ça affiche 0 quand il n'y a de nouveau membre inscrit pendant le mois...
    exemple :
    Le mois de mars: 0 nouveau membre

    Merci d'avance
    Nils0
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Ah, là ça devient plus compliqué...
    Il va falloir faire de la détection de trous au niveau du PHP, je pense que c'est le plus simple.

    L'idée c'est, lors de la boucle, de vérifier si ce qu'on s'apprête à écrire correspond bien au mois suivant et, sinon, de remplir par une ligne à 0.

    Du coup je propose quelque chose comme ça :

    <?php 
       function mois_suivant($mois, $annee)
       {
          $nouvelle_annee = $annee;
          $nouveau_mois = $mois + 1;
          if ($nouveau_mois == 13)
          {
             $nouveau_mois = 1;
             $nouvelle_annee = $annee + 1;
          }
          return array($nouveau_mois, $nouvelle_annee);
       }
       function mois($numero)
       {
          switch ($numero)
          {
             case 1: return "janvier";
             case 2: return "février";
             case 3: return "mars";
             case 4: return "avril";
             case 5: return "mai";
             case 6: return "juin";
             case 7: return "juillet";
             case 8: return "août";
             case 9: return "septembre";
             case 10: return "octobre";
             case 11: return "novembre";
             case 12: return "décembre";
             default: return false;
          }
       }
       function remplir_trous ($mois_debut, $annee_debut, $mois_fin, $annee_fin)
       {
          list($mois, $annee) = mois_suivant($mois_debut, $annee_debut);
          while ($mois != $mois_fin || $annee != $annee_fin)
          {
             ecrire_inscrits($mois, $annee, 0);
             list($mois, $annee) = mois_suivant($mois, $annee);
          }
       }
       function ecrire_inscrits ($mois, $annee, $nombre)
       {
          $date = mois($mois) . ' ' . $annee;
          $nombre = $nombre;
          echo "Le mois de $date : $nombre nouveau(x) membre(s). <br />";
       }
    
       echo "Les membres inscrits par mois : <br />"; 
       $req = $bdd->prepare("SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
              FROM membres
              GROUP BY YEAR(date_inscription), MONTH(date_inscription)
              ORDER BY YEAR(date_inscription), MONTH(date_inscription)");
       $req->execute();
    
       $debut = true;
       while($info = $req->fetch())
       {
          if (!$debut) // On ne remplit pas les trous au premier passage...
          {
             remplir_trous($mois_precedent, $annee_precedente, $info['mois'], $info['annee']);
             $debut = false;
          }
          ecrire_inscrits($info['mois'], $info['annee'], $info['nombre']);
          $mois_precedent = $info['mois'];
          $annee_precedente = $info['annee'];
       }
    ?>
    


    Je crois que c'est bon.
    Par contre j'ai codé ça sans filet (je n'ai pas de serveur sous la main... et l'éditeur de CCM n'est pas franchement adapté pour coder en live...). Dis-moi s'il y a un soucis que tu n'arrives pas à résoudre avec ce code.

    Xavier
    0
  7. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    'aimerais que ça affiche 0 quand il n'y a de nouveau membre inscrit pendant le mois..

    Facile...via une requête ...
    SELECT M.mois
         , coalesce(D.nombre,0) as NB
         ,D.annee
    FROM
    (SELECT 1 as mois
    UNION SELECT 2 as mois
    UNION SELECT 3 as mois
    UNION SELECT 4 as mois
    UNION SELECT 5 as mois
    UNION SELECT 6 as mois
    UNION SELECT 7 as mois
    UNION SELECT 8 as mois
    UNION SELECT 9 as mois
    UNION SELECT 10 as mois
    UNION SELECT 11 as mois
    UNION SELECT 12 as mois
    ) M
    LEFT JOIN (
      SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
          FROM membres
          GROUP BY YEAR(date_inscription), MONTH(date_inscription)
          ORDER BY YEAR(date_inscription), MONTH(date_inscription)
       )D ON D.mois = M.mois
    
    
              
    
    0
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Il me semble que ça ne marchera pas, car la jointure sera satisfaite s'il y a des inscrits sur le même mois d'une autre année.
      Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.
      0
    2. Utilisateur anonyme
       
      Super merci jordane45, c'est exactement ce que je voulais :)
      0
      1. Utilisateur anonyme > Utilisateur anonyme
         
        il va juste faloir que je cherche a quoi sert les unions select des les left join
        0
    3. Utilisateur anonyme
       
      pourquoi les mois ne sont pas dans l'ordre, j'ai essayé de modifier le ORDER BY mais ça ne change rien...
      Je sais je suis chiant ...
      0
    4. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Tu as repris quel code ?
      0
  8. Utilisateur anonyme
     
    ce code là :

    $sql = "SELECT M.ANNEE
                  ,M.MOIS
                 , coalesce(D.nombre,0) as NB
            FROM
            (SELECT YEAR(selected_date) as ANNEE
                 , MONTH(selected_date) as MOIS 
            FROM 
            (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
             (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
             (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
             (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
             (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
             (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
            WHERE selected_date between :dateDeb and :datefin
            GROUP BY ANNEE,MOIS
            ) M
            LEFT JOIN (
                SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
                  FROM membres
                  GROUP BY YEAR(date_inscription), MONTH(date_inscription)
                  ORDER BY YEAR(date_inscription), MONTH(date_inscription)
               )D ON D.mois = M.MOIS AND D.annee = M.ANNEE";
               
    
    // Période de date pour l'affichage :           
    $adatas = array(':dateDeb'=>'2010-01-01',':datefin'=>'2020-01-01');
    
    try{
      $req = $bdd->prepare($sql);
      $req->execute($adatas);
      //on stocke le resultat dans un array...
      $resultat = $req->fetchAll(); 
    }catch(Exception $e){
      //En cas de souci dans la requete.
      echo "Erreur ! " .$e->getMessage();
    }
    
    
    
    //on retravaille l'array pour avoir quelquechose de plus exploitable :
    //on boucle sur le resultat de la requete :
    $arrfinal = array();
    foreach($resultat as $R){
       $A = $R['ANNEE'];
       $M = $R['MOIS'];
       $NB = $R['NB'];  
       $arrfinal[$A][$M]=$NB; 
    }
    
    $a_mois = array('janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
    ?>
    
    
    <html>
      <head>
        <title> TEST </title>
        <meta charset="utf8">
      </head>
      <body>
        <?php
        //on boucle sur l'array retravaillé pour faire l'affichage ...
        
        foreach($arrfinal as $ANNEES=>$MOIS){
          echo "<br><b>Année :$ANNEES</b>";  
          foreach($MOIS as $mois=>$p){
            echo "<br>Le mois de ".$a_mois[$mois-1] ." : $p nouveau". ($p>1 ? "x" : "") . " membre". ($p>1 ? "s" : "");
          }  
        }
        ?>
      </body>
    </html>
    
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Et si tu fais :

      SELECT M.ANNEE
                    ,M.MOIS
                   , coalesce(D.nombre,0) as NB
              FROM
              (SELECT YEAR(selected_date) as ANNEE
                   , MONTH(selected_date) as MOIS 
              FROM 
              (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
               (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
               (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
               (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
               (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
               (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
              WHERE selected_date between :dateDeb and :datefin
              GROUP BY ANNEE,MOIS
              ) M
              LEFT JOIN (
                  SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre
                    FROM membres
                    GROUP BY YEAR(date_inscription), MONTH(date_inscription)
                    ORDER BY YEAR(date_inscription), MONTH(date_inscription)
                 )D ON D.mois = M.MOIS AND D.annee = M.ANNEE
      ORDER BY M.ANNEE,M.MOIS ASC
      
      0
    2. Utilisateur anonyme
       
      Super merci beaucoup, c'est juste parfais :) ;)
      0