IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Code plus léger ? - Statistiques mensuelles sur BDD


Sujet :

PHP & Base de données

  1. #1
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut Code plus léger ? - Statistiques mensuelles sur BDD
    Salutations,

    Pour une asso. bénévole que je gère depuis 30 ans, je mets en place régulièrement de nouvelles options dans le Back-Office, dédiées aux bénévoles.

    Des "clients" proposent à notre asso. de récupérer gratuitement leur matériel info. pour leur redonner une seconde vie.
    Les demandes d'enlèvements sont enregistrées dans une BDD MySQLi.

    Pour avoir une vision sur l'avancement des demandes, je développe des petits "plugins", dont, dans le cas présent, un tableau de stats mensuelles.

    Actuellement, le code est TREEEES fastidieux et redondant, et certainement pas optimisé.
    De plus, je suis obligé de mettre à jour le moteur chaque année.
    Mais cela fonctionne.

    Voila des bouts de ce code horrible :

    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
    (...)
    	// Requetes SQL
    	// ---------- Mensuels
    	// -------------------- 2015
    	$quinze = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-%'");
    	$quinze01 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-01%'");
    	$quinze02 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-02%'");
    	$quinze03 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-03%'");
    	$quinze04 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-04%'");
    	$quinze05 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-05%'");
    	$quinze06 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-06%'");
    	$quinze07 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-07%'");
    	$quinze08 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-08%'");
    	$quinze09 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-09%'");
    	$quinze10 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-10%'");
    	$quinze11 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-11%'");
    	$quinze12 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2015-12%'");
    	// -------------------- 2016
    	$seize = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2016-%'");
    	$seize01 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2016-01%'");
    	$seize02 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2016-02%'");
    	$seize03 = $connexion->query ("SELECT * FROM $table WHERE `Date` LIKE '2016-03%'");
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (...)
    	// Compter les lignes
    	// -------------------- 2015
    	$deuxmillequinze = $quinze->num_rows;
    	$deuxmillequinze01 = $quinze01->num_rows;
    	$deuxmillequinze02 = $quinze02->num_rows;
    	$deuxmillequinze03 = $quinze03->num_rows;
    	$deuxmillequinze04 = $quinze04->num_rows;
    	$deuxmillequinze05 = $quinze05->num_rows;
    (...)
    (...)
    // -------------------- Totaux mensuels
    $tt01 = $deuxmillequinze01 + $deuxmilleseize01 + $deuxmilledixsept01 + $deuxmilledixhuit01 + $deuxmilledixneuf01 + $deuxmillevingt01;
    $tt02 = $deuxmillequinze02 + $deuxmilleseize02 + $deuxmilledixsept02 + $deuxmilledixhuit02 + $deuxmilledixneuf02 + $deuxmillevingt02;
    $tt03 = $deuxmillequinze03 + $deuxmilleseize03 + $deuxmilledixsept03 + $deuxmilledixhuit03 + $deuxmilledixneuf03 + $deuxmillevingt03;
    $tt04 = $deuxmillequinze04 + $deuxmilleseize04 + $deuxmilledixsept04 + $deuxmilledixhuit04 + $deuxmilledixneuf04 + $deuxmillevingt04;
    (...)
    (...)
    <tr> <!-- 2019 !-->
    <td align="right" bgcolor="#EAEAEA"><strong>2019</strong></td>
    <td align="center"><? echo $deuxmilledixneuf01; ?></td>
    <td align="center"><? echo $deuxmilledixneuf02; ?></td>
    <td align="center"><? echo $deuxmilledixneuf03; ?></td>
    <td align="center"><? echo $deuxmilledixneuf04; ?></td>
    <td align="center"><strong><? echo $deuxmilledixneuf05; ?></strong></td>
    <td align="center"><? echo $deuxmilledixneuf06; ?></td>
    <td align="center"><? echo $deuxmilledixneuf07; ?></td>
    <td align="center"><? echo $deuxmilledixneuf08; ?></td>
    <td align="center"><strong><? echo $deuxmilledixneuf09; ?></strong></td>
    <td align="center"><? echo $deuxmilledixneuf10; ?></td>
    <td align="center"><? echo $deuxmilledixneuf11; ?></td>
    <td align="center"><? echo $deuxmilledixneuf12; ?></td>
    <td align="center"><font color="#FF0000"><? echo $deuxmilledixneuf; ?></font></td>
    </tr>
    (...)
    Comment puis-je optimiser cela ? Je suis sur qu'il existe un moyen magique de concatener ces requêtes en d'autres plus globales.

    Merci de m'avoir lu, et de votre aide ...
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 213
    Points : 15 499
    Points
    15 499
    Par défaut
    Citation Envoyé par Casio Voir le message
    redondant ... moyen magique
    voilà avec ces quelques mots, vous avez tout dit. à partir du moment où vous avez 2 fois (ou parfois 3 fois) ou plus le même code, c'est plus efficace d'utiliser des boucles.

    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
    $resultats = [];
     
     
    foreach ([2015, 2016, 2017, 2018] as $annee) {
     
    	// préparation de la 2e dimension du tableau qui va stocker les résultats
    	$resultats[$annee] = [];
     
     
    	foreach (["01", "02", "03", "04", "05"] as $mois) {
     
    		$resultats[$annee][] = $connexion->query("SELECT * FROM $table WHERE `Date` LIKE '$annee-$mois-%'");
     
    	}
     
    }
    dans cet exemple, j'ai listé les mois et les années mais là aussi il est possible d'utiliser des boucles pour construire ces tableaux.

    et une fois que vous avez les résultats dans le tableau $resultats il existe plusieurs fonctions qui permettent de lire ces résultats en fonction de vos besoins. regardez là dans la documentation officielle :
    https://www.php.net/manual/fr/language.types.array.php
    https://www.php.net/manual/fr/ref.array.php

  3. #3
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Merci de ce retour,

    je ne vois pas comment implanter ce code ?
    Dois-je définir autre chose auparavant ?
    Je vois que la requête n'arrive qu'a la fin, est-ce normal ?
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 213
    Points : 15 499
    Points
    15 499
    Par défaut
    ce n'est pas vous qui avez fait le code que vous présentez dans le 1er message ?

  5. #5
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Si, mais comme d'habitude, n'étant pas codeur, je fais des suite de raisonnements logiques, en faisant des copiés/collés.
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  6. #6
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    J'en suis plus ou moins la, mais je n'arrive pas à trouver les bonnes variables :

    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
    <table align="center" style="border:1px dotted black;" bordercolor="#000000" class="legendes">
    	<tr align="left">
    		<td colspan="14" align="center" bgcolor=#CACACA><font size="+1"><strong>- Statistiques mensuelles -</strong></font></td>
    	</tr>
    	<?php
    	$resultats = [];
     
    	foreach ([2015, 2016, 2017, 2018, 2019, 2020, 2021] as $annee) {
     
    		// préparation de la 2e dimension du tableau qui va stocker les résultats
    		$resultats[$annee] = [];
    		echo "<tr>";
     
    		foreach (["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] as $mois) {
     
    			$resultats[$annee][] = $connexion->query("SELECT * FROM $table WHERE `Date` LIKE '$annee-$mois-%'");
    	 		echo "<td align=\"center\">" . $mois . "</td>";
    		}
     
    		echo "</tr>";
    	}
     
    	?>
    </table>
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Plutôt que de bombarder la table de requêtes , il serait plus judicieux de lui demander 1x l'ensemble des données nécessaires avec une requête comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $res = $connexion->query ("SELECT YEAR(Date) AS annee ,MONTH(Date) as mois, COUNT(*) as total FROM $table  GROUP BY YEAR(Date),MONTH(Date)"))
    Ca à l'avantage de ne jamais avoir besoin d'être mis à jour.

    Tu recois ainsi en résultat des données comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    annee | mois | total
    2019   | 12 | 6
    2020   | 1 | 5
    2020   | 8 | 3
    Qu'il n'ya plus qu'à afficher.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Merci de cette aide supplementaire.

    Comment puis-je maintenant intégrer cela à une routine PHP ?
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  9. #9
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    J'au juste réussi à pondre cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    $res = $connexion->query ("SELECT YEAR(Date) AS annee, MONTH(Date) as mois, COUNT(*) as total FROM $table GROUP BY YEAR(Date),MONTH(Date)");
     
    while ($data = $res->fetch_assoc())
    	{ echo $data['annee']; echo $data['mois']; }
    ?>
    Mais les années sont répétées et donc inexploitables dans un tableau.
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  10. #10
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Voici une proposition, je me suis basé sur les morceaux de codes postés précédemment... donc je suppose que c'est ce qui est attendu, je n'ai pas testé par contre.

    Je vous laisse affiner si nécessaire.

    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
     
    <?php
     
    $res = $connexion->query ("SELECT YEAR(Date) AS annee, MONTH(Date) as mois, COUNT(*) as total FROM $table GROUP BY YEAR(Date),MONTH(Date)");
    $data = $res->fetch_assoc();
    ?>
    <table align="center" style="border:1px dotted black;" bordercolor="#000000" class="legendes">
    	<tr align="left">
    		<td colspan="14" align="center" bgcolor=#CACACA><font size="+1"><strong>- Statistiques mensuelles -</strong></font></td>
    	</tr>
        <?php foreach ([2015, 2016, 2017, 2018, 2019, 2020, 2021] as $annee) : ?>
        <tr>
            <?php foreach($data as $row) : ?>
                <?php if((int) $row['annee'] === $annee) : ?>
    	 		<td align="center"><?php echo $row['annee'].'/'.$row['mois'].' '.$row['total']; ?></td>
                 <?php endif; ?>
            <?php endforeach; ?>
        </tr>
    	<?php endforeach; ?>
    </table>
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  11. #11
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Huummm, ce ne me donne aucun résultat. Le tableau reste vide.

    La page charge en boucle, je pense qu'une boucle est en vrille.
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  12. #12
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Mwouaii c'est bizarre...

    J'ai un peu du mal à comprendre... le chargement de la page n’aboutis pas mais le tableau de base est quand même affiché (même si il est vide) ?
    C'est un peu contradictoire...

    Juste pour savoir...
    combien y a t'il de lignes à traiter potentiellement ?
    qu'elle est la version de PHP ?
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  13. #13
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    PHP Version 7.4.13

    Voici une capture d'écran de l'actuel rendu :

    Nom : Capture d’écran 2021-01-10 à 20.38.26.png
Affichages : 99
Taille : 31,4 Ko
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et c'est ce que tu voulais ? J'espère que tu n'as pas utilisé le foreach avec les années listées en dur car ce n'est pas générique. Sur le principe le résultat d'une requête n'est pas toujours directement exploitable, et souvent on crée un tableau sur mesure qui lui sera exploitable pour l'affichage. Donc dans un premier temps il faut trouver la structure du tableau adaptée pour l'affichage et ensuite tu te débrouilles pour créer ce tableau en exploitant ta requête. Au final tu listeras ton tableau pour afficher les résultats.

    Par exemple :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $result = [];
    while ($data = $res->fetch_assoc())
    	{ $result[$data['annee']][$data['mois']] = $data['total']; }

    C'est pour le principe car je n'ai pas la vision de la ressource sql en tête. Pour la visualiser tu peux faire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ($data = $res->fetch_assoc())
    	{ var_dump($data); }

  15. #15
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Non, mais ATTENTION, ce rendu, c'est mon code INITIAL.

    Vous m'avez demandé le nombre de données, j'ai fait une capture d'écran du rendu avec mon code dégeu.

    Le code automatique ne fonctionne toujours pas.
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  16. #16
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Que donne le code
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ($data = $res->fetch_assoc())
    	{ var_dump($data); }
    ?

  17. #17
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 922
    Points
    922
    Par défaut
    Citation Envoyé par Casio Voir le message
    Mais les années sont répétées et donc inexploitables dans un tableau.
    Ah, mais tu peux les empêcher de se répéter ; en fait on veut afficher l'année sur une nouvelle ligne d'affichage lorsque l'on en change. Pour cela il faut se "rappeler" de l'année lue précédemment.
    Donc, avant la boucle, on fait par exemple un $anneeprec='2000'; (ou n'importe quelle année dont on est sûr qu'elle n'existe pas pour le tableau).
    Ensuite, il faut vérifier à chaque lecture si on est sur un changement, donc on compare $anneeprec et $data['annee']. Si c'est la même, on affiche seulement la valeur pour le mois.
    Si c'est une autre:
    • on saute une ligne,
    • on affiche l'année,
    • on remplace l'ancienne valeur de $anneeprec par celle que l'on vient de lire, qui sera la nouvelle année "à tester"


    Sur le même principe on vérifie les "trous" dans les mois. Si le mois précédent vaut "02", mais que celui qu'on vient de lire est "05", il faut afficher le total 0 au titre des mois "03" et "04".
    Lorsque l'on change d'année il faut aussi penser à faire le total de l'année précédente avant de sauter une ligne.
    Et pour chaque mois on prépare aussi le cumul des mois toutes années confondues (tableau).

    Il y a différentes manières de faire. On pourrait aussi préparer un tableau de tableaux (un tableau de 13 valeurs par année, une valeur par mois plus le total) en créant une nouvelle "rangée" pour chaque nouvelle année, et en remplissant les cases à chaque lecture, sans compter un tableau supplémentaire pour les cumuls par mois toutes années confondues.
    Quand tout est bien rangé, on parcourt le tout pour l'afficher.

    Troisième approche, semblable à la logique actuelle mais avec moins de code et sans avoir besoin d'ajouter chaque année nouvelle : on fait une première boucle pour lire les années en base et constituer un tableau (on fait de façon dynamique le tableau qui était fait à la main avec [2015, 2016...]). Pour chaque année du tableau et chaque mois civil (c'est "en dur"), on déclenche une requête paramétrée qui donne le total mensuel pour l'année, pouvant valoir 0 (on réutilise le même SQL à chaque lecture, c'est moins verbeux), que l'on l'affiche dans la foulée (sauf si on préfère gérer des tableaux associatifs - tout sauf une palanquée de variables dans le dur ). A la fin du traitement de l'année, soit on a cumulé au fur et à mesure pour afficher le total annuel, soit on réinterroge la base. Ce n'est pas l'approche la plus conseillée car plus coûteuse que les précédentes, on sollicite davantage les ressources. Mais ce serait déjà bien mieux à maintenir...

    Dans quelle approche te sentirais-tu plus à l'aise?
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  18. #18
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Alors, la, je suis totalement perdu.
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

  19. #19
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 922
    Points
    922
    Par défaut
    Le code posté par ARCIWEB :

    Citation Envoyé par ABCIWEB Voir le message
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $result = [];
    while ($data = $res->fetch_assoc())
    	{ $result[$data['annee']][$data['mois']] = $data['total']; }
    fabrique un tableau avec le nombre de demandes par année et par mois.

    Il est presque prêt à l'emploi. Il faut le parcourir et vérifier les mois "vides" où la requête ne renvoie rien :
    Code PHP : 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
     $mois=['1','2','3','4','5','6','7','8','9','10','11','12'];
                foreach ($result as $annee => $resultannee){
                    $totalannuel=0;
                    echo  ' '.$annee.' ';
                    foreach($mois as $i => $lemois){
                        if (isset($resultannee[$lemois]){
                            $demandesmois = $resultannee[$lemois];
                            echo ' '.$demandesmois.' ' ;
                            $totalannuel += $demandesmois ;
                        }else{
                            echo " 0 ";
                        }
                    }
                    echo  ' '.$totalannuel ;
                    echo '<br>';
                }

    Je n'ai pas le temps de tester avant ce soir, mais ce serait l'idée (en ajoutant la mise en forme du tableau html parce que là c'est juste hideux).
    Edit : j'ai corrigé le tableau des mois car j'avais laissé un "0" devant les 9 premiers ; ce qui ne pouvait guère fonctionner
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  20. #20
    Membre du Club Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 59
    Points
    59
    Par défaut
    Bon,

    je viens de remettre tout à la suite pour tester :

    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
    $res = $connexion->query ("SELECT YEAR(Date) AS annee, MONTH(Date) as mois, COUNT(*) as total FROM $table GROUP BY YEAR(Date),MONTH(Date)");
     
    $result = [];
    while ($data = $res->fetch_assoc())
    	{ $result[$data['annee']][$data['mois']] = $data['total']; }
     
    $mois=['01','02','03','04','05','06','07','08','09','10','11','12'];
                foreach ($result as $annee => $resultannee) {
                    $totalannuel=0;
                    echo  ' '.$annee.' ';
                    foreach($mois as $i => $lemois){
                        if (isset($resultannee[$lemois])){
                            $demandesmois = $resultannee[$lemois];
                            echo ' '.$demandesmois.' ' ;
                            $totalannuel += $demandesmois ;
                        }else{
                            echo " 0 ";
                        }
                    }
                    echo  ' '.$totalannuel ;
                    echo '<br>';
                }
    Donne le tableau du haut de cette image :

    Nom : Capture d’écran 2021-02-08 à 18.46.47.png
Affichages : 63
Taille : 49,2 Ko

    La partie basse du tableau est mon ancienne façon.

    Les chiffres diffèrent d'ailleurs ...

    Edit : Les mois doivent être sans le 0.
    Cela donne ceci en corrigeant :

    Nom : Capture d’écran 2021-02-08 à 18.59.05.png
Affichages : 63
Taille : 55,8 Ko
    Digital self-made Man - OnLine since 1993.
    https://wda-fr.org - https://mathieu.charreyre.net

Discussions similaires

  1. Réponses: 22
    Dernier message: 07/05/2018, 17h48
  2. Problème de sécurité sur BDD MSSQL - Ajout de code html dans mes tables
    Par midnighteleven dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/04/2015, 10h38
  3. Export Acces->Excel Requette sur bdd oracle
    Par cedrickb dans le forum Access
    Réponses: 2
    Dernier message: 31/12/2004, 15h27
  4. [Débutant] Tester une connection sur bdd
    Par lando dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 03/09/2003, 15h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo