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
A voir également:

8 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
@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
Utilisateur anonyme
 
Merci beaucoup,
set @dateDeb = '2015-01-01';
set @datefin = '2020-01-01';
c'est a mettre aussi dans la requete sql ?
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > Utilisateur anonyme
 
Oui.
Ou sinon tu remplaces directement les cariables dans la requete...(C'est plus simple )
0
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > 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
Utilisateur anonyme
 
super merci beaucoup, je ne sais pas comment te remercier vu le nombre de fois que tu m'as aidé ... :)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
Utilisateur anonyme
 
super merci beacoup a vous deux pour votre réponse rapide
je vais voir ce que je peux faire ...
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
Utilisateur anonyme
 
super merci beacoup ça marche comme je veux...
en réalité c'est tous simple :/
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
Utilisateur anonyme
 
Super merci jordane45, c'est exactement ce que je voulais :)
0
Utilisateur anonyme > Utilisateur anonyme
 
il va juste faloir que je cherche a quoi sert les unions select des les left join
0
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Tu as repris quel code ?
0
Utilisateur anonyme
 
ok merci je regarde
0
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
Utilisateur anonyme
 
Super merci beaucoup, c'est juste parfais :) ;)
0