Nombre de nouveaux membres inscrit par mois
Résolu
Utilisateur anonyme
-
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 :
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
<?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:
- Nouveau membre inscrit sur jecontacte
- Comment créer un nouveau groupe sur whatsapp - Guide
- Nouveau site coco chat - Accueil - Réseaux sociaux
- Membre indisponible vinted - Guide
- Jecontacte connexion - Forum Réseaux sociaux
- Créer un nouveau compte gmail - Guide
8 réponses
@Reivax :
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... :-) )
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
Salut Nils0,
Utilises les fonctions SQL "COUNT()", "MONTH()" et "YEAR()", et en faisant une requête comme cela :
Tu aurais directement le résultat fournit par ton SGBD du nombre de personnes inscrites en Janvier 2017.
(sauf erreur, car non testé)
Dal
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
J'ai modifié le code (ça s'améliore mais c'est toujours pas ça...), voici le code:
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 ?
<?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 ?
Bonjour,
Comme [Dal], mais avec un GROUP BY tu peux obtenir directement tout ce que tu veux :
Xavier
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
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 />"; } ?>
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
exemple :
Le mois de mars: 0 nouveau membre
Merci d'avance
Nils0
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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
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
Bonjour,
Facile...via une requête ...
'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
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>
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
set @dateDeb = '2015-01-01';
set @datefin = '2020-01-01';
c'est a mettre aussi dans la requete sql ?
Ou sinon tu remplaces directement les cariables dans la requete...(C'est plus simple )
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