Tracer un graphique à partir de données de la base de données - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Tracer un graphique à partir de données de la base de...

Par paintbox -  16 reponses -  Le 12/04/2011 -  Flux RSS - 

Hello Cyrano,je souhaite créer un graphique (histogramme) à partir des données provenants de ma base de données.

Si je n'inclus pas les valeur de ma BD et que je détermine moi-même des valeurs, cela fonctionne sans problème. Ce n'est qu'une fois que j'intègre les valeurs de ma BD que ça ne marche plus.

Le valeurs qui proviennent de ma BD sont $donnees_valeur['total']. J'ai teste et si je mets $donnees_valeur['total'] dans la première boucle While elles s'affichent normalement (voir commentaires OK et PAS OK). Par contre pour la dernière cela ne fonctionne plus.

Aurais-tu une idée d'où se trouve mon erreur?

Merci

header ("Content-type: image/png");
// Connexion a la base de donnees
include('../connex.inc.php');
$idcom=connex('XXXX', 'myparam');
 
$sql_categorie=mysql_query("SELECT *
FROM t_categorie_cat
")
$sql_stat=mysql_query("SELECT SUM(dtc_quantite) AS total, dtc_led_categorie
FROM v_stat_commande
GROUP BY dtc_code_categorie
")
$nblignes=mysql_num_rows($sql_categorie);
// Création de l image avec dimensions donnees (largeur/hauteur)
$largeurImage = 400;
$hauteurImage = 400;
$im = ImageCreate ($largeurImage, $hauteurImage)
or die ("Erreur lors de la création de l'image");
$couleur_fond = ImageColorAllocate ($im, 230, 230,230);
$noir = ImageColorAllocate ($im, 0, 0, 0);
$vert = ImageColorAllocate ($im, 13, 151, 23);
$coul_legendes = ImageColorAllocate ($im, 11, 62, 43);
$blanc = ImageColorAllocate ($im, 255, 255, 255);
 
ImageLine ($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir);
$mois=1;
//Premiere boucle While OK
while ($donnees_stat = mysql_fetch_array($sql_stat))
{
imagettftext($im,10,90,$mois*40,$hauteurImage-30,$coul_legendes,"arial.ttf",$donnees_stat['total']);
$mois=$mois+1;
}
 
ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);
for ($g=0; $g<=100; $g=$g+10)
{
imagettftext($im,10,0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g);
ImageLine ($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir);
}
 
//Seconde boucle While PAS OK
while ($donnees_valeur = mysql_fetch_array($sql_stat) or die(mysql_error()))
{
ImageFilledRectangle ($im, 40, $donnees_valeur['total'], 60, $hauteurImage-30, $vert);
}
ImagePng ($im);

 

 

 

Réponses apportées à cette discussion

Par Cyrano -  Le 12/04/2011 - 

Je serais tenté de t'inciter à vérifier les données que tu récupères de la base de données.

Si ça fonctionne avec des données « en dur » et que, dès que tu utilises des données dynamiques, ça plante, c'est que les données dynamiques sont suspectes. Je te propose donc quelques modification permettant des affichages de débogage :

  1. <?php
  2. // Connexion a la base de donnees
  3. include('../connex.inc.php');
  4. $idcom = connex('XXXX', 'myparam');
  5. $sql1 = "SELECT * ".
  6. "FROM t_categorie_cat";
  7. $sql_categorie = mysql_query($sql1) or die(mysql_error());
  8. $aCats = array();
  9. /**
  10.  * On va stocker le résultat dans un tableau à partir duquel on travaillera plus loin.
  11.  */
  12. while(false !== ($c = mysql_fetch_assoc($sql_categorie)))
  13. {
  14. $aCats[] = $c;
  15. }
  16. // $nblignes = mysql_num_rows($sql_categorie);
  17. $nblignes = count($aCats);
  18. /**
  19.  * Affichage de débogage :
  20.  */
  21. echo("<pre>Catégories :\n");
  22. var_dump($aCats);
  23. echo("</pre>\n");
  24.  
  25. $sql2 = "SELECT ".
  26. " SUM(dtc_quantite) AS total,".
  27. " dtc_led_categorie ".
  28. "FROM v_stat_commande ".
  29. "GROUP BY dtc_code_categorie";
  30. $sql_stat = mysql_query($sql2) or die(mysql_error());
  31. $aStats = array();
  32. while(false !== ($s = mysql_fetch_assoc($sql_stat)))
  33. {
  34. $aStats[] = $s;
  35. }
  36. $nbstats = count($aStats);
  37. /**
  38.  * Affichage de débogage :
  39.  */
  40. echo("<pre>Données statistiques :\n");
  41. var_dump($aStats);
  42. echo("</pre>\n");die();
  43.  
  44.  
  45. // Création de l image avec dimensions donnees (largeur/hauteur)
  46. $largeurImage = 400;
  47. $hauteurImage = 400;
  48. $im = ImageCreate ($largeurImage, $hauteurImage) or die ("Erreur lors de la création de l'image");
  49. $couleur_fond = ImageColorAllocate ($im, 230, 230, 230);
  50. $noir = ImageColorAllocate ($im, 0, 0, 0);
  51. $vert = ImageColorAllocate ($im, 13, 151, 23);
  52. $coul_legendes = ImageColorAllocate ($im, 11, 62, 43);
  53. $blanc = ImageColorAllocate ($im, 255, 255, 255);
  54.  
  55. ImageLine($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir);
  56. $mois = 1;
  57. //Premiere boucle While OK
  58. // while(false !== ($donnees_stat = mysql_fetch_array($sql_stat)))
  59. foreach($aStats as $s => $stat)
  60. {
  61. imagettftext($im,10,90,$mois*40,$hauteurImage-30,$coul_legendes,"arial.ttf",$aStats[$s]['total']);
  62. $mois=$mois+1;
  63. }
  64.  
  65. ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);
  66. for ($g = 0; $g <= 100; $g += 10)
  67. {
  68. imagettftext($im,10,0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g);
  69. ImageLine($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir);
  70. }
  71.  
  72. //Seconde boucle While PAS OK
  73. // while(false !== ($donnees_valeur = mysql_fetch_array($sql_stat) or die(mysql_error())))
  74. foreach($aStats as $s => $stat)
  75. {
  76. ImageFilledRectangle ($im, 40, $aStats[$s]['total'], 60, $hauteurImage-30, $vert);
  77. }
  78. /**
  79.  * header déplacé pour permettre un débogage en amont.
  80.  */
  81. header ("Content-type: image/png");
  82. ImagePng ($im);

