[resolu] JpGraph et MySQL

JpGraph et MySQL [resolu] - PHP - Programmation

Marsh Posté le 17-09-2007 à 19:40:50    

Bonjour,
j'ai un souci avec un script qui génère un graphique via JPgraph
Ce script fonctionne, mais il affiche seulement la dernière ligne de valeurs,
alors que chaque ligne est créé dans la boucle  :pt1cable:  
 
voici le script :

Code :
  1. <?php
  2. include ('jpgraph/src/jpgraph.php');
  3. include ('jpgraph/src/jpgraph_line.php');
  4. // Callback to negate the argument
  5. function _cb_negate($aVal) {
  6.     return round(-$aVal);
  7. }
  8. //taille de l'image
  9. $sql_width = 'SELECT max(id) FROM `prono_historique`';
  10. $Valide_width = mysql_query($sql_width, $Connexion) or die ("Requète <b><i>".$sql_width."</i></b> invalide" );
  11.    
  12.     //Recuperation des resultats
  13.     while ($val_width=mysql_fetch_row($Valide_width))
  14.     {
  15.      $width = 60 * ($val_width[0]);
  16.     }
  17. $color_line_RGB = Array(
  18. "#FF0033","#993366","#CC00CC","#9900FF","#330066","#009999",
  19. "#00CC00","#000000","#999900","#FF9900","#FF3333","#999999","#666666","#999966" );
  20. // Setup the graph
  21. $graph = new Graph($width,480);
  22. $graph->SetMarginColor('#CCCCFF');
  23. $graph->SetScale("textlin" );
  24. $graph->SetFrame(false);
  25. $graph->SetMargin(50,50,30,30);
  26. $graph->tabtitle->Set('Statistiques des Joueurs :' );
  27. $graph->tabtitle->SetWidth(TABTITLE_WIDTHFIT);
  28. $graph->tabtitle->SetColor('black','#EFEFFF','#CCCCFF');
  29. $graph->ygrid->SetFill(true,'#EFEFFF','#fdfdff');
  30. $graph->ygrid->SetColor('#CCCCFF');
  31. $graph->xgrid->SetColor('#CCCCFF');
  32. $graph->xgrid->Show();
  33. // les données ...
  34. $sql_id = "SELECT id, nom
  35. FROM `prono_historique`
  36. GROUP BY nom
  37. ORDER BY `classement` ASC";
  38. $Valide_id = mysql_query($sql_id, $Connexion) or die ("Requète <b><i>".$sql_id."</i></b> invalide" );
  39. $tab_month = array(1=>"Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aou", "Sep", "Oct", "Nov", "Dec" );
  40. $comb=1;
  41. //Recuperation des resultats
  42. while ($val_ID=mysql_fetch_row($Valide_id))
  43. {
  44. $id = $val_ID[0];
  45. $nom = $val_ID[1];
  46. $val_pts = array(); //remet le tableau a zero
  47.     $sql_pts = 'SELECT id, nom, classement, date FROM `prono_historique` WHERE nom="'.$nom.'" ORDER BY `id` ASC';
  48.     $Valide_pts = mysql_query($sql_pts, $Connexion) or die ("Requète <b><i>".$sql_pts."</i></b> invalide" );
  49.    
  50. $date_maj = array();
  51.     //Recuperation des resultats
  52.     while ($array_pts=mysql_fetch_array($Valide_pts))
  53.      {
  54.      $val_pts[]="-".$array_pts["classement"];
  55. //       if(!isset($date_aff)) {
  56.           $tab_dmy = explode('-', $array_pts[3]);
  57.           $day = date("w", mktime(0, 0, 0, $tab_dmy[1], $tab_dmy[2], $tab_dmy[0]));
  58.           $date_aff = $tab_dmy[2]." ";
  59.           settype($tab_dmy[1], "int" );
  60.           $date_aff .= $tab_month[$tab_dmy[1]];
  61.      
  62.         $date_maj[]=$date_aff;
  63. //        }
  64.     }
  65.         // Creation de la ligne
  66.         $line = new LinePlot($val_pts);
  67.         $lacouleurdeLigne = array_rand ($color_line_RGB, 2);
  68.         $lacouleur = $color_line_RGB[$lacouleurdeLigne[0]];
  69.         $line->SetColor($lacouleur);
  70.         $line->SetLegend($nom);
  71. //        $line->SetLegend("#000000" );
  72.    $line->SetWeight(1);
  73.    $line->value->Show(true);
  74.         $line->value->SetFormat($nom);
  75.         $line->value->SetMargin(-15);
  76.         $line->SetFillFromYMin();
  77.         $graph->Add($line);
  78.     $comb++;
  79. }
  80. //legend des X  
  81. $graph->xaxis->SetTickLabels($date_maj);
  82. $graph->xaxis->SetLabelSide(SIDE_DOWN);
  83. $graph->xaxis->SetPos('min');
  84. $graph->xaxis->SetColor('#CCCCFF', '#DD8000');
  85. //les axes Y
  86. //$graph->yaxis->title->Set("Places", "low" );
  87. $graph->yaxis->HideZeroLabel();
  88. $graph->yaxis->SetLabelMargin(25);
  89. $graph->yaxis->SetLabelFormatCallback("_cb_negate" ); //supprime les -
  90. $graph->yaxis->SetColor('#CCCCFF', '#DD8000');
  91. //$graph->yaxis->Hide();
  92. //pas de legend
  93. $graph->legend->Hide();
  94. // Output line
  95. $graph->Stroke("stats_prono.png" );
  96. ?>
  97. <img src="stats_prono.png" border="0">
  98. <br />
  99. <?PHP
  100. echo $comb;
  101. ?>


