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

Rechercher

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

Par paintbox  -  15 reponses  -  Le 12/04/2011 16:27  -  Editer  - 

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

Par Cyrano  -  Le 12/04/2011 17:31  -  Haut de page  - 

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 :

  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 17:45  -  Haut de page  - 

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 17:01  -  Haut de page  - 

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 17:05  -  Haut de page  - 

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);
 
Par Cyrano  -  Le 13/04/2011 17:07  -  Haut de page  - 

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 17:22  -  Haut de page  - 

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
 
Par paintbox  -  Le 13/04/2011 17:25  -  Haut de page  - 

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"  }}

 

 
Par Cyrano  -  Le 13/04/2011 17:28  -  Haut de page  - 

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 17:40  -  Haut de page  - 

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

 
Par Cyrano  -  Le 13/04/2011 17:41  -  Haut de page  - 

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 18:03  -  Haut de page  - 

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 ;)

 
Par paintbox  -  Le 14/04/2011 10:28  -  Haut de page  - 

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 11:20  -  Haut de page  - 

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);

 

 
Par Cyrano  -  Le 14/04/2011 11:31  -  Haut de page  - 

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.

 
Par paintbox  -  Le 14/04/2011 12:03  -  Haut de page  - 

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 !

 

Ajouter une réponse à la discussion

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

Identifiez-vous
Join |  ID/MDP? |