Tu noteras les deux var_dump et un die() après le second. Du coup, j'ai également déplacé le header qui était en début de fichier. Essayeça et inspecte méticuleusement les données récupérées. Comme tu auras peut-être noté, je stocke les valeurs récupérées dans des tableaux. Deux avantages :

  1. ça me permet de valider les données que je vais utiliser pour construire l'image;
  2. Je crées les boucles suivantes avec des foreach au lieu de while et je travaille sur les tableaux de données au lieu des ressources MySQL.
  3. Enfin (et c'est probablement LA raison du plantage de le seconde boucle) : à la fin de la première boucle, le pointeur est en fin de tableau. Il n'est pas réinitialisé à la première ligne avant de commencer la seconde boucle. À vérifier dans la doc, j'ai un doute. Note cependant que pour ma part, je ne travaille plus maintenant QUE sur des tableaux de ce style et non sur les ressources de base de données. Je peux donc réutiliser mes tableaux autant de fois que nécessaire sans devoir mobiliser inutilement une ressource DB au-dela du délai de récupération des données.

Essaye comme ça et raconte la suite ;)

 
Par paintbox -  Le 12/04/2011 - 

Hello Cyrano,

 

merci pour ta réponse. Je vais regarder cela à mon aise. Je test et je te tiens au courant.

 