Message édité par ParMesSoins le 19-09-2007 à 16:47:32
Reply

Marsh Posté le 17-09-2007 à 19:40:50   

Reply

Marsh Posté le 18-09-2007 à 10:49:49    

Je crois que c'est parce que ton objet $line est écrasé en mémoire à chaque tour de boucle (bien que t'aies fait un add()). J'ai eu le même pb. J'ai remplacé $graph->Add($line); par $ArrayLines[] = $line;
Et pour afficher :
foreach($ArrayLines as $i => $Currentline) {
    $graph->Add($Currentline);
}
 
C'est à insérer, par ex, avant //legend des X
 
ps : y'a Artishow comme lib graphique pour php qui fait une bonne partie de ce que fait JPGraph, sauf que celle-ci est GPL ;)


Message édité par rufo le 18-09-2007 à 10:50:49
Reply

Marsh Posté le 18-09-2007 à 20:30:17    

Merci bien pour ton aide ... je test !
Pour Artishow, j'ai tenté la bascule... mais je trouve la doc tres limite, toutes les fonctions y sont, mais c'est tout.
Comme chacun sait, rien de tel qu'un bon exemple et la dessus JPgraph est fortich !
dans l'urgence, je reste là-dessus, mais promis, je basculerai ;)

Reply

Marsh Posté le 18-09-2007 à 20:44:10    

Bon le résultat est le même ... ça ne marche tjrs pas ...Bizarre !
de plus l'affichage du tableau donne bien :

Code :
  1. Object
  2. Object
  3. Object
  4. Object
  5. Object
  6. Object
  7. Object
  8. Object
  9. Object
  10. Object
  11. Object
  12. Object
  13. Object
  14. Object
  15. Object
  16. Object
  17. Object
  18. Object
  19. Object
  20. Object
  21. Object


 
voici le code modifié avec tes conseils

