Je vais essayer d'être le plus bref et le plus précis possible.
Highcharts est une librairie Javascript/AJAX permettant de faire de beaux graphiques interactifs.
La librairie propose un graphique de ce genre et c'est exactement ce qu'il me faut :

Voici ce que je veux :
dans l'axe des X, je veux afficher les mois. Ces mois doivent être issus de ma base de données.
Pour chaque nouvelle entrée dans ma table, j'y associe une date. Et c'est simple de récupérer le mois de la date dans la requête SQL.
dans l'axe des Y, je veux afficher des chiffres.
Voici ma table :
id | type | montant| date
et des exemples d'entrée :
1 | type1 | 100 | 2014-11-01
2 | type1 | 40| 2014-11-21
3 | type3 | 60 | 2014-11-23
4 | type2 | 150 | 2014-11-24
5 | type1 | 60 | 2014-11-30
6 | type1 | 200 | 2014-12-01
7 | type2 | 50 | 2014-12-21
8 | type3 | 150 | 2014-12-23
9 | type1 | 100 | 2014-12-24
10 | type2 | 500 | 2014-12-25
11 | type3 | 150 | 2014-12-28
Rien de difficile. J'ai 3 types d'entrée. Chaque entrée contient un montant.
Mon graphique devra être un total du montant de chaque type pour chaque mois (facile à faire en SQL mais je suis bloqué ensuite)
La difficulté commence ici. Voici comment il faut mettre en forme les données pour Highcharts (données de l'image ci-dessus) :
L'axe des X :
xAxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
},
J'ai réussi à faire l'axe des X mais je bloque au terrible axe des Y :
L'axe des Y :
yAxis: {
series: [{
name: 'Tokyo',
data: [7.0, 6.9,]
}, {
name: 'New York',
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: 'Berlin',
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: 'London',
data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
}]
});
Si les données ne respectent pas cette syntaxe exacte, c'est mort : mon graphique ne pourra pas fonctionner.
Voici ma requête SQL me permettant d'additionner les montants pour chaque type et chaque mois
SELECT type, SUM(montant) AS somme, MONTH( date) AS mois FROM `matable` GROUP BY mois, type.
Elle m'affiche ce résultat :
type - somme - mois
type 1 - 200 - 11
type2 - 150 - 11
type3 - 60 - 11
type 1 - 300 - 12
type2 - 550 - 12
type3 - 300 - 12
Avec PHP, je pioche et je mets en forme comme ça :
while($data = $requete->fetch()) {
echo "{name: '".$data['type']."',";
echo "data: [".$data['somme'].", ]}, ";
}
Ce qui me donne ce résultat ci :
{name: 'type1',
data: [200, ]},
{name: 'type2',
data: [150, ]},
{name: 'type3',
data: [60, ]},
{name: 'type1',
data: [300, ]},
{name: 'type2',
data: [550, ]},
{name: 'type3',
data: [300, ]},
alors que j'aimerais avoir ce résultat :
{name: 'type1',
data: [200, 300 ]},
{name: 'type2',
data: [150, 550 ]},
{name: 'type3',
data: [60, 300 ]},
Et je bloque, et je bloque, et je bloque....