Partage
  • Partager sur Facebook
  • Partager sur Twitter

HighCharts - SQL créer plusieurs courbes

    4 novembre 2013 à 11:00:57

    Bonjour

    J'ai une base de données SQL avec des champs DateHeure et données numériques sur plusieurs années.

    Je souhaite réaliser un graphique avec HighChart avec une courbe par année afin de réaliser des comparaisons. quel code SQL séparant les données par années serait compatible pour créer ces graphiques

    Merci Stéphane

    -
    Edité par stefane26 4 novembre 2013 à 11:01:30

    • Partager sur Facebook
    • Partager sur Twitter
      4 novembre 2013 à 11:33:52

      Dans HighCharts, tu mets autant de séries que tu veux (comme vu dans les précédents sujets). C'est juste à trois de trier tes données en PHP et de faire les arrays qu'il faut.

      En SQL, rien de spécial à faire, tu récupères tout, éventuellement, tu peux faire un YEAR(DateHeure) AS annee pour récupérer l'année seule. C'est au traitement PHP que tu vas trier tes résultat, schématiquement :

      if($annee == 2012) {
          $avant[] = $valeur;
      } else if($annee == 2013) {
          $apres[] = $valeur;
      }



      • Partager sur Facebook
      • Partager sur Twitter
        5 novembre 2013 à 6:49:35

        J'ai écrit le code suivant, mais il y a une erreur

        $query_temperature_moy_m = $bd_meteo->query("SELECT ROUND(AVG(Temp_E),1), YEAR(DateHeure) AS annee2 FROM data GROUP BY YEAR(DateHeure), MONTH(DateHeure) ORDER BY YEAR(DateHeure), MONTH(DateHeure), DAY(DateHeure)");
        
        while ($temp1 = $query_temperature_moy_m->fetch())
        {
        	if ($annee2 == 2013){
        	$temp2013[] = $temp1['ROUND(AVG(Temp_E),1)'];
        	}
        }
        
        echo join($temp2013, ',').'</br>';

        Le "echo join" donne l'erreur : Warning: join(): Invalid arguments passed in /homepages...
        Je ne trouve pas le soucis.

        Ensuite, je souhaiterais que les listes par année se créent automatiquement afin d'obtenir la chaine de caractère pour HighCharts :

        [{
                        name: '2010',
                        data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
                    }, {
                        name: '2011',
                        data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
                    }, {
                        name: '2012',
                        data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
                    }, {
                        name: '2013',
                        data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6]
                    }]

        Merci pour votre aide

        Stéphane

        • Partager sur Facebook
        • Partager sur Twitter
          5 novembre 2013 à 9:45:07

          Le message est assez clair je trouve : $temp2013 n'est pas un array : donc soit on est jamais rentré dans le while soit jamais dans le if.

          Tu as peut-être une erreur SQL, pour s'assurer que tout va bien côté SQL, on fait ça en PDO :

          $bd_meteo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

          Comme ça si on s'est planté sur le nom d'une colonne ou d'une table, on a une erreur explicite qui s'affiche.

          Ensuite la chaîne que tu veux obtenir est toujours du JSON, donc il suffit de faire un array à plusieurs Niveaux en PHP, exemple :

          $data = array(
              array(
                  'name' => "2010",
                  'data' => [12, 34, 45]
              ),
              array(
                  'name' => "2011",
                  'data' => [12, 34, 45]
              ),
          );
          echo json_encode($data);

          Evidemment, on peut le construire via une boucle :

          $data = array();
          
          while(...){
              if(!isset($data[$annee])){
                  $data[$annee] = array(
                      'name' => $annee,
                      'data' => array()
                  );
              }
              $data[$annee]['data'][] = $temperature;
          }
          
          echo json_encode(array_values($data));




          • Partager sur Facebook
          • Partager sur Twitter
            6 novembre 2013 à 6:47:22

            Bonjour et encore merci à toi Kyle Katarn pour ton aide précieuse, j'ai tenté d'adapter mon code au tien mais j'obtiens l'erreur suivante : Fatal error: Call to a member function fetch() on a non-object in... à la ligne "while ($temp_moy_m = $query_temperature_moy_m->fetch())"

            $query_annee_min_max = $bd_meteo->query("SELECT YEAR(MIN(DateHeure)), YEAR(MAX(DateHeure)) FROM data ");
            
            											
            $query_temperature_moy_m = $bd_meteo->query("SELECT ROUND(AVG(Temp_E),1) AS temperature, YEAR(DateHeure) AS annee, FROM data
            											GROUP BY MONTH(DateHeure), YEAR(DateHeure) ORDER BY YEAR(DateHeure), MONTH(DateHeure), DAY(DateHeure)");
            
            
            $annee_max_min = $query_annee_min_max->fetch();
            	$annee_min = $annee_max_min['YEAR(MIN(DateHeure))'];
            	$annee_max = $annee_max_min['YEAR(MAX(DateHeure))'];
            
            	
            
            while ($temp_moy_m = $query_temperature_moy_m->fetch())
            {
            $temp_moy_m = array();
            	$annee = $annee_min;
            	while($annee <= $annee_max){
            		if(!isset($temp_moy_m[$annee])){
            				$temp_moy_m[$annee] = array(
            					'name' => $annee,
            					'data' => array()
            				);
            			}
            		$annee++;
            		$temp_moy_m[$annee]['data'][] = $temperature;
            		}
            }
            
            	
            
            
            echo $annee_max.'</br>';
            echo $annee_min.'</br>';
            echo json_encode(array_values($temp_moy_m));

            Je ne trouve pas mon erreur, mais aussi je ne sais pas si l'adaptation est correcte.

            Stéphane

            -
            Edité par stefane26 6 novembre 2013 à 6:53:53

            • Partager sur Facebook
            • Partager sur Twitter
              6 novembre 2013 à 7:57:29

              Cette erreur entre dans le top 10 des erreurs les plus courantes en PHP. En fait si on utilise PDO, tu la rencontre tout le temps, du coup il suffit de la taper dans Google pour avoir la solution en 40 exemplaires. Et en plus si tu avais fait ce que je t'ai dit de faire dans mon précédent post, tu n'aurais pas cette erreur.
              • Partager sur Facebook
              • Partager sur Twitter
                6 novembre 2013 à 10:52:00

                J'ai bien mis cette ligne :$bd_meteo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); mais cela ne me sort aucune erreur.

                Après recherches sur google, je n'ai toujours pas trouvé le problème, je ne vois pas d'erreur dans le nom de champs par exemple.

                J'ai fait 4 tests (trouvés sur le forum de OpenClassRomms), voici le code :

                $query_annee_min_max = $bd_meteo->query("SELECT YEAR(MIN(DateHeure)), YEAR(MAX(DateHeure)) FROM data ");
                
                											
                $query_temperature_moy_m = $bd_meteo->query("SELECT ROUND(AVG(Temp_E),1) AS temperature, YEAR(DateHeure) AS annee, FROM data GROUP BY MONTH(DateHeure), YEAR(DateHeure) ORDER BY YEAR(DateHeure), MONTH(DateHeure), DAY(DateHeure)");
                
                
                
                var_dump($query_temperature_moy_m);//test1
                var_dump($query_annee_min_max);//test2
                
                $bd_meteo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//test3
                
                if(!is_object($temp_moy_m)){echo"<font color='red' size='5'>DB N EST PAS UN OBJET</font>";}//test4
                
                											
                $annee_max_min = $query_annee_min_max->fetchall();
                	$annee_min = $annee_max_min['YEAR(MIN(DateHeure))'];
                	$annee_max = $annee_max_min['YEAR(MAX(DateHeure))'];
                
                $annee = $annee_min;	
                
                while ($temp_moy_m = $query_temperature_moy_m->fetch())
                {
                
                $temp_moy_m = array();
                	
                	while($annee <= $annee_max){
                		if(!isset($temp_moy_m[$annee])){
                				$temp_moy_m[$annee] = array(
                					'name' => $annee,
                					'data' => array()
                				);
                			}
                		$annee++;
                		$temp_moy_m[$annee]['data'][] = $temperature;
                		}
                }
                

                Test 1 => bool(false)  j'ai donc pourtant bien une erreur

                Test 2 => object(PDOStatement)#3 (1) { ["queryString"]=> string(60) "SELECT YEAR(MIN(DateHeure)), YEAR(MAX(DateHeure)) FROM data " }  cette BDD est bonne

                Test 3 => j'ai bien écrit en rouge : DB N EST PAS UN OBJET

                et Test 4 => rien d'écrit

                Je pèche....

                Stéphane

                • Partager sur Facebook
                • Partager sur Twitter
                  6 novembre 2013 à 14:13:26

                  $bd_meteo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); est à mettre avant de faire le query.

                  En fait, c'est une config de base qu'on met systématiquement après avoir fait un new PDO pour être sûr de voir les erreurs, on l'enlève éventuellement une fois en production mais tant qu'on développe, il faut la laisser.

                  -
                  Edité par Kyle Katarn 6 novembre 2013 à 14:13:47

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 novembre 2013 à 15:31:52

                    En effet, le fait de placer cette ligne avant le query me stipule l'erreur suivante :

                    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM data GROUP BY MONTH(DateHeure), YEAR(DateHeure) ORDER BY YEAR(DateHeure), M' at line 1' in /.../graphiques4.inc.php:8 Stack trace: #0 /homepages/19/d486172578/htdocs/site_V3/pages/graphiques4.inc.php(8): PDO->query('SELECT ROUND(AV...') #1 /.../index.php(149): include('/homepages/19/d...') #2 {main} thrown in /.../graphiques4.inc.php on line 8


                    Mais, là je ne vois toujours rien..

                    Stéphane

                    -
                    Edité par stefane26 6 novembre 2013 à 15:32:17

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 novembre 2013 à 16:42:01

                      Pas de virgule après "AS annee, " donc, il bloque sur le FROM.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 novembre 2013 à 17:42:43

                        Merci beaucoup, c'était bien ça...

                        Par contre ma BD n'est toujours pas un objet., je cherche

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 novembre 2013 à 18:55:27

                          C'est exactement la même chose :

                          Soit tu fais :

                          $bd_meteo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

                          Soit tu passes PDO::FETCH_OBJ dans dans la méthode fetch() à chaque fois que tu veux avoir un objet.

                          Tout est dans la doc.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 novembre 2013 à 21:00:15

                            Bon, là et même un petit avant tu me parles dans un langage que je découvre.

                            Aussi tu parles de"doc" quelle est l'adrese?

                            merci

                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 novembre 2013 à 9:39:01

                              php.net pour le PHP et PDO.

                              Pour le SQL (ce qu'il y a dans les requêtes), il y a http://dev.mysql.com/doc/refman/5.0/fr/ (c'est la doc de MySQL 5 qui sûrement le SGBD que tu as mais il y en a d'autres avec des légères différences)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 janvier 2015 à 12:44:03

                                salut!

                                j'ai un problème sur highcharts.

                                L'un de mes graphes ne varie pas,quelq1 peut m'aider ?

                                Voila mon code php

                                <?php
                                
                                 pg_connect("host=localhost dbname=gpao_database user=postgres password=postgres");
                                  
                                  $query ="with RECURSIVE ressources as(
                                                     select date(step.datefinpointage) as datefinpointage,ressource.iduserlogin,(3600*(sum(step.qtecumul)/sum(step.dureestep))) as vitesses 
                                                    from step,ressource,task,workitem where date(step.datefinpointage) between '2014-12-10' and now()::date and task.idtask='CORR_EB_IR1400_01_04_VALIDATION_WD' and step.iduserlogin=ressource.iduserlogin  and step.idworkitem is not null and
                                                    step.idworkitem=workitem.idworkitem and workitem.idtask=task.idtask group by date(step.datefinpointage), ressource.iduserlogin
                                
                                					union
                                		    select now()::date as datefinpointage,ressource.iduserlogin,0 as vitesses from ressource
                                    )
                                    select iduserlogin,sum(vitesses) as vitesses from ressources group by iduserlogin order by iduserlogin ";  
                                   $result = (pg_query($query));
                                	$rows = array();
                                	$rows['name'] = 'CORR_EB_IR1400_01_04_VALIDATION_WD';
                                	while ($row = pg_fetch_array($result)) {
                                	$rows['data'][] = ($row['vitesses']);
                                	}
                                	
                                	
                                	
                                	$query1 ="with RECURSIVE ressources as(
                                                     select date(step.datefinpointage) as datefinpointage,ressource.iduserlogin,(3600*(sum(step.qtecumul)/sum(step.dureestep))) as vitesses 
                                                    from step,ressource,task,workitem where date(step.datefinpointage) between '2014-12-10' and now()::date and task.idtask='CORR_EB_IR1400_01_02_CORRECTION_XML' and step.iduserlogin=ressource.iduserlogin  and step.idworkitem is not null and
                                                    step.idworkitem=workitem.idworkitem and workitem.idtask=task.idtask group by date(step.datefinpointage), ressource.iduserlogin
                                
                                					union
                                		    select now()::date as datefinpointage,ressource.iduserlogin,0 as vitesses from ressource
                                    )
                                    select iduserlogin,sum(vitesses) as vitesses from ressources group by iduserlogin order by iduserlogin ";  
                                   $result1 = (pg_query($query1));
                                	$rows1 = array();
                                	$rows1['name'] = 'CORR_EB_IR1400_01_02_CORRECTION_XML';
                                	while ($row1 = pg_fetch_array($result1)) {
                                	$rows1['data'][] = ($row1['vitesses']);
                                	}	
                                    $results = array();
                                	array_push($results,$rows);
                                	array_push($results,$rows1);
                                   // array_push($results,$rows12);
                                
                                print json_encode($results, JSON_NUMERIC_CHECK);
                                pg_close(); 
                                ?>

                                 et index

                                <!DOCTYPE HTML>
                                <html>
                                	<head>
                                		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
                                		<title>essai</title>
                                
                                		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
                                		<script type="text/javascript">
                                $(function () {
                                    var chart;
                                    $(document).ready(function() {
                                        $.getJSON("values.php", function(json) {
                                	        console.log(json);
                                		    chart = new Highcharts.Chart({
                                	            chart: {
                                	                renderTo: 'container',
                                	                type: 'line',
                                	                marginRight: 130,
                                	                marginBottom: 25
                                	            },
                                	            title: {
                                	                text: 'essai',
                                	                x: -20 //center
                                	            },
                                	            subtitle: {
                                	                text: '',
                                	                x: -20
                                	            },
                                	            xAxis: {
                                	                categories: ['ARAF', 'BATCH1','DRAN','LAND','MAO','MRAJ','PCAR','RARL','RHER']
                                	            },
                                	            yAxis: {
                                	                title: {
                                	                    text: 'Amount'
                                	                },
                                	                plotLines: [{
                                	                    value: 0,
                                	                    width: 1,
                                	                    color: '#808080'
                                	                }]
                                	            },
                                	            tooltip: {
                                	                formatter: function() {
                                	                        return '<b>'+ this.series.name +'</b><br/>'+
                                	                        this.x +': '+ this.y;
                                	                }
                                	            },
                                	            legend: {
                                	                layout: 'vertical',
                                	                align: 'right',
                                	                verticalAlign: 'top',
                                	                x: -10,
                                	                y: 100,
                                	                borderWidth: 0
                                	            },
                                	            series: json
                                	        });
                                	    });
                                    
                                    });
                                    
                                });
                                		</script>
                                	</head>
                                	<body>
                                  <script src="http://code.highcharts.com/highcharts.js"></script>
                                  <script src="http://code.highcharts.com/modules/exporting.js"></script>
                                
                                <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div>
                                
                                	</body>
                                </html>
                                

                                merci d'avance

                                -
                                Edité par Djazz_Jah 6 janvier 2015 à 12:50:44

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 janvier 2015 à 18:08:08

                                  Que donne console.log(json); dans la console de ton navigateur ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 janvier 2015 à 10:32:35

                                    ça donne 
                                    [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]

                                    -
                                    Edité par Djazz_Jah 7 janvier 2015 à 10:35:24

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 janvier 2015 à 13:35:28

                                      Déploie chaque objet pour voir ce qu'il y a dedans (la console de Chrome le permet facilement, pour les autres, il faut peut-être faire console.log(json[0])) et vérifie que ça correspond avec la structure attendue (cf documentation) :

                                      An array of data points for the series. The points can be given in three ways:

                                      1. An array of numerical values. In this case, the numerical values will be interpreted as y values, and x values will be automatically calculated, either starting at 0 and incrementing by 1, or from pointStart and pointInterval given in the plotOptions. If the axis is has categories, these will be used. This option is not available for range series. Example:
                                        data: [0, 5, 3, 5]
                                      2. An array of arrays with two values. In this case, the first value is the x value and the second is the y value. If the first value is a string, it is applied as the name of the point, and the x value is incremented following the above rules.

                                        For range series, the arrays will be interpreted as [x, low, high]. In this cases, the X value can be skipped altogether to make use ofpointStart and pointRange.

                                        Example:
                                        data: [[5, 2], [6, 3], [8, 2]]
                                      3. An array of objects with named values. In this case the objects are point configuration objects as seen below.

                                        Range series values are given by low and high.

                                        Example:
                                        data: [{
                                        	name: 'Point 1',
                                        	color: '#00FF00',
                                        	y: 0
                                        }, {
                                        	name: 'Point 2',
                                        	color: '#FF00FF',
                                        	y: 5
                                        }]

                                      Si ce n'est pas le cas, il faut construire ton JSON en PHP conformément à l'exemple 1, 2 ou 3.

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      HighCharts - SQL créer plusieurs courbes

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown