Tracer un graphique à partir de données de la base de...
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 donneesinclude('../connex.inc.php');$idcom=connex('XXXX', 'myparam'); $sql_categorie=mysql_query("SELECT * FROM t_categorie_cat ") or die(mysql_error());$sql_stat=mysql_query("SELECT SUM(dtc_quantite) AS total, dtc_led_categorie FROM v_stat_commande GROUP BY dtc_code_categorie ") or die(mysql_error()); $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 OKwhile ($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 OKwhile ($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
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 :
<?php
// Connexion a la base de donnees
include('../connex.inc.php');
$idcom = connex('XXXX', 'myparam');
$sql1 = "SELECT * ".
"FROM t_categorie_cat";
$sql_categorie = mysql_query($sql1) or die(mysql_error());
$aCats = array();
/**
* On va stocker le résultat dans un tableau à partir duquel on travaillera plus loin.
*/
while(false !== ($c = mysql_fetch_assoc($sql_categorie)))
{
$aCats[] = $c;
}
// $nblignes = mysql_num_rows($sql_categorie);
$nblignes = count($aCats);
/**
* Affichage de débogage :
*/
echo("<pre>Catégories :\n");
var_dump($aCats);
echo("</pre>\n");
$sql2 = "SELECT ".
" SUM(dtc_quantite) AS total,".
" dtc_led_categorie ".
"FROM v_stat_commande ".
"GROUP BY dtc_code_categorie";
$sql_stat = mysql_query($sql2) or die(mysql_error());
$aStats = array();
while(false !== ($s = mysql_fetch_assoc($sql_stat)))
{
$aStats[] = $s;
}
$nbstats = count($aStats);
/**
* Affichage de débogage :
*/
echo("<pre>Données statistiques :\n");
var_dump($aStats);
echo("</pre>\n");die();
// 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(false !== ($donnees_stat = mysql_fetch_array($sql_stat)))
foreach($aStats as $s => $stat)
{
imagettftext($im,10,90,$mois*40,$hauteurImage-30,$coul_legendes,"arial.ttf",$aStats[$s]['total']);
$mois=$mois+1;
}
ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);
for ($g = 0; $g <= 100; $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(false !== ($donnees_valeur = mysql_fetch_array($sql_stat) or die(mysql_error())))
foreach($aStats as $s => $stat)
{
ImageFilledRectangle ($im, 40, $aStats[$s]['total'], 60, $hauteurImage-30, $vert);
}
/**
* header déplacé pour permettre un débogage en amont.
*/
header ("Content-type: image/png");
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 :
- ça me permet de valider les données que je vais utiliser pour construire l'image;
- 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.
- 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 ;)
Hello Cyrano,
merci pour ta réponse. Je vais regarder cela à mon aise. Je test et je te tiens au courant.
Merci !
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.
J'ai oublié de te mettre mon code tel qu'il se présente actuellement :
$sql1 = "SELECT * ". "FROM t_categorie_cat". " WHERE cat_code BETWEEN 100 AND 600";$sql_categorie = mysql_query($sql1) or die(mysql_error());$aCats = array();/** * On va stocker le résultat dans un tableau à partir duquel on travaillera plus loin. */while(false !== ($c = mysql_fetch_assoc($sql_categorie))){ $aCats[] = $c;}$nblignes = count($aCats); $sql2 = "SELECT ". " SUM(dtc_quantite) AS total,". " dtc_led_categorie ". "FROM v_stat_commande ". "GROUP BY dtc_code_categorie";$sql_stat = mysql_query($sql2) or die(mysql_error());$aStats = array();while(false !== ($s = mysql_fetch_assoc($sql_stat))){ $aStats[] = $s;}$nbstats = count($aStats); // 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); $mois = 1;//Premiere boucle Affichage des categoriesforeach($aStats as $s => $stat){ imagettftext($im,10,90,$mois*40,$hauteurImage-30,$coul_legendes,"arial.ttf",$aStats[$s]['dtc_led_categorie']); $mois=$mois+1;} ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);//Axe Verticalfor ($g = 0; $g <= 100; $g += 10){ Imagettftext($im, 10, 0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g); //Graduation verticale ImageLine ($im, 30, ($hauteurImage-30)-($g*3), 380, ($hauteurImage-30)-($g*3), $blanc); //Lignes blanches ImageLine ($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir); //Axe horizontal ImageLine ($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir); //Reperes graduation verticale} //Seconde boucle Affichage des Battons et de leur valeur$h = 1; // Decalage vertical$l = 60; // Decalage horizontalforeach($aStats as $s => $stat){ ImageRectangle ($im, $l+10, (($hauteurImage-30) - ($aStats[$s]['total'])*3), $l+20, $hauteurImage-30, $vert); Imagettftext ($im, 10, 0,($largeurImage-15)-($h*40),170,$coul_legendes,"arial.ttf",$aStats[$s]['total']); $h++; $l=$l+40;}/** * header déplacé pour permettre un débogage en amont. */header ("Content-type: image/png");ImagePng ($im);
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.
Voici normalement les valeurs que j'obtiens de MYSQL et leur categorie correspondante
20 No categorie36 Spots LED6 Ampoules dimmables7 Appliques LED14 Eclairage LED extérieur64 Spots dimmables18 Ampoules LED2 Spots industriels
Et voici ce que j'obtiens sur mon graphique
2 Spots LED Affichage baton : 2018 Ampoules dimmables Affichage baton : 3664 Appliques LED Affichage baton : 614 Eclairage LED extérieur Affichage baton : 77 Spots dimmables Affichage baton : 146 Ampoules LED Affichage baton : 6436 Spots industriels Affichage baton : 1820 No categorie Affichage baton : 2
Et voici ce que m'affichent les var_dump
Catégories :array(8) { [0]=> array(6) { ["cat_id"]=> string(1) "1" ["cat_code"]=> string(3) "100" ["cat_nom"]=> string(9) "Spots LED" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(2) "SP" } [1]=> array(6) { ["cat_id"]=> string(1) "2" ["cat_code"]=> string(3) "110" ["cat_nom"]=> string(15) "Spots dimmables" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(3) "SDI" } [2]=> array(6) { ["cat_id"]=> string(1) "3" ["cat_code"]=> string(3) "200" ["cat_nom"]=> string(12) "Ampoules LED" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(2) "AP" } [3]=> array(6) { ["cat_id"]=> string(1) "4" ["cat_code"]=> string(3) "210" ["cat_nom"]=> string(18) "Ampoules dimmables" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(3) "ADI" } [4]=> array(6) { ["cat_id"]=> string(1) "5" ["cat_code"]=> string(3) "300" ["cat_nom"]=> string(17) "Spots industriels" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(2) "SI" } [5]=> array(6) { ["cat_id"]=> string(1) "6" ["cat_code"]=> string(3) "400" ["cat_nom"]=> string(13) "Appliques LED" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(3) "APL" } [6]=> array(6) { ["cat_id"]=> string(1) "7" ["cat_code"]=> string(3) "500" ["cat_nom"]=> string(24) "Eclairage LED extérieur" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(2) "EX" } [7]=> array(6) { ["cat_id"]=> string(1) "8" ["cat_code"]=> string(3) "600" ["cat_nom"]=> string(15) "Accessoires LED" ["cat_nom_nl"]=> NULL ["cat_nom_gb"]=> NULL ["cat_code_cat"]=> string(2) "AC" }}Données statistiques :array(8) { [0]=> array(2) { ["total"]=> string(2) "20" ["dtc_led_categorie"]=> string(0) "" } [1]=> array(2) { ["total"]=> string(2) "36" ["dtc_led_categorie"]=> string(9) "Spots LED" } [2]=> array(2) { ["total"]=> string(1) "6" ["dtc_led_categorie"]=> string(18) "Ampoules dimmables" } [3]=> array(2) { ["total"]=> string(1) "7" ["dtc_led_categorie"]=> string(13) "Appliques LED" } [4]=> array(2) { ["total"]=> string(2) "14" ["dtc_led_categorie"]=> string(24) "Eclairage LED extérieur" } [5]=> array(2) { ["total"]=> string(2) "64" ["dtc_led_categorie"]=> string(15) "Spots dimmables" } [6]=> array(2) { ["total"]=> string(2) "18" ["dtc_led_categorie"]=> string(12) "Ampoules LED" } [7]=> array(2) { ["total"]=> string(1) "2" ["dtc_led_categorie"]=> string(17) "Spots industriels" }}
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é ... ??
Oui, en effet, cette première requete ne sert plus dutout à rien. Je ne l'utilise plus dutout
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 ;)
Ok, voilà ce que j'ai trouvé, je commence avec ton code :
<?php
/*
$sql2 = "SELECT ".
" SUM(dtc_quantite) AS total,".
" dtc_led_categorie ".
"FROM v_stat_commande ".
"GROUP BY dtc_code_categorie";
$sql_stat = mysql_query($sql2) or die(mysql_error());
$aStats = array();
while(false !== ($s = mysql_fetch_assoc($sql_stat)))
{
$aStats[] = $s;
}
$nbstats = count($aStats);
*/
$aStats = array (
array (
"total" => 20,
"dtc_led_categorie" => "Divers",
),
array (
"total" => 36,
"dtc_led_categorie" => "Spots LED",
),
array (
"total" => 6,
"dtc_led_categorie" => "Ampoules dimmables",
),
array (
"total" => 7,
"dtc_led_categorie" => "Appliques LED",
),
array (
"total" => 14,
"dtc_led_categorie" => "Eclairage LED extérieur",
),
array (
"total" => 64,
"dtc_led_categorie" => "Spots dimmables",
),
array (
"total" => 18,
"dtc_led_categorie" => "Ampoules LED",
),
array (
"total" => 2,
"dtc_led_categorie" => "Spots industriels",
)
);
// 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);
/**
* Traçage de l'image de fond
*/
ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir);//Axe Vertical
for ($g = 0; $g <= 100; $g += 10)
{
Imagettftext($im, 10, 0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g); // Graduation verticale
ImageLine($im, 30, ($hauteurImage-30)-($g*3), 380, ($hauteurImage-30)-($g*3), $blanc); // Lignes blanches
ImageLine($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir); // Axe horizontal
ImageLine($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir); // Reperes graduation verticale
}
// Traçage des Bâtons et de leur valeurs
$h = 1; // Décalage vertical
$l = 60; // Décalage horizontal
$mois = 1;
$font = "arial.ttf";
foreach($aStats as $s => $stat)
{
$im_rect_x1 = $l + 10;
$im_rect_x2 = $l + 20;
$im_rect_y2 = $hauteurImage - 30;
// $im_txt_x = ($largeurImage - 15) - ($h * 40);
$im_txt_x = $l + 10;
$im_txt_y = 170;
$im_rect_y1 = (($hauteurImage - 30) - ((int)$aStats[$s]['total']) * 3);
$im_txt2_x = ($mois * 40) + 25;
$im_txt2_y = $hauteurImage - 30;
ImageRectangle($im, $im_rect_x1, $im_rect_y1, $im_rect_x2, $im_rect_y2, $vert);
Imagettftext($im, 10, 0, $im_txt1_x, $im_txt1_y, $coul_legendes, $font, $aStats[$s]['total']);
imagettftext($im, 10, 90, $im_txt2_x, $im_txt2_y, $coul_legendes, $font, $aStats[$s]['dtc_led_categorie']);
$h++;
$l += 40;
$mois++;
}
/**
* header déplacé pour permettre un débogage en amont.
*/
header ("Content-type: image/png");
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 ;)
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 !
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?
// Requete$sql2 = "SELECT ". " SUM(dtc_quantite) AS total,". " dtc_led_categorie ". "FROM v_stat_commande ". "GROUP BY dtc_code_categorie";$sql_stat = mysql_query($sql2) or die(mysql_error());$aStats = array();// On place les donnees recuperees de la requete dans un tableauwhile(false !== ($s = mysql_fetch_assoc($sql_stat))){ $aStats[] = $s;}$nbstats = count($aStats); // Calcul nombre de resultats obtenus // Création de l image avec dimensions donnees (largeur/hauteur)$largeurImage = 600;$hauteurImage = 400;$im = ImageCreate ($largeurImage, $hauteurImage) or die ("Erreur lors de la création de l'image"); // On defini les couleurs qui seront utilisees$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);// Couleur des barres du graphique $coul_barre1 = ImageColorAllocate ($im, 42, 124, 94); $coul_barre2 = ImageColorAllocate ($im, 0, 90, 94); $coul_barre3 = ImageColorAllocate ($im, 0, 38, 131); $coul_barre4 = ImageColorAllocate ($im, 100, 38, 131); $coul_barre5 = ImageColorAllocate ($im, 165, 38, 131); /** * Traçage de l'image de fond */ImageLine ($im, 30, 10, 30, $hauteurImage-30, $noir); //Axe VerticalImageLine ($im, 30, $hauteurImage-30, $largeurImage-20, $hauteurImage-30, $noir); // Axe horizontalfor ($g = 10; $g <= 100; $g += 10){ Imagettftext($im, 10, 0,5,($hauteurImage-25)-($g*3),$coul_legendes,"arial.ttf",$g); // Graduation verticale ImageLine($im, 30, ($hauteurImage-30)-($g*3), 380, ($hauteurImage-30)-($g*3), $blanc); // Lignes blanches ImageLine($im, 25, ($hauteurImage-30)-($g*3), 30, ($hauteurImage-30)-($g*3), $noir); // Reperes graduation verticale} // Traçage des Bâtons et de leur valeurs$h = 1; // Décalage vertical$l = 60; // Décalage horizontal$mois = 1;$font = "arial.ttf";foreach($aStats as $s => $stat){ // On déclare les variables de position pour les batons $im_rect_x1 = $l + 10; // En x1 la valeur est fixe $im_rect_y1 = (($hauteurImage - 30) - ((int)$aStats[$s]['total']) * 3); // En y1 la valeur depend de la BD $im_rect_x2 = $l + 20; // En x2 la valeur est fixe $im_rect_y2 = $hauteurImage - 30; // En y2 la valeur est fixe // On déclare les variables de position pour le texte $im_txt1_x = $l + 10; $im_txt1_y = 170; $im_txt2_x = ($mois * 40) + 25; $im_txt2_y = $hauteurImage - 30; $coul_barre = $coul_barre.'".$mois."'; ImageFilledRectangle($im, $im_rect_x1, $im_rect_y1, $im_rect_x2, $im_rect_y2, $coul_barre); Imagettftext($im, 10, 0, $im_txt1_x, $im_txt1_y, $coul_legendes, $font, $aStats[$s]['total']); Imagettftext($im, 10, 90, $im_txt2_x, $im_txt2_y, $coul_legendes, $font, $aStats[$s]['dtc_led_categorie']); $h++; $l += 40; $mois++;}/** * header déplacé pour permettre un débogage en amont. */header ("Content-type: image/png");ImagePng ($im);
Problème de création de variable dynamique.
Tu as écrit :
$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 :
$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 :
$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.
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 !