Merci ! 

 
Par paintbox -  Le 13/04/2011 - 

Hello Cyrano,

 alors..., j'ai suivi tes conseils et ai utilisé des tableaux pour stocker les valeurs de mes requetes.

Cela fonctionne très bien. Le seul souci que j'ai encore est que :

dans  la première boucle :

 - j'indique les noms des categories 

 et dans la seconde boucle :

 - je trace mes "battons"

 - et j'indique leur valeur au dessus

En fait, mes infos ne correspondent pas . En gros si par exemple mes Spots led doivent faire 20%,

mes 3 données ne s'alignent pas. On dirait qu'il me donne une valeur dans un sens, puis la seconde dans un autre, et la troisième encore dans un autre sens. Bref tout est mélangé .

 

Est-ce clair?

Etrange je ne vois pas pourquoi alors que pour la dernière boucle les données sont affichées dans la même boucle.

 

 
Par paintbox -  Le 13/04/2011 - 

J'ai oublié de te mettre mon code tel qu'il se présente actuellement : 

  1. $sql1 = "SELECT * ".
  2. "FROM t_categorie_cat".
  3. " WHERE cat_code BETWEEN 100 AND 600";
  4. $sql_categorie = mysql_query($sql1) or die(mysql_error());
  5. $aCats = array();
  6. /**
  7.  * On va stocker le résultat dans un tableau à partir duquel on travaillera plus loin.
  8.  */
  9. while(false !== ($c = mysql_fetch_assoc($sql_categorie)))
  10. {
  11. $aCats[] = $c;
  12. }
  13. $nblignes = count($aCats);
  14.  
  15. $sql2 = "SELECT ".
  16. " SUM(dtc_quantite) AS total,".
  17. " dtc_led_categorie ".
  18. "FROM v_stat_commande ".
  19. "GROUP BY dtc_code_categorie";
  20. $sql_stat = mysql_query($sql2) or die(mysql_error());
  21. $aStats = array();
  22. while(false !== ($s = mysql_fetch_assoc($sql_stat)))
  23. {
  24. $aStats[] = $s;
  25. }
  26. $nbstats = count($aStats);
  27.  
  28. // Création de l image avec dimensions donnees (largeur/hauteur)
  29. $largeurImage = 400;
  30. $hauteurImage = 400;
  31. $im = ImageCreate ($largeurImage, $hauteurImage) or die ("Erreur lors de la création de l'image");
  32. $couleur_fond = ImageColorAllocate ($im, 230, 230, 230);
  33. $noir = ImageColorAllocate ($im, 0, 0, 0);
  34. $vert = ImageColorAllocate ($im, 13, 151, 23);
  35. $coul_legendes = ImageColorAllocate ($im, 11, 62, 43);
  36. $blanc = ImageColorAllocate ($im, 255, 255, 255);
  37.  
  38. $mois = 1;
  39. //Premiere boucle Affichage des categories
  40. foreach($aStats as $s => $stat)
  41. {
  42. imagettftext($im,10,90,$mois*40,$hauteurImage-30,$coul_legendes,"arial.ttf",$aStats[$s]['dtc_led_categorie']);
  43. $mois=$mois+1;
  44. }
  45.  
  46. ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);//Axe Vertical
  47. for ($g = 0; $g <= 100; $g += 10)
  48. {
  49. Imagettftext($im, 10, 0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g); //Graduation verticale
  50. ImageLine ($im, 30, ($hauteurImage-30)-($g*3), 380, ($hauteurImage-30)-($g*3), $blanc); //Lignes blanches
  51. ImageLine ($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir); //Axe horizontal
  52. ImageLine ($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir); //Reperes graduation verticale
  53. }
  54.  
  55. //Seconde boucle Affichage des Battons et de leur valeur
  56. $h = 1; // Decalage vertical
  57. $l = 60; // Decalage horizontal
  58. foreach($aStats as $s => $stat)
  59. {
  60. ImageRectangle ($im, $l+10, (($hauteurImage-30) - ($aStats[$s]['total'])*3), $l+20, $hauteurImage-30, $vert);
  61. Imagettftext ($im, 10, 0,($largeurImage-15)-($h*40),170,$coul_legendes,"arial.ttf",$aStats[$s]['total']);
  62. $h++;
  63. $l=$l+40;
  64. }
  65. /**
  66.  * header déplacé pour permettre un débogage en amont.
  67.  */
  68. header ("Content-type: image/png");
  69. ImagePng ($im);

 

 
Par Cyrano -  Le 13/04/2011 - 

Il faudrait que je teste ton script, un petit jeu d'essai serait pratique, du style de ce que t'affichent les var_dump par exemple, je convertirai bien ça en tableaux PHP.

 

 
Par paintbox -  Le 13/04/2011 - 
Voici normalement les valeurs que j'obtiens de MySQL et leur categorie correspondante 
  1. 20 No categorie
  2. 36 Spots LED
  3. 6 Ampoules dimmables
  4. 7 Appliques LED
  5. 14 Eclairage LED extérieur
  6. 64 Spots dimmables
  7. 18 Ampoules LED
  8. 2 Spots industriels

 

 
Et voici ce que j'obtiens sur mon graphique 
  1. 2 Spots LED Affichage baton : 20
  2. 18 Ampoules dimmables Affichage baton : 36
  3. 64 Appliques LED Affichage baton : 6
  4. 14 Eclairage LED extérieur Affichage baton : 7
  5. 7 Spots dimmables Affichage baton : 14
  6. 6 Ampoules LED Affichage baton : 64
  7. 36 Spots industriels Affichage baton : 18
  8. 20 No categorie Affichage baton : 2

 

 
 
Par paintbox -  Le 13/04/2011 - 

Et voici ce que m'affichent les var_dump

 

  1. Catégories :
  2. array(8) {
  3. [0]=>
  4. array(6) {
  5. ["cat_id"]=>
  6. string(1) "1"
  7. ["cat_code"]=>
  8. string(3) "100"
  9. ["cat_nom"]=>
  10. string(9) "Spots LED"
  11. ["cat_nom_nl"]=>
  12. NULL
  13. ["cat_nom_gb"]=>
  14. NULL
  15. ["cat_code_cat"]=>
  16. string(2) "SP"
  17. }
  18. [1]=>
  19. array(6) {
  20. ["cat_id"]=>
  21. string(1) "2"
  22. ["cat_code"]=>
  23. string(3) "110"
  24. ["cat_nom"]=>
  25. string(15) "Spots dimmables"
  26. ["cat_nom_nl"]=>
  27. NULL
  28. ["cat_nom_gb"]=>
  29. NULL
  30. ["cat_code_cat"]=>
  31. string(3) "SDI"
  32. }
  33. [2]=>
  34. array(6) {
  35. ["cat_id"]=>
  36. string(1) "3"
  37. ["cat_code"]=>
  38. string(3) "200"
  39. ["cat_nom"]=>
  40. string(12) "Ampoules LED"
  41. ["cat_nom_nl"]=>
  42. NULL
  43. ["cat_nom_gb"]=>
  44. NULL
  45. ["cat_code_cat"]=>
  46. string(2) "AP"
  47. }
  48. [3]=>
  49. array(6) {
  50. ["cat_id"]=>
  51. string(1) "4"
  52. ["cat_code"]=>
  53. string(3) "210"
  54. ["cat_nom"]=>
  55. string(18) "Ampoules dimmables"
  56. ["cat_nom_nl"]=>
  57. NULL
  58. ["cat_nom_gb"]=>
  59. NULL
  60. ["cat_code_cat"]=>
  61. string(3) "ADI"
  62. }
  63. [4]=>
  64. array(6) {
  65. ["cat_id"]=>
  66. string(1) "5"
  67. ["cat_code"]=>
  68. string(3) "300"
  69. ["cat_nom"]=>
  70. string(17) "Spots industriels"
  71. ["cat_nom_nl"]=>
  72. NULL
  73. ["cat_nom_gb"]=>
  74. NULL
  75. ["cat_code_cat"]=>
  76. string(2) "SI"
  77. }
  78. [5]=>
  79. array(6) {
  80. ["cat_id"]=>
  81. string(1) "6"
  82. ["cat_code"]=>
  83. string(3) "400"
  84. ["cat_nom"]=>
  85. string(13) "Appliques LED"
  86. ["cat_nom_nl"]=>
  87. NULL
  88. ["cat_nom_gb"]=>
  89. NULL
  90. ["cat_code_cat"]=>
  91. string(3) "APL"
  92. }
  93. [6]=>
  94. array(6) {
  95. ["cat_id"]=>
  96. string(1) "7"
  97. ["cat_code"]=>
  98. string(3) "500"
  99. ["cat_nom"]=>
  100. string(24) "Eclairage LED extérieur"
  101. ["cat_nom_nl"]=>
  102. NULL
  103. ["cat_nom_gb"]=>
  104. NULL
  105. ["cat_code_cat"]=>
  106. string(2) "EX"
  107. }
  108. [7]=>
  109. array(6) {
  110. ["cat_id"]=>
  111. string(1) "8"
  112. ["cat_code"]=>
  113. string(3) "600"
  114. ["cat_nom"]=>
  115. string(15) "Accessoires LED"
  116. ["cat_nom_nl"]=>
  117. NULL
  118. ["cat_nom_gb"]=>
  119. NULL
  120. ["cat_code_cat"]=>
  121. string(2) "AC"
  122. }
  123. }
  124. Données statistiques :
  125. array(8) {
  126. [0]=>
  127. array(2) {
  128. ["total"]=>
  129. string(2) "20"
  130. ["dtc_led_categorie"]=>
  131. string(0) ""
  132. }
  133. [1]=>
  134. array(2) {
  135. ["total"]=>
  136. string(2) "36"
  137. ["dtc_led_categorie"]=>
  138. string(9) "Spots LED"
  139. }
  140. [2]=>
  141. array(2) {
  142. ["total"]=>
  143. string(1) "6"
  144. ["dtc_led_categorie"]=>
  145. string(18) "Ampoules dimmables"
  146. }
  147. [3]=>
  148. array(2) {
  149. ["total"]=>
  150. string(1) "7"
  151. ["dtc_led_categorie"]=>
  152. string(13) "Appliques LED"
  153. }
  154. [4]=>
  155. array(2) {
  156. ["total"]=>
  157. string(2) "14"
  158. ["dtc_led_categorie"]=>
  159. string(24) "Eclairage LED extérieur"
  160. }
  161. [5]=>
  162. array(2) {
  163. ["total"]=>
  164. string(2) "64"
  165. ["dtc_led_categorie"]=>
  166. string(15) "Spots dimmables"
  167. }
  168. [6]=>
  169. array(2) {
  170. ["total"]=>
  171. string(2) "18"
  172. ["dtc_led_categorie"]=>
  173. string(12) "Ampoules LED"
  174. }
  175. [7]=>
  176. array(2) {
  177. ["total"]=>
  178. string(1) "2"
  179. ["dtc_led_categorie"]=>
  180. string(17) "Spots industriels"
  181. }
  182. }

 

 

 
