Comment remplir un array quand les données n'existent pas ?

Résolu
emrh Messages postés 439 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

J'ai eu de l'aide sur ce forum pour l'écriture d'une requête qui fonctionne maintenant parfaitement et dont le travail est de récupérer dans une table les prestations "hébergement" et "restauration" sous forme d'un total cumulé par année, par prestation.
cf discussion : https://forums.commentcamarche.net/forum/affich-37629913-requete-qui-totalise-selon-des-criteres#p37630598

Les totaux obtenus sont stockées dans deux array distincts qui sont ensuite récupérés en Javascript pour être affichés sous forme d'un graphique (https://canvasjs.com/php-charts/dynamic-live-column-chart/.

Tout fonctionne nickel... sauf... si une année ne contient pas de prestation restauration par exemple. L'enregistrement qui n'existe pas n'est donc pas créé dans l'array, on se retrouve donc avec un décalage dans le traitement Javascript, et le graphique est faux !
Si je force manuellement l'année qui n'a pas de restauration avec :
$restauration[] = array("label"=> "2018", "y"=> 0);
alors on retrouve une "symétrie" entre les données hébergement et restauration et le graphique en colonne redevient juste

Voici le code php :
while ($data = $requete1->fetch()) {
        // Hébergement : 
        if($data['P_TYPE']=="HEBERGEMENT"){    
            $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
        }

        // Restauration : 
        if($data['P_TYPE']=="RESTAURATION"){    
            $restauration[] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
        }
    }


En résumé, comment faire pour qu'une année qui ne contient pas telle ou telle prestation puisse avoir un complément dont la valeur serait 0 ?

Array avec une valeur bidon de 100€ en restauration pour 2023 :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)

[1] => Array
(
[label] => 2022
[y] => 64913.0100
)

)
Array
(
[0] => Array
(
[label] => 2023
[y] => 100.0000
)

[1] => Array
(
[label] => 2022
[y] => 12944.5000
)

)



Array sans les 100 € bidon :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)

[1] => Array
(
[label] => 2022
[y] => 64913.0100
)

)
Array
(
[0] => Array
(
[label] => 2022
[y] => 12944.5000
)

)



Merci d'avance pour votre aide !

Configuration: Configuration: Configuration: Linux / Chrome 103.0.0.0

12 réponses

Résumé de la discussion