Code :
  1. <?php
  2. include ('jpgraph/src/jpgraph.php');
  3. include ('jpgraph/src/jpgraph_line.php');
  4. // Callback to negate the argument
  5. function _cb_negate($aVal) {
  6.     return round(-$aVal);
  7. }
  8. //taille de l'image
  9. $sql_width = 'SELECT max(id) FROM `prono_historique`';
  10. $Valide_width = mysql_query($sql_width, $Connexion) or die ("Requète <b><i>".$sql_width."</i></b> invalide" );
  11.    
  12.     //Recuperation des resultats
  13.     while ($val_width=mysql_fetch_row($Valide_width))
  14.     {
  15.      $width = 60 * ($val_width[0]);
  16.     }
  17. $color_line_RGB = Array(
  18. "#FF0033","#993366","#CC00CC","#9900FF","#330066","#009999",
  19. "#00CC00","#000000","#999900","#FF9900","#FF3333","#999999","#666666","#999966" );
  20. // Setup the graph
  21. $graph = new Graph($width,480);
  22. $graph->SetMarginColor('#CCCCFF');
  23. $graph->SetScale("textlin" );
  24. $graph->SetFrame(false);
  25. $graph->SetMargin(50,50,30,30);
  26. $graph->tabtitle->Set('Statistiques des Joueurs :' );
  27. $graph->tabtitle->SetWidth(TABTITLE_WIDTHFIT);
  28. $graph->tabtitle->SetColor('black','#EFEFFF','#CCCCFF');
  29. $graph->ygrid->SetFill(true,'#EFEFFF','#fdfdff');
  30. $graph->ygrid->SetColor('#CCCCFF');
  31. $graph->xgrid->SetColor('#CCCCFF');
  32. $graph->xgrid->Show();
  33. // les données ...
  34. $sql_id = "SELECT id, nom
  35. FROM `prono_historique`
  36. GROUP BY nom
  37. ORDER BY `classement` ASC";
  38. $Valide_id = mysql_query($sql_id, $Connexion) or die ("Requète <b><i>".$sql_id."</i></b> invalide" );
  39. $tab_month = array(1=>"Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aou", "Sep", "Oct", "Nov", "Dec" );
  40. $comb=1;
  41. $ArrayLines = array();
  42. //Recuperation des resultats
  43. while ($val_ID=mysql_fetch_row($Valide_id))
  44. {
  45. $id = $val_ID[0];
  46. $nom = $val_ID[1];
  47. $val_pts = array(); //remet le tableau a zero
  48.     $sql_pts = 'SELECT id, nom, classement, date FROM `prono_historique` WHERE nom="'.$nom.'" ORDER BY `id` ASC';
  49.     $Valide_pts = mysql_query($sql_pts, $Connexion) or die ("Requète <b><i>".$sql_pts."</i></b> invalide" );
  50.    
  51. $date_maj = array();
  52.     //Recuperation des resultats
  53.     while ($array_pts=mysql_fetch_array($Valide_pts))
  54.      {
  55.      $val_pts[]="-".$array_pts["classement"];
  56. //       if(!isset($date_aff)) {
  57.           $tab_dmy = explode('-', $array_pts[3]);
  58.           $day = date("w", mktime(0, 0, 0, $tab_dmy[1], $tab_dmy[2], $tab_dmy[0]));
  59.           $date_aff = $tab_dmy[2]." ";
  60.           settype($tab_dmy[1], "int" );
  61.           $date_aff .= $tab_month[$tab_dmy[1]];
  62.      
  63.         $date_maj[]=$date_aff;
  64. //        }
  65.     }
  66.         // Creation de la ligne
  67.         $line = new LinePlot($val_pts);
  68.         $lacouleurdeLigne = array_rand ($color_line_RGB, 2);
  69.         $lacouleur = $color_line_RGB[$lacouleurdeLigne[0]];
  70.         $line->SetColor($lacouleur);
  71.         $line->SetLegend($nom);
  72. //        $line->SetLegend("#000000" );
  73.    $line->SetWeight(1);
  74.    $line->value->Show(true);
  75.         $line->value->SetFormat($nom);
  76.         $line->value->SetMargin(-15);
  77.         $line->SetFillFromYMin();
  78.    $ArrayLines[] = $line;
  79. //        $graph->Add($line);
  80.     $comb++;
  81. }
  82. //legend des X  
  83. $graph->xaxis->SetTickLabels($date_maj);
  84. $graph->xaxis->SetLabelSide(SIDE_DOWN);
  85. $graph->xaxis->SetPos('min');
  86. $graph->xaxis->SetColor('#CCCCFF', '#DD8000');
  87. //les axes Y
  88. //$graph->yaxis->title->Set("Places", "low" );
  89. $graph->yaxis->HideZeroLabel();
  90. $graph->yaxis->SetLabelMargin(25);
  91. $graph->yaxis->SetLabelFormatCallback("_cb_negate" ); //supprime les -
  92. $graph->yaxis->SetColor('#CCCCFF', '#DD8000');
  93. //$graph->yaxis->Hide();
  94. //pas de legend
  95. $graph->legend->Hide();
  96. foreach($ArrayLines as $i => $Currentline) {
  97.     $graph->Add($Currentline);
  98. }
  99. // Output line
  100. $graph->Stroke("stats_prono.png" );
  101. ?>
  102. <img src="stats_prono.png" border="0">
  103. <br />
  104. <?PHP
  105. echo $comb;
  106. foreach ( $ArrayLines as $contenu ){
  107. print $contenu.'<br />';
  108. }
  109. ?>


 
je suis presque sur que cela à fonctionner un temps, j'ai du mettre à jour depuis  :??:  
un id ?

Reply

Marsh Posté le 18-09-2007 à 21:04:26    