Par Cyrano -  Le 13/04/2011 - 

J'ai tout de même un doute : en regardant à nouveau ton code, je ne saisis pas à quoi sert la première requ^pete : le résultat n'est jamais utilisé ... ??

 

 
Par paintbox -  Le 13/04/2011 - 

Oui, en effet, cette première requete ne sert plus dutout à rien. Je ne l'utilise plus dutout

 
Par Cyrano -  Le 13/04/2011 - 

Ok, on va simplifier le code dans ce cas et virer la « pollution » ;)

Je teste ton script, le résultat est effectivement bizarre, je tente de comprendre ce que tu veux obtenir, j'ai une première idée, à mon avis un oubli d'incrémentation dans la boucle ;)

 

 
Par Cyrano -  Le 13/04/2011 - 

Ok, voilà ce que j'ai trouvé, je commence avec ton code :

  1. <?php
  2. /*
  3. $sql2 = "SELECT ".
  4.   " SUM(dtc_quantite) AS total,".
  5.   " dtc_led_categorie ".
  6.   "FROM v_stat_commande ".
  7.   "GROUP BY dtc_code_categorie";
  8. $sql_stat = mysql_query($sql2) or die(mysql_error());
  9. $aStats = array();
  10. while(false !== ($s = mysql_fetch_assoc($sql_stat)))
  11. {
  12.   $aStats[] = $s;
  13. }
  14. $nbstats = count($aStats);
  15. */
  16. $aStats = array (
  17. "total" => 20,
  18. "dtc_led_categorie" => "Divers",
  19. ),
  20. "total" => 36,
  21. "dtc_led_categorie" => "Spots LED",
  22. ),
  23. "total" => 6,
  24. "dtc_led_categorie" => "Ampoules dimmables",
  25. ),
  26. "total" => 7,
  27. "dtc_led_categorie" => "Appliques LED",
  28. ),
  29. "total" => 14,
  30. "dtc_led_categorie" => "Eclairage LED extérieur",
  31. ),
  32. "total" => 64,
  33. "dtc_led_categorie" => "Spots dimmables",
  34. ),
  35. "total" => 18,
  36. "dtc_led_categorie" => "Ampoules LED",
  37. ),
  38. "total" => 2,
  39. "dtc_led_categorie" => "Spots industriels",
  40. )
  41. );
  42.  
  43. // Création de l image avec dimensions donnees (largeur/hauteur)
  44. $largeurImage = 400;
  45. $hauteurImage = 400;
  46. $im = ImageCreate ($largeurImage, $hauteurImage) or die ("Erreur lors de la création de l'image");
  47. $couleur_fond = ImageColorAllocate ($im, 230, 230, 230);
  48. $noir = ImageColorAllocate ($im, 0, 0, 0);
  49. $vert = ImageColorAllocate ($im, 13, 151, 23);
  50. $coul_legendes = ImageColorAllocate ($im, 11, 62, 43);
  51. $blanc = ImageColorAllocate ($im, 255, 255, 255);
  52.  
  53. /**
  54.  * Traçage de l'image de fond
  55.  */
  56. ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);//Axe Vertical
  57. for ($g = 0; $g <= 100; $g += 10)
  58. {
  59. Imagettftext($im, 10, 0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g); // Graduation verticale
  60. ImageLine($im, 30, ($hauteurImage-30)-($g*3), 380, ($hauteurImage-30)-($g*3), $blanc); // Lignes blanches
  61. ImageLine($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir); // Axe horizontal
  62. ImageLine($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir); // Reperes graduation verticale
  63. }
  64.  
  65. // Traçage des Bâtons et de leur valeurs
  66. $h = 1; // Décalage vertical
  67. $l = 60; // Décalage horizontal
  68. $mois = 1;
  69. $font = "arial.ttf";
  70. foreach($aStats as $s => $stat)
  71. {
  72. $im_rect_x1 = $l + 10;
  73. $im_rect_x2 = $l + 20;
  74. $im_rect_y2 = $hauteurImage - 30;
  75. // $im_txt_x = ($largeurImage - 15) - ($h * 40);
  76. $im_txt_x = $l + 10;
  77. $im_txt_y = 170;
  78. $im_rect_y1 = (($hauteurImage - 30) - ((int)$aStats[$s]['total']) * 3);
  79. $im_txt2_x = ($mois * 40) + 25;
  80. $im_txt2_y = $hauteurImage - 30;
  81.  
  82. ImageRectangle($im, $im_rect_x1, $im_rect_y1, $im_rect_x2, $im_rect_y2, $vert);
  83. Imagettftext($im, 10, 0, $im_txt1_x, $im_txt1_y, $coul_legendes, $font, $aStats[$s]['total']);
  84. imagettftext($im, 10, 90, $im_txt2_x, $im_txt2_y, $coul_legendes, $font, $aStats[$s]['dtc_led_categorie']);
  85. $h++;
  86. $l += 40;
  87. $mois++;
  88. }
  89. /**
  90.  * header déplacé pour permettre un débogage en amont.
  91.  */
  92. header ("Content-type: image/png");
  93. ImagePng ($im);