Le problème central est que les totaux par année et par prestation (« hébergement » et « restauration ») affichés dans le graphique se décalent lorsque une année ne contient pas une prestation donnée. Des solutions consistent à compléter les tableaux avec des entrées à zéro pour les années manquantes et à s’assurer que chaque année existe dans les deux catégories avant l’affichage. D’autres proposent d’utiliser l’année comme clé dans les tableaux, afin de pouvoir insérer directement une entrée bidon lorsque l’autre prestation est absente. En cas de données dynamiques, il peut être utile d’établir la plage d’années à partir des enregistrements et de générer les valeurs initiales pour éviter tout décalage ultérieur.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. emrh Messages postés 439 Statut Membre 20
     
    ÇA FONCTIONNE ! ! ! ! !
    // Remplissage des Array : 
        while ($data = $requete3->fetch()) {
            // Hébergement :
            if ($data['P_TYPE']=="HEBERGEMENT"){
                if(isset($anneehebergement) AND $anneehebergement<>''){
                    $restauration[] =  array("label"=> $anneehebergement, "y"=> 0);
                    $anneehebergement='';
                    $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                }
                else {
                    $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                    $anneehebergement=$data['ANNEE'];
                }            
            }
            // Restauration :
            if ($data['P_TYPE']=="RESTAURATION"){
                if(isset($anneerestauration) AND $anneerestauration<>''){
                    $hebergement[] =  array("label"=> $anneerestauration, "y"=> 0);
                    $anneerestauration='';
                    $restauration[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                }
                else {
                    $restauration[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                    $anneerestauration=$data['ANNEE'];
                }            
            }
        }
    


    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 2200.0000
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 64913.0100
    )

    )
    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 0
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 12944.5000
    )

    )



    EDIT : MILLE MERCIS À JORDAN45 & YG_BE POUR VOS PRÉCIEUX CONSEILS ET SURTOUT POUR VOTRE PATIENCE !!!
    1
  2. emrh Messages postés 439 Statut Membre 20
     
    Je me demande si la solution ne serait pas un traitement dans la boucle WHILE qui vérifie si au moins un enregistrement de chaque prestation a bien été enregistré dans l'année qui vient d'être traitée, si c'est le cas on continue la boucle, sinon on crée un enregistrement à 0 pour la prestation qui n'a pas eu de mouvement dans l'année ?
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
       
      En fait, il faudrait réaliser une boucle sur chaque année souhaitée, à l'intérieur de cette boucle vérifier si une valeur existe ... Et si elle n'existe pas, ajouter une entrée au tableau avec la valeur 0
      ..
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      bonjour,
      Moi j'adapterais la requête, afin que, dans la réponse, chaque année soit présente pour chaque prestation.
      0
    3. emrh Messages postés 439 Statut Membre 20 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour yg_be,
      Le problème c'est que l'on ne connait pas les années par avance (le graphique doit être dynamique pour afficher 2025 quand elle existera) et certaines années passées n'avaient pas de prestations RESTAURATION. C'est ces années qui génèrent des trous dans l'array qui ensuite déreglent le graphique
      0
    4. emrh Messages postés 439 Statut Membre 20 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       
      C'est intéressant parce-que c'est exactement ce qui m'est venu à l'esprit en #1, mais je croyais que c'était mal une boucle dans une boucle ?
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > emrh Messages postés 439 Statut Membre
       
      Il est tout à fait possible d'écrire une requête qui fait cela.
      0
  3. emrh Messages postés 439 Statut Membre 20
     
    Est-ce qu'un truc comme ça, ce serait une bonne idée ?
    $i=0;
        while ($data = $requete1->fetch()) {
            if(isset($nmoins1)&&($nmoins1-$data['ANNEE'])>=1){
                if(!isset($hebergement[$i]['y'])) {
                    // Traitement ajout Array
                }
               
            }
            // Hébergement : 
            if($data['P_TYPE']=="HEBERGEMENT"){    
                $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                $nmoins1 = $data['ANNEE'];
            }
    
            // Restauration : 
            if($data['P_TYPE']=="RESTAURATION"){    
                $restauration[] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                $nmoins1 = $data['ANNEE'];
            }
            $i++;
        }
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Je pense qu'il serait beaucoup plus simple d'utiliser l'année comme clé, ainsi:
      $hebergement[$data['ANNEE']] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);

      De cette façon, tu peux, quand tu traites un hébergement, vérifier si il y a une entrée pour l'année dans la table restauration, et, sinon, y ajouter une entrée "bidon".
      0
      1. emrh Messages postés 439 Statut Membre 20 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Le problème c'est que canvasjs.com a besoin en sortie d'un format de ce type :
        $dataPoints = array(
        array("label"=> "Core 1", "y"=> 20),
        array("label"=> "Core 2", "y"=> 65),
        array("label"=> "Core 3", "y"=> 11)
        );
        (cf => https://canvasjs.com/php-charts/dynamic-live-column-chart/)

        Que j'ai adapté à mon cas pour de 2 types de données :
        // Hébergement :
        $hebergement = array(
        array("label"=> "2023", "y"=> 0),
        array("label"=> "2022", "y"=> 123456),
        array("label"=> "2021", "y"=> 68279)
        );

        // Restauration :
        $restauration = array(
        array("label"=> "2023", "y"=> 0),
        array("label"=> "2022", "y"=> 78910),
        array("label"=> "2021", "y"=> 12117)
        );

        Et c'est justement ce double array qui semble poser un problème, non pas en données statiques
        mais en données dynamiques issues de la bdd

        Ta proposition donne ça :
        Array
        (
        [2023] => Array
        (
        [label] => 2023
        [y] => 2200.0000
        )

        [2022] => Array //<=============== Erreur, ici c'est 2023 normalement
        (
        [label] => 2022
        [y] => 64913.0100
        )

        )
        Array
        (
        [2022] => Array
        (
        [label] => 2022
        [y] => 12944.5000
        )

        )

        Et le graphique reste vide...
        0
  4. emrh Messages postés 439 Statut Membre 20
     
    Sur stackoverflow, on me propose ça :

    $min = 9999; 
    $max = date("Y"); //edited
    while ($data = $requete1->fetch()) {
            // Hébergement : 
            if($data['P_TYPE']=="HEBERGEMENT"){    
                    $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
            }
    
            // Restauration : 
            if($data['P_TYPE']=="RESTAURATION"){    
                    $restauration[] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
            }
    
            /// Find the min year in datas
            if ($data['ANNEE'] < $min) $min = $data['ANNEE'];
    }
    
    /// Cycle between min and max, and add zero padding value when data is missing
    for ($i=$min; $i<=$max; $i++) {
            // Those are to search in a multidimensional associative array by key/value. If a value is missing, it adds it.
            if (!array_search($i, array_column($restauration, 'label'))) $restauration[] =   array("label"=> $i, "y"=> 0);
            if (!array_search($i, array_column($hebergement, 'label'))) $hebergement[] =   array("label"=> $i, "y"=> 0); 
    }
    


    Mais ça ne fonctionne pas...
    J'ai pourtant adapté :
    $min = 2015; // Date de début de mon graphique
    $max = 2023; // J'ai déjà des réservations en 2023
    for ($i=$max; $i>=$min; $i--) { // Parce que ma requête est classée en DESC et que je souhaite l'année la plus récente en premier à gauche

    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 2200.0000
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 64913.0100
    )

    [2] => Array
    (
    [label] => 2023
    [y] => 0
    )

    )
    Array
    (
    [0] => Array
    (
    [label] => 2022
    [y] => 12944.5000
    )

    [1] => Array
    (
    [label] => 2023
    [y] => 0
    )

    )
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. emrh Messages postés 439 Statut Membre 20
     
    Serait-il judicieux de s'inspirer de cette idée en créant tout d'abord 2 array (Hébergement + Restauration) de la première année trouvée dans la bdd à la dernière... Remplir ce tableau de 0 et le mettre à jour avec les valeur trouvées dans la bdd à l'aide de la boucle WHILE ?

    Un peu comme ça, mais pour le remplissage avec les bonnes valeurs, cela semble peu fiable !

    // Recherche de la date la plus récente : 
        $requete1 = $bdd->query('SELECT MAX(YEAR(contrats.date_debut)) as MAX FROM contrats');
        $max = $requete1->fetch();
    
        // Recherche de la date la plus ancienne : 
        $requete2 = $bdd->query('SELECT MIN(YEAR(contrats.date_debut)) as MIN FROM contrats');
        $min = $requete2->fetch();
    
        // Cumule des prestations par année et par type Restauration ou non : 
        $requete3 = $bdd->query('
            SELECT  ANNEE, T.P_TYPE, SUM(T.total) AS ca_total
            FROM (
                SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
                FROM compositions C
                INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
                INNER JOIN prestations P  ON P.id_prestation = C.id_prestation) AS T
            WHERE T.etat=3
            GROUP BY  T.ANNEE, T.P_TYPE
            ORDER BY T.ANNEE DESC
        ');
    
        // Création des l'Array Hébergement & restauration vides : 
        for ($i=$min['MIN']; $i <= $max['MAX'] ; $i++) { 
            $hebergement[] =  array("label"=> $i, "y"=> 0);
            $restauration[] =   array("label"=> $i, "y"=> 0);
        }
    
        // Remplissage des Array avec les bonnes valeurs :     
        $i=0;
        while ($data = $requete3->fetch()) {
            // Hébergement : 
            if($data['P_TYPE']=="HEBERGEMENT"){            
                $hebergement[$i] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);            
            }
    
            // Restauration : 
            if($data['P_TYPE']=="RESTAURATION"){    
                $restauration[$i] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);            
            }
            $i++;
        }
    


    ou ça :
    // Remplissage des Array avec les bonnes valeurs : 
        while ($data = $requete3->fetch()) {
            // Hébergement : 
            if($data['P_TYPE']=="HEBERGEMENT"){            
                $key = array_search($data['ANNEE'], $hebergement);
                $hebergement[$key] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);            
            }
            
    
            // Restauration : 
            if($data['P_TYPE']=="RESTAURATION"){
                $key = array_search($data['ANNEE'], $restauration);                          
                $restauration[$key] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);            
            }
        }
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      moi je ferais:
      if($data['P_TYPE']=="HEBERGEMENT"){            
                  $key = $data['ANNEE'];
                  $hebergement[$key] =  array("label"=> $key, "y"=> $data['ca_total']);
                  if ( ! isset($restauration[$key]) ) {
                          $restauration[$key] =  array("label"=> $key, "y"=> 0); 
                  }
      }


      EDIT: avec ta requête initiale, celle du début de cette discussion.
      (et faire de même pour RESTAURATION)
      0
  7. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    
    
    $i=0;
    $hebergement=[];
    $restauration=[];
    // Remplissage des Array avec les bonnes valeurs : 
    while ($data = $requete3->fetch()) {
    
      $hebergement[$i] =  array("label"=> $data['ANNEE']);
      $restauration[$i] =   array("label"=> $data['ANNEE']);
      
     // Hébergement : 
      $hebergement[$i]["y"] = $data['P_TYPE']=="HEBERGEMENT" ? $data['ca_total'] : null;
    
      // Restauration : 
      $restauration[$i]["y"] = $data['P_TYPE']=="RESTAURATION" ? $data['ca_total'] : null;
     
    
      $i++;
    }
          
    

    0
  8. emrh Messages postés 439 Statut Membre 20
     


    Je suis désolé Messieurs mais aucune syntaxe ne donne d'affichage !
    Dans le cas du code de yg_be j'ai ça en sortie :
    Array
    (
    [0] => Array
    (
    [label] => 2022
    [y] => 64913.0100
    )

    [2022] => Array
    (
    [label] => 2022
    [y] => 0
    )

    )
    Array
    (
    [2023] => Array
    (
    [label] => 2023
    [y] => 0
    )

    [2022] => Array
    (
    [label] => 2022
    [y] => 12944.5000
    )

    )

    et pour le code de Jordan45 ça :
    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 2200.0000
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 64913.0100
    )

    [2] => Array
    (
    [label] => 2022
    [y] =>
    )

    )
    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] =>
    )

    [1] => Array
    (
    [label] => 2022
    [y] =>
    )

    [2] => Array
    (
    [label] => 2022
    [y] => 12944.5000
    )

    )

    Si je rempli manuellement les Array dans le format "demandé" par canvasjs
    de cette manière :
    $hebergement = array(
            array("label"=> "2023", "y"=> 2200),
            array("label"=> "2022", "y"=> 64913.01)
        );
    
    
        $restauration = array(
            array("label"=> "2023", "y"=> 0),
            array("label"=> "2022", "y"=> 12944.50)
        );
            
            echo "<pre>";
            print_r($hebergement);
            print_r($restauration);
            echo "</pre>";
    


    J'ai ça en sortie :
    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 2200
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 64913.01
    )

    )
    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 0
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 12944.5
    )

    )

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Je me demande si tu as bien adapté le code que j'ai suggéré: (et faire de même pour RESTAURATION)
      0
    2. emrh Messages postés 439 Statut Membre 20 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      J'espère que je me suis trompé, parce que là, je ne comprends plus rien !

      // Connexion à la bdd :
          require('connexion.php');
      
          
          // Cumul des prestations par année et par type Restauration ou non : 
          $requete3 = $bdd->query('
              SELECT  ANNEE, T.P_TYPE, SUM(T.total) AS ca_total
              FROM (
                  SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
                  FROM compositions C
                  INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
                  INNER JOIN prestations P  ON P.id_prestation = C.id_prestation) AS T
              WHERE T.etat=3
              GROUP BY  T.ANNEE, T.P_TYPE
              ORDER BY T.ANNEE DESC
          ');
      
      while ($data = $requete3->fetch()) {
              if($data['P_TYPE']=="HEBERGEMENT"){            
                  $key = $data['ANNEE'];
                  $hebergement[$key] =  array("label"=> $key, "y"=> $data['ca_total']);
                  if ( ! isset($restauration[$key]) ) {
                      $restauration[$key] =  array("label"=> $key, "y"=> 0); 
                  }
              }
              if($data['P_TYPE']=="RESTAURATION"){            
                  $key = $data['ANNEE'];
                  $restauration[$key] =  array("label"=> $key, "y"=> $data['ca_total']);
                  if ( ! isset($hebergement[$key]) ) {
                      $hebergement[$key] =  array("label"=> $key, "y"=> 0); 
                  }
              }
          }
      
      echo "<pre>";
      print_r($hebergement);
      print_r($restauration);
      echo "</pre>";
      
      



      Array
      (
      [2023] => Array
      (
      [label] => 2023
      [y] => 2200.0000
      )

      [2022] => Array
      (
      [label] => 2022
      [y] => 64913.0100
      )

      )
      Array
      (
      [2023] => Array
      (
      [label] => 2023
      [y] => 0
      )

      [2022] => Array
      (
      [label] => 2022
      [y] => 12944.5000
      )

      )

      Les années en gras posent problème, on n'est pas dans le format demandé par CanvasJs
      Cf :
      Array
      (
      [0] => Array
      (
      [label] => 2023
      [y] => 2200
      )

      https://canvasjs.com/php-charts/dynamic-live-column-chart/
      0
    3. emrh Messages postés 439 Statut Membre 20 > emrh Messages postés 439 Statut Membre
       
      Celui là fonctionne, mais il n'est pas dynamique évidement !
      $hebergement = array(
              array("label"=> "2023", "y"=> 2200),
              array("label"=> "2022", "y"=> 64913.01)
          );
      
      
          $restauration = array(
              array("label"=> "2023", "y"=> 0),
              array("label"=> "2022", "y"=> 12944.50)
          );
      

      Array
      (
      [0] => Array
      (
      [label] => 2023
      [y] => 2200
      )

      [1] => Array
      (
      [label] => 2022
      [y] => 64913.01
      )

      )
      Array
      (
      [0] => Array
      (
      [label] => 2023
      [y] => 0
      )

      [1] => Array
      (
      [label] => 2022
      [y] => 12944.5
      )

      )
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > emrh Messages postés 439 Statut Membre
       
      alors peut-être en ajoutant une boucle
      $h=[];
      foreach (  $hebergement as $val) {
          $h[]  = $val;
      }
      et en utilisant ensuite $h.
      0
    5. emrh Messages postés 439 Statut Membre 20 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Je vais essayer ta proposition....

      En attendant, voici ce que je suis en train d'essayer, je suis presque au but, mais il doit encore y avoir un truc
      qui cloche, il me manque toujours une année qq part !

      // Remplissage des Array : 
          while ($data = $requete3->fetch()) {
              // Hébergement :
              if($data['P_TYPE']=="HEBERGEMENT"){
                  if(isset($annee) AND ($annee-$data['ANNEE']>=1)){
                      $restauration[] =  array("label"=> $data['ANNEE'], "y"=> 0);
                      $annee=NULL;
                  }
                  else{
                      $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                      $annee=$data['ANNEE'];
                  }
              }
              // Restauration :
              if($data['P_TYPE']=="RESTAURATION"){
                  if(isset($annee) AND ($annee-$data['ANNEE']>=1)){
                      $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> 0);
                      $annee=NULL;
                  }
                  else{
                      $restauration[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
                      $annee=$data['ANNEE'];
                  }
              }      
          }
      

      Array
      (
      [0] => Array
      (
      [label] => 2023
      [y] => 2200.0000
      )

      )
      Array
      (
      [0] => Array
      (
      [label] => 2022
      [y] => 0
      )

      [1] => Array
      (
      [label] => 2022
      [y] => 12944.5000
      )

      )
      0
  9. emrh Messages postés 439 Statut Membre 20
     
    Mon code, pour ce qui est de la création des 2 Array vides de données affiche le bon format de sortie
    mais c'est après, je ne parviens pas à remplacer les 0 par les bonnes valeurs :

    Cette partie semble fonctionner :
    // Création des l'Array Hébergement & restauration vides : 
        for ($i=$max['MAX']; $i >= $min['MIN'] ; $i--) { 
            $hebergement[] =  array("label"=> $i, "y"=> 0);
            $restauration[] =   array("label"=> $i, "y"=> 0);
        }
    
    


    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 0
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 0
    )

    )
    Array
    (
    [0] => Array
    (
    [label] => 2023
    [y] => 0
    )

    [1] => Array
    (
    [label] => 2022
    [y] => 0
    )

    )

    Le graphique s'affiche vide bien évidement MAIS les années sont bien dans l'ordre décroissant, et les valeurs 0 sont bien présentes pour l'hébergement et la restauration...

    Après, je ne parviens pas à retrouver le bon enregistrement dans l'Array pour replacer les valeurs 0 par celles de la BDD
    0
  10. emrh Messages postés 439 Statut Membre 20
     
    Bon le code en #27 n'a fonctionné qu'un temps, jusqu'à ce que j'entre une nouvelle valeur en restauration pour 2023. Du coup, l'Array 2023 qui était rempli à 0 n'était pas modifié et tout était à nouveau décalé !

    Je viens de repartir sur l'idée à l'ouverture de la page de créer un Array entièrement vierge et de modifier les entrées en fonction des valeurs lues dans la bdd...

    Cette fois ci, ça semble fonctionner, même si j'ajoute, je modifie ou supprime un hébergement ou une restauration !

    Voici mon code :
    /// Connexion à la bdd :
        require('connexion.php');
    
        // Recherche de la date la plus récente : 
        $requete1 = $bdd->query('SELECT MAX(YEAR(contrats.date_debut)) as MAX FROM contrats');
        $max = $requete1->fetch();
    
        // Recherche de la date la plus ancienne : 
        $requete2 = $bdd->query('SELECT MIN(YEAR(contrats.date_debut)) as MIN FROM contrats');
        $min = $requete2->fetch();
    
        // Cumule des prestations par année et par type Restauration ou non : 
        $requete3 = $bdd->query('
            SELECT  ANNEE, T.P_TYPE, SUM(T.total) AS ca_total
            FROM (
                SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
                FROM compositions C
                INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
                INNER JOIN prestations P  ON P.id_prestation = C.id_prestation) AS T
            WHERE T.etat=3
            GROUP BY  T.ANNEE, T.P_TYPE
            ORDER BY T.ANNEE DESC
        ');
    
        // Création des l'Array Hébergement & restauration vides : 
        for ($i=$max['MAX']; $i >= $min['MIN'] ; $i--) { 
            $hebergement[] =  array("label"=> $i, "y"=> 0);
            $restauration[] =   array("label"=> $i, "y"=> 0);
        }
    
    
        // Remplissage des Array : 
        while ($data = $requete3->fetch()) {
            // Hébergement :
            if ($data['P_TYPE']=="HEBERGEMENT"){
                $id = array_search($data['ANNEE'], array_column($hebergement, 'label')); 
                $hebergement[$id]['y'] = $data['ca_total'];                       
            }
            // Restauration :
            if ($data['P_TYPE']=="RESTAURATION"){
                $id = array_search($data['ANNEE'], array_column($restauration, 'label')); 
                $restauration[$id]['y'] = $data['ca_total'];                       
            }
        }
        // Remplissage des Array avec les années antérieures à la BDD : 
        // Hébergement : 
        $hebergement[] =  array("label"=> 2021, "y"=> 68279);
        $hebergement[] =  array("label"=> 2020, "y"=> 30457);
        $hebergement[] =  array("label"=> 2019, "y"=> 63977);
        $hebergement[] =  array("label"=> 2018, "y"=> 57993);
        $hebergement[] =  array("label"=> 2017, "y"=> 49702);
        $hebergement[] =  array("label"=> 2016, "y"=> 45493);
        $hebergement[] =  array("label"=> 2015, "y"=> 38460);
    
        // Restauration : 
        $restauration[] =  array("label"=> 2021, "y"=> 12117);
        $restauration[] =  array("label"=> 2020, "y"=> 697);
        $restauration[] =  array("label"=> 2019, "y"=> 2687);
        $restauration[] =  array("label"=> 2018, "y"=> 0);
        $restauration[] =  array("label"=> 2017, "y"=> 40);
        $restauration[] =  array("label"=> 2016, "y"=> 350);
        $restauration[] =  array("label"=> 2015, "y"=> 200);
    
    0
  11. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Suggestion de requête qui ne nécessite pas de compléter les résultats:
    SELECT  AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total
    FROM
    	(SELECT DISTINCT YEAR(CA.date_debut) as ANNEE FROM compositions ) AS AN,
    	(SELECT DISTINCT IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP,
    	LEFT JOIN
    		(
    			SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
    			FROM compositions C
    			INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
    			INNER JOIN prestations P  ON P.id_prestation = C.id_prestation
    			WHERE CA.etat = 3 ) AS T
    		ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE
    	GROUP BY  AN.ANNEE, TP.P_TYPE
    	ORDER BY AN.ANNEE DESC, TP.P_TYPE
    0
    1. emrh Messages postés 439 Statut Membre 20
       
      Salut Yg_be,

      J'ai fini très tard hier sur mes Array qui fonctionnent enfin (#28) et je n'ai pas encore les yeux en face des trous....
      Quelle serait l'utilité de cette requête ? Serait-ce pour éviter le mic mac dans les Array ?
      Je l'ai collée dans PhpMyAdmin mais hélas j'ai eu des erreurs :

      1 erreurs trouvées lors de l'analyse.
      An expression was expected. (near "LEFT JOIN" at position 240)
      #1064 - Erreur de syntaxe près de 'LEFT JOIN(SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) AS ANNEE, I...' à la ligne 5
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > emrh Messages postés 439 Statut Membre
         
        En effet, le but serait d'éviter ce mic mac.
        SELECT  AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total
        FROM
        	(SELECT DISTINCT YEAR(CA.date_debut) as ANNEE FROM compositions ) AS AN,
        	(SELECT DISTINCT IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP
        	LEFT JOIN
        		(
        			SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
        			FROM compositions C
        			INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
        			INNER JOIN prestations P  ON P.id_prestation = C.id_prestation
        			WHERE CA.etat = 3 ) AS T
        		ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE
        	GROUP BY  AN.ANNEE, TP.P_TYPE
        	ORDER BY AN.ANNEE DESC, TP.P_TYPE 
        0
      2. emrh Messages postés 439 Statut Membre 20 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        #1054 - Champ 'CA.date_debut' inconnu dans field list

        J'ai essayé avec T.date_debut ou les autres alias, j'ai toujours une erreur

        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > emrh Messages postés 439 Statut Membre
         
        SELECT  AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total
        FROM
        	(SELECT DISTINCT YEAR(date_debut) as ANNEE FROM compositions ) AS AN,
        	(SELECT DISTINCT IF (type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP
        	LEFT JOIN
        		(
        			SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
        			FROM compositions C
        			INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
        			INNER JOIN prestations P  ON P.id_prestation = C.id_prestation
        			WHERE CA.etat = 3 ) AS T
        		ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE
        	GROUP BY  AN.ANNEE, TP.P_TYPE
        	ORDER BY AN.ANNEE DESC, TP.P_TYPE 
        0
  12. emrh Messages postés 439 Statut Membre 20
     
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      SELECT  AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total
      FROM
      	(SELECT DISTINCT YEAR(date_debut) as ANNEE FROM contrats ) AS AN,
      	(SELECT DISTINCT IF (type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP
      	LEFT JOIN
      		(
      			SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
      			FROM compositions C
      			INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
      			INNER JOIN prestations P  ON P.id_prestation = C.id_prestation
      			WHERE CA.etat = 3 ) AS T
      		ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE
      	GROUP BY  AN.ANNEE, TP.P_TYPE
      	ORDER BY AN.ANNEE DESC, TP.P_TYPE 
      0
      1. emrh Messages postés 439 Statut Membre 20 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Cette fois ci c'est #1054 - Champ 'AN.ANNEE' inconnu dans on clause

        Je te remercie pour tant de dévotion et de patience !

        Il y a t-il un moyen pour t'aider ?

        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > emrh Messages postés 439 Statut Membre
         

        peut-être:

        SELECT  AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total
        FROM
        	(SELECT DISTINCT YEAR(date_debut) as ANNEE FROM contrats ) AS AN
                 INNER JOIN
        	(SELECT DISTINCT IF (type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP
        	LEFT JOIN
        		(
        			SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE
        			FROM compositions C
        			INNER JOIN contrats CA  ON C.id_contrat=CA.id_contrat
        			INNER JOIN prestations P  ON P.id_prestation = C.id_prestation
        			WHERE CA.etat = 3 ) AS T
        		ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE
        	GROUP BY  AN.ANNEE, TP.P_TYPE
        	ORDER BY AN.ANNEE DESC, TP.P_TYPE 

        Pour bien faire, je devrais tester avant de t'envoyer.

        0
  13. emrh Messages postés 439 Statut Membre 20
     


    BINGO !


    0
    1. emrh Messages postés 439 Statut Membre 20
       

      Mais pour un néophyte, ta requête c'est de l'hébreux ! 

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > emrh Messages postés 439 Statut Membre
         

        Pas certain que la requête de départ soit beaucoup plus claire pour un néophyte...
        Si tu es plus à l'aise avec la requête initiale et les manipulations en PHP, c'est une façon tout-à-fait correcte d'arriver à une solution.

        1