la doc pour $graph->Add() dit ça :

Code :
  1. Note that since the plot is added as a reference any changes you make to the original plot will also happen to the plot you have added to the graph.


 
ça veut dire quoi en fait ?
je sais pas pourquoi, mais je sent que le problème vient de là  :ange:

Reply

Marsh Posté le 19-09-2007 à 09:05:00    

J'avais un doute sur ma méthode. Donc faut remplacer :
$line = new LinePlot($val_pts);  
par $ArrayLines[$i] = new LinePlot($val_pts);
-> dans ta boucle, oublies pas $i++;
Faut aussi virer $ArrayLines[] = $line; et remplacer tous les $line par $ArrayLines[$i]
 
puis remplacer  
foreach($ArrayLines as $i => $Currentline) {
   $graph->Add($Currentline);
}  
 
foreach($ArrayLines as $i => $Currentline) {
   $graph->Add($ArrayLines[$i]);
}  
 
Ca devrait le faire, je pense.

Reply

Marsh Posté le 19-09-2007 à 10:30:14    

ParMesSoins a écrit :

la doc pour $graph->Add() dit ça :

Code :
  1. Note that since the plot is added as a reference any changes you make to the original plot will also happen to the plot you have added to the graph.


 
ça veut dire quoi en fait ?
je sais pas pourquoi, mais je sent que le problème vient de là  :ange:


Ca veut dire en gros que la fonction "add" ne fait pas une copie de l'objet passé en paramètre mais crée un pointeur sur cet objet. Du coup si tu modifies cet objet (ce que fait le "foreach" ) tu modifies celui que $graph connait.
 
En résumé, au départ tu t'embêtais à enregistrer toute une série de pointeur qui désignaient tous la même chose et tu te retrouvais donc avec toute une série d'éléments parfaitement identique puisque étant le même élément.

Reply

Marsh Posté le 19-09-2007 à 16:45:07    

Merci, ça marche nickel !
par contre, le principe ne me plait gère !
c'est beaucoup plus simple avec Artishow !
je vais m'y mettre !
Merci à vous  :jap:  
 
pour ceux que ça peut depanner, voici le code correct :

