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
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 :
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 :
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.
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.
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
$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
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
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)
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();
?>
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:
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]
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]]
An array of objects with named values. In this case the objects are point configuration objects as seen below.
× 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.
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/
http://www.meteo-montelo.fr/