Déjà, j'ai fusionné les deux boucles. Tu noteras aussi (au résultat surtout) que pour comprendre l'image et améliorer la lisibilité, j'ai décalé le texte vertical, mais ça, tu peux toujours virer le « + 25 » que j'ai ajouté. Ensuite, pour me simplifier l'utilisation des fonctions, j'ai sorti des calculs de suites de paramètres pour utiliser des variables que je définis avant.

Compare maintenant les lignes 83 (ancienne ligne que j,ai commenté) et 84 qui la remplace.....

 

Je n'ai pas poussé la réflexion pour trouver l'explication à l'inversion des position des chiffres, mais c'est ce que ça donnait. Maintenant, tout est bien dans l'ordre ;)

 

 
Par paintbox -  Le 14/04/2011 - 

Hello Cyrano,

 j'ai regardé ton code. Le fait de ne faire qu'une boucle et de déclarer les variables de positionnement une seul fois est effectivement plus clair, cela allège le code.

Je crois que je m'embrouillais aussi un peu avec tous mes calculs. Je viens de relire la doc sur ImageRectange et Imagettftext et c'est plus clair.

Je dois apprendre à simplifier les choses et à déclarer 1 seule fois les variables qui se répètent.n Je gagnerai du temps et de la clarté au niveau lisibilité.

Merci ! 

 
Par paintbox -  Le 14/04/2011 - 

Je cale encore sur un petit détail esthétique. Je voudrais que pour chaque baton, la couleur change. J'ai pour cela définit des couelur ($coul_barre1…)

j'essaye de concatener $coul_barre avec $mois(qui s'incrémente de 1 à chaque passage) mais cela ne fonctionne pas.

 

Aurais-tu une idée?

 

  1. // Requete
  2. $sql2 = "SELECT ".
  3. " SUM(dtc_quantite) AS total,".
  4. " dtc_led_categorie ".
  5. "FROM v_stat_commande ".
  6. "GROUP BY dtc_code_categorie";
  7. $sql_stat = mysql_query($sql2) or die(mysql_error());
  8. $aStats = array();
  9. // On place les donnees recuperees de la requete dans un tableau
  10. while(false !== ($s = mysql_fetch_assoc($sql_stat)))
  11. {
  12. $aStats[] = $s;
  13. }
  14. $nbstats = count($aStats); // Calcul nombre de resultats obtenus
  15.  
  16. // Création de l image avec dimensions donnees (largeur/hauteur)
  17. $largeurImage = 600;
  18. $hauteurImage = 400;
  19. $im = ImageCreate ($largeurImage, $hauteurImage) or die ("Erreur lors de la création de l'image");
  20.  
  21. // On defini les couleurs qui seront utilisees
  22. $couleur_fond = ImageColorAllocate ($im, 230, 230, 230);
  23. $noir = ImageColorAllocate ($im, 0, 0, 0);
  24. $vert = ImageColorAllocate ($im, 13, 151, 23);
  25. $coul_legendes = ImageColorAllocate ($im, 11, 62, 43);
  26. $blanc = ImageColorAllocate ($im, 255, 255, 255);
  27. // Couleur des barres du graphique
  28. $coul_barre1 = ImageColorAllocate ($im, 42, 124, 94);
  29. $coul_barre2 = ImageColorAllocate ($im, 0, 90, 94);
  30. $coul_barre3 = ImageColorAllocate ($im, 0, 38, 131);
  31. $coul_barre4 = ImageColorAllocate ($im, 100, 38, 131);
  32. $coul_barre5 = ImageColorAllocate ($im, 165, 38, 131);
  33. /**
  34.  * Traçage de l'image de fond
  35.  */
  36. ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir); //Axe Vertical
  37. ImageLine ($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir); // Axe horizontal
  38. for ($g = 10; $g <= 100; $g += 10)
  39. {
  40. Imagettftext($im, 10, 0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g); // Graduation verticale
  41. ImageLine($im, 30, ($hauteurImage-30)-($g*3), 380, ($hauteurImage-30)-($g*3), $blanc); // Lignes blanches
  42. ImageLine($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir); // Reperes graduation verticale
  43. }
  44.  
  45. // Traçage des Bâtons et de leur valeurs
  46. $h = 1; // Décalage vertical
  47. $l = 60; // Décalage horizontal
  48. $mois = 1;
  49. $font = "arial.ttf";
  50. foreach($aStats as $s => $stat)
  51. {
  52. // On déclare les variables de position pour les batons
  53. $im_rect_x1 = $l + 10; // En x1 la valeur est fixe
  54. $im_rect_y1 = (($hauteurImage - 30) - ((int)$aStats[$s]['total']) * 3); // En y1 la valeur depend de la BD
  55. $im_rect_x2 = $l + 20; // En x2 la valeur est fixe
  56. $im_rect_y2 = $hauteurImage - 30; // En y2 la valeur est fixe
  57.  
  58. // On déclare les variables de position pour le texte
  59. $im_txt1_x = $l + 10;
  60. $im_txt1_y = 170;
  61. $im_txt2_x = ($mois * 40) + 25;
  62. $im_txt2_y = $hauteurImage - 30;
  63. $coul_barre = $coul_barre.'".$mois."';
  64. ImageFilledRectangle($im, $im_rect_x1, $im_rect_y1, $im_rect_x2, $im_rect_y2, $coul_barre);
  65. Imagettftext($im, 10, 0, $im_txt1_x, $im_txt1_y, $coul_legendes, $font, $aStats[$s]['total']);
  66. Imagettftext($im, 10, 90, $im_txt2_x, $im_txt2_y, $coul_legendes, $font, $aStats[$s]['dtc_led_categorie']);
  67. $h++;
  68. $l += 40;
  69. $mois++;
  70. }
  71. /**
  72.  * header déplacé pour permettre un débogage en amont.
  73.  */
  74. header ("Content-type: image/png");
  75. ImagePng ($im);

 

 

 
Par Cyrano -  Le 14/04/2011 - 

Problème de création de variable dynamique.

Tu as écrit :

  1. $coul_barre = $coul_barre.'".$mois."';

Le résultat est que PHP cherche une variable nommée « $coul_barre".1." » au lieu de « $coul_barre1 »

 

Correction : pour construire une variable dynamique, il faut faire :

  1. $coul_barre = ${'coul_barre'. $mois};

Note du reste au passage que tu peux y ajouter une vérification de l'existence et y mettre une alternative :

  1. $coul_barre = (isset(${'coul_barre'. $mois})) ? ${'coul_barre'. $mois} : $coul_barre1;

Et là par exemple, tu n'as défini que 5 couleurs de barres, donc, passé le mois de mai dans la boucle, tu vas avoir une erreur de variable non définie.

 
Par paintbox -  Le 14/04/2011 - 

Variable dynamique … encore un nouveau truc :-)

C'est en fait ce que je cherchais à faire mais sans trop savoir comment faire.

Pour les couleurs, en effet je ne les avais pas toutes définies sans savoir si cela fonctionnerait.

En tout cas, pour que cela fonctionne, il faut aussi que toute les couleurs soient déclarées.

Je prends une fois de plus  note de cette astuce.

Merci ! 

 
Par  -  Le 07/01/2012 - 

Really very nice Good article! Thank you so much for sharing this post. cheap ugg boots

 

 

Ajouter une réponse à la discussion

Seuls les membres loggués sont autorisés à poster dans les forums !