Code :
  1. <?php
  2. include ('/jpgraph/src/jpgraph.php');
  3. include ('/jpgraph/src/jpgraph_line.php');
  4. // Callback to negate the argument
  5. function _cb_negate($aVal) {
  6.     return round(-$aVal);
  7. }
  8. //taille de l'image
  9. $sql_width = 'SELECT max(id) FROM `prono_historique`';
  10. $Valide_width = mysql_query($sql_width, $Connexion) or die ("Requète <b><i>".$sql_width."</i></b> invalide" );
  11.    
  12.     //Recuperation des resultats
  13.     while ($val_width=mysql_fetch_row($Valide_width))
  14.     {
  15.      $width = 60 * ($val_width[0]);
  16.     }
  17. $color_line_RGB = Array(
  18. "#FF0033","#993366","#CC00CC","#9900FF","#330066","#009999",
  19. "#00CC00","#000000","#999900","#FF9900","#FF3333","#999999","#666666","#999966" );
  20. // Setup the graph
  21. $graph = new Graph($width,480);
  22. $graph->SetMarginColor('#CCCCFF');
  23. $graph->SetScale("textlin" );
  24. $graph->SetFrame(false);
  25. $graph->SetMargin(50,50,30,30);
  26. $graph->tabtitle->Set('Statistiques des Joueurs :' );
  27. $graph->tabtitle->SetWidth(TABTITLE_WIDTHFIT);
  28. $graph->tabtitle->SetColor('black','#EFEFFF','#CCCCFF');
  29. $graph->ygrid->SetFill(true,'#EFEFFF','#fdfdff');
  30. $graph->ygrid->SetColor('#CCCCFF');
  31. $graph->xgrid->SetColor('#CCCCFF');
  32. $graph->xgrid->Show();
  33. // les données ...
  34. $sql_id = "SELECT id, nom
  35. FROM `prono_historique`
  36. GROUP BY nom
  37. ORDER BY `classement` ASC";
  38. $Valide_id = mysql_query($sql_id, $Connexion) or die ("Requète <b><i>".$sql_id."</i></b> invalide" );
  39. $tab_month = array(1=>"Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aou", "Sep", "Oct", "Nov", "Dec" );
  40. $ArrayLines = array();
  41. $i=0;
  42. //Recuperation des resultats
  43. while ($val_ID=mysql_fetch_row($Valide_id))
  44. {
  45. $id = $val_ID[0];
  46. $nom = $val_ID[1];
  47. $val_pts = array(); //remet le tableau a zero
  48.     $sql_pts = 'SELECT id, nom, classement, date FROM `prono_historique` WHERE nom="'.$nom.'" ORDER BY `id` ASC';
  49.     $Valide_pts = mysql_query($sql_pts, $Connexion) or die ("Requète <b><i>".$sql_pts."</i></b> invalide" );
  50.    
  51. $date_maj = array();
  52.     //Recuperation des resultats
  53.     while ($array_pts=mysql_fetch_array($Valide_pts))
  54.      {
  55.      $val_pts[]="-".$array_pts["classement"];
  56.           $tab_dmy = explode('-', $array_pts[3]);
  57.           $day = date("w", mktime(0, 0, 0, $tab_dmy[1], $tab_dmy[2], $tab_dmy[0]));
  58.           $date_aff = $tab_dmy[2]." ";
  59.           settype($tab_dmy[1], "int" );
  60.           $date_aff .= $tab_month[$tab_dmy[1]];
  61.         $date_maj[]=$date_aff;
  62.     }
  63.         // Creation de la ligne
  64.         $ArrayLines[$i] = new LinePlot($val_pts);
  65.         $lacouleurdeLigne = array_rand ($color_line_RGB, 2);
  66.         $lacouleur = $color_line_RGB[$lacouleurdeLigne[0]];
  67.         $ArrayLines[$i]->SetColor($lacouleur);
  68.         $ArrayLines[$i]->SetLegend($nom);
  69. $ArrayLines[$i]->SetWeight(1);
  70. $ArrayLines[$i]->value->Show(true);
  71.         $ArrayLines[$i]->value->SetFormat($nom);
  72.         $ArrayLines[$i]->value->SetMargin(-15);
  73.         $ArrayLines[$i]->SetFillFromYMin();
  74.     $i++;
  75. }
  76. //dessine les lignes
  77. foreach($ArrayLines as $i => $Currentline) {
  78.    $graph->Add($ArrayLines[$i]);
  79. }
  80. //legend des X  
  81. $graph->xaxis->SetTickLabels($date_maj);
  82. $graph->xaxis->SetLabelSide(SIDE_DOWN);
  83. $graph->xaxis->SetPos('min');
  84. $graph->xaxis->SetColor('#CCCCFF', '#DD8000');
  85. //les axes Y
  86. $graph->yaxis->HideZeroLabel();
  87. $graph->yaxis->SetLabelMargin(25);
  88. $graph->yaxis->SetLabelFormatCallback("_cb_negate" ); //supprime les -
  89. $graph->yaxis->SetColor('#CCCCFF', '#DD8000');
  90. //pas de legend
  91. $graph->legend->Hide();
  92. // Output line
  93. $graph->Stroke("stats_prono.png" );
  94. ?>
  95. <img src="stats_prono.png" border="0">

Reply

Marsh Posté le 20-09-2007 à 08:50:24    

c'est entre autre pour ça que j'ai changé dans une appli intranet (passage de jpgraph à artishow) et aussi parce que c'est GPL.
Par contre, attention, artishow ne gère pas les histogrammes empilés (enfin, pas dans la version qui date d'1 an, j'ai pas regardé depuis). Mais c'est assez facile de les émuler : en fait, il suffit, pour chaque histo de cumuler les effectifs et de dessiner le plus grand histo en 1er et le plus petit en dernier.
Ex: t'as 2 séries de valeurs
    + Val1 + Val2
T1 |  3    |  2  
T2 |  1    |  7
T3 |  4    |  4
 
Tx est en abscisse. Pour faire un histo empilé où les valeurs de Val1 sont en bas et celles de Val2 en haut, tu recalcules Val2 = Val1 + Val2 puis tu dessines le nouveau Val2 en premier puis par-dessus, Val1 et le tour est joué ;)
La technique marche bien entendu avec 3 valeurs. Là, tu fais
Val3 = Val1 + Val2 + Val3
Val2 = Val1 + Val2

Reply

Marsh Posté le 22-09-2007 à 17:12:55    

J'avais fait un test et ça marchait bien coté code, c'est plus coté apparence que ça ne me plaisait pas ...
j'y retourne et mettrai mon code ici pour un résultat équivalent à celui ci-dessus !
Shuusss !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed