TUTORIEL PHP 
Relier PHP/SWF Charts à MySQL
Troisième partie de notre approche du script d'affichage de diagramme en Flash, où nous rendons nos données véritablement dynamiques en les tirant directement d'une base de données grâce à PHP. (10/11/2004)

Après une présentation de PHP/SWF Charts et la construction d'un générateur de code PHP, nous tentons cette fois d'afficher le SWF des données tirées d'une base MySQL par le biais de PHP.

Cela nous permettra non seulement de pouvoir modifier ces données plus facilement (via possiblement un CMS tiers), mais surtout de disposer constamment de leur dernière mise à jour.

Pour notre exemple, nous allons afficher certaines données d'une base fictive d'un loueur de DVD en ligne.

La base

Nous n'allons nous préoccuper que de trois tables de notre base : la table dvd, contenant toutes les informations relatives à un DVD (dont l'année de création du film), la table genre, qui associe chaque genre à un id, et la table avoir_genre qui nous permet de faire le lien entre les deux tables dvd et genre.

Notre objectif, pour commencer, est d'afficher côte à côte les barres représentant le nombre de DVD par genre pour une année donnée. La requête SQL est assez simple :
SELECT genre.genre_nom, COUNT(dvd.dvd_id)
FROM dvd, avoir_genre, genre
WHERE dvd.dvd_annee = '2000'
AND dvd.dvd_id = avoir_genre.dvd_id
AND avoir_genre.genre_id = genre.genre_id
GROUP BY genre.genre_nom;

Le résultat sous SQL sera de cette forme :

Action & Aventure
16
Comedie
22
Comedie dramatique
9
Comédie romantique
2
Dessin Animé
4
Drame
7
Fantastique & Horreur
12
Films musicaux
1
Guerre
1
Humour
1
Pack
1
Policier & Thriller
6
Pop & Rock
3
Science-Fiction
3

Notre objectif est maintenant d'intégrer ces résultats dans la matrice nécessaire au fonctionnement de PHP/SWF Charts...

Intégration
Le mode d'emploi de PHP/SWF Charts nous indique que deux méthodes sont possibles, les deux utilisant un tableau multidimensionnel. La méthode la plus utilisée est la suivante :

$chart [ 'chart_data' ] = array (
  array ( "",         "2001", "2002", "2003", "2004" ),
  array ( "Region A",     5,     10,     30,     63 ),
  array ( "Region B",   100,     20,     65,     55 ),
  array ( "Region C",    56,     21,      5,     90 )
  );

Ici, nous n'affichons qu'une année, ce qui nous facilite la tâche : notre tableau sera de cette forme :

$chart [ 'chart_data' ] = array (
  array ( "",        "2000"),
  array ( "Genre 1",     5 ),
  array ( "Genre 2",   100 ),
  array ( "Genre 3",    56 )
(etc...)
  );

Il nous suffit donc, après avoir récupéré nos données de MySQL, de les intégrer au sein d'une boucle. Voici le code que nous utilisons ($sql correspond à la requête SQL que nous avons présentée plus avant) :

$result = mysql_query($sql);
$chart['chart_data'] = array ();
$chart['chart_data'][] = array ( "", "2000");
while ($ligne = mysql_fetch_row($result)) {
  $chart['chart_data'][] = array ( "$ligne[0]", $ligne[1] );
  }

Reste à définir notre diagramme :

$chart['chart_type'] = "bar";
$chart['chart_line'] = array ( 'line_thickness' => 2);
drawChart($chart);

Et nous obtenons le résultat suivant, qu'il nous faut améliorer.

C'est en effet pour le moins illisible. Outre le fait qu'il n'y a pas assez de couleurs pour le nombre de données à représenter, le tout se superpose. C'est parce que nous utilisons la mise en forme par défaut.

Amélioration de la mise en forme
Il nous faut nous plonger dans les fonctions de l'outil, et modifier l'affichage selon nos goûts. Voici ce que nous avons obtenu avec quelques ajouts au code :

Voici, en gras, ce que nous avons ajouté :

$chart['chart_type'] = "bar";
$chart['chart_line'] = array ( 'line_thickness' => 2);

/* taille de l'animation Flash */
$chart [ 'canvas_bg' ] =
  array ( 'width' => 400,
          'height' => 330,
          );

/* taille du rectangle explicatif */
$chart [ 'legend_rect' ] =
  array ( 'x' => 20,
          'y' => 5,
          'width' => 360,
          'height' => 90,
          'margin' => 0
          );

/* taille du rectangle du diagramme */
$chart [ 'chart_rect' ] =
  array ( 'x' => 40,
          'y' => 110,
          'width' => 320,
          'height' => 200
          );

/* indication de la valeur réelle à droite de la barre */
$chart [ 'chart_value' ] =
  array ( 'position' => "outside",
          'size' => 10,
          'bold' => false
          );

drawChart($chart);

Outre l'agrandissement du Flash lui-même et des deux rectangles où vont s'inscrire les données (qui prennent automatiquement la taille appropriée à leur conteneur), nous saisissons l'occasion pour afficher également les données de chaque colonne à leur droite.

  Forum

Réagissez dans les forums de JDN Développeurs

On voit donc que la combinaison de PHP/SWF Charts à une base de données est relativement simple, pour peu que l'on puisse extraire correctement les données. On pourrait ainsi facilement, pour un seul genre de film, afficher l'évolution du nombre de films de ce genre par année... ou un camembert, ou toute autre représentation.

En revanche, afficher les données dynamiques pour un tableau à plusieurs entrées (plusieurs genres sur plusieurs années, ici) est déjà plus difficile à mettre en place.

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages