Problème de connection Jpgraph avec MySQL

Problème de connection Jpgraph avec MySQL - PHP - Programmation

Marsh Posté le 09-02-2016 à 12:20:10    

Bonjour à tous,
 
Je suis nouveau, merci de m'accueillir, je m'amuse à essayer de comprendre comment marchent les graphs Jpgraph en les alimentant avec MySQL, je commence simple mais je bloque déjà...Si vous pouviez m'aider, cela serait cool !
 
Donc j'ai crée une petite base avec les colonnes suivantes Year et les quarters Q1,Q2,Q3,Q4
 
Year  Q1    Q2    Q3   Q4  
2013 16.2 19.4 18.2 18.6  
2014 17.2 20    19.5 19  
2015 18.7 21    19.9  
 
Et le code correspondant, je suis en local, j'utilise wampserver pour la base, $datay1 correspond aux données récupérées dans la base, l'idée étant de concaténer Q1, Q2, Q3 et Q4, j'ai laissé $datay2 et $datay3 comme dans l'exemple Jpgraph pour se rendre compte de ce qu'on doit atteindre comme résultat.
 

Code :
  1. <?php // content="text/plain; charset=utf-8"
  2. require_once ('jpgraph/jpgraph.php');
  3. require_once ('jpgraph/jpgraph_line.php');
  4. try
  5. {
  6. $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
  7. }
  8. catch (Exception $e)
  9. {
  10.         die('Erreur : ' . $e->getMessage());
  11. }
  12. $datay1 = array();
  13. $reponse = $bdd->query ("SELECT CONCAT(Q1,',',Q2,',',Q3,',',Q4) as img FROM ps WHERE Year='2015'" );
  14. $donnees = $reponse->fetch();
  15. $datay1 = $donnees['img'];
  16. $datay2 = array(12,9,42,8);
  17. $datay3 = array(5,17,32,24);
  18. //$reponse = $bdd->query ("SELECT CONCAT(Q1,',',Q2,',',Q3,',',Q4) as img2 FROM `psa peugeot citroen` WHERE Year='2014'" );
  19. //while ($donnees = $reponse->fetch()):  
  20. //$datay2 = ($donnees['img2']);
  21. //endwhile;  
  22. //$reponse = $bdd->query ("SELECT CONCAT(Q1,',',Q2,',',Q3,',',Q4) as img3 FROM `psa peugeot citroen` WHERE Year='2013'" );
  23. //while ($donnees = $reponse->fetch()):  
  24. //$datay3 = ($donnees['img3']);
  25. //endwhile;  
  26. //$datay1 = array($donnee1);
  27. //$datay2 = array($donnee2);
  28. //$datay3 = array($donnee3);
  29. // Setup the graph
  30. $graph = new Graph(400,280);
  31. $graph->SetScale('textint');
  32. $theme_class=new UniversalTheme;
  33. $graph->SetTheme($theme_class);
  34. $graph->img->SetAntiAliasing(false);
  35. $graph->title->SetFont(FF_ARIAL,FS_NORMAL,14);
  36. $graph->title->Set('Worldwide Sales');
  37. $graph->subtitle->SetFont(FF_ARIAL,FS_NORMAL,10);
  38. $graph->subtitle->Set('(in million units)');
  39. $graph->SetBox(false);
  40. $graph->img->SetAntiAliasing(false);
  41. $graph->yaxis->HideZeroLabel();
  42. $graph->yaxis->HideLine(true);
  43. $graph->yaxis->HideTicks(true,true);
  44. $graph->yaxis->scale->SetGrace(10);
  45. $graph->xgrid->Show();
  46. $graph->xgrid->SetLineStyle("dashed" );
  47. $graph->xaxis->SetTickLabels(array('Q1','Q2','Q3','Q4'));
  48. $graph->ygrid->SetFill(true,'#FFFFFF@0.5','#FFFFFF@0.5');
  49. $graph->xaxis->HideLine(true);
  50. $graph->xaxis->HideTicks(true,true);
  51. $graph->xaxis->SetLabelMargin(10);
  52. // Create the first line
  53. $p1 = new LinePlot($datay1);
  54. $graph->Add($p1);
  55. $p1->SetColor("#fbe6d7" );
  56. $p1->SetLegend('2013');
  57. // Create the second line
  58. $p2 = new LinePlot($datay2);
  59. $graph->Add($p2);
  60. $p2->SetColor("#f4b183" );
  61. $p2->SetLegend('2014');
  62. // Create the third line
  63. $p3 = new LinePlot($datay3);
  64. $graph->Add($p3);
  65. $p3->SetColor("#c55a11" );
  66. $p3->SetLegend('YTD (2015)');
  67. $graph->legend->SetFrameWeight(0);
  68. // Output line
  69. $graph->Stroke();
  70. ?>


 
Mon problème est que jpgraph n'affiche que les courbes de $data2 et $data3 mais rien pour $data1...
Si je teste la partie requête de $datay1, j'obtiens bien 18.7,21,19.9,0, je ne comprend pas ce qui se passe...
Aussi, comment fait on pour ne pas afficher 0 lorsque le champ n'est pas rempli ?
Merci par avance de votre aide !


Message édité par franck2015 le 09-02-2016 à 12:36:39
Reply

Marsh Posté le 09-02-2016 à 12:20:10   

Reply

Marsh Posté le 09-02-2016 à 13:37:37    

Fait un print_r($datay1). Je ne pense pas que les données soit structurées comme tu le penses (je vois pas de boucle de récup des données) :/
 
Tu devrais commencer avec des graphs sans BD, ça complique inutilement tes essais. Quand tu maîtriseras JPGraph, tu iras cherches les valeurs en BD.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-02-2016 à 13:51:41    

Merci de ton aide, si j'insère un print_r($datay1) dans le code, le png ne se génère plus alors qu'on prenant un script isolé de requête MySQL, j'ai bien ma concaténation de champs.
Au début, j'utilisais une boucle while mais cela ne changeait rien, je l'ai éliminé pour simplifier le code de manière à mieux comprendre où cela pouvait bugger.  
 
J'ai bien compris le principe de JpGraph, mais c'est véritablement la connexion entre MySQL et JpGraph qui ne marche pas
 
l'idée étant que  

Code :
  1. $datay1 = array();
  2. $reponse = $bdd->query ("SELECT CONCAT(Q1,',',Q2,',',Q3,',',Q4) as img FROM ps WHERE Year='2015'" );
  3. $donnees = $reponse->fetch();
  4. $datay1 = $donnees['img'];


 
Corresponde à
 

Code :
  1. $datay1 =array(18.7,21,19.9);


 

Reply

Marsh Posté le 09-02-2016 à 14:38:58    

Et si tu insères :

Code :
  1. var_dump($donnees);
  2. exit();


entre ta ligne 17 et 18 ?


---------------
D3
Reply

Marsh Posté le 09-02-2016 à 14:43:52    

j'obtiens ca
 
array (size=2)
  'img' => string '18.7,21,19.9,0' (length=14)
  0 => string '18.7,21,19.9,0' (length=14)
 
et en insérant ligne 19

Code :
  1. var_dump($datay1);
  2. exit();


 
J'obtiens bien
string '18.7,21,19.9,0' (length=14)
 
Est ce que cela serait au niveau du array que ca plante ?
 
Merci !


Message édité par franck2015 le 09-02-2016 à 14:51:39
Reply

Marsh Posté le 09-02-2016 à 14:56:36    

Tu as un string (une chaine de caractère) alors que jpgraph attend un array, il faut que tu fasse un explode sur la virgule de $donnees['img'].


---------------
D3
Reply

Marsh Posté le 09-02-2016 à 15:03:11    

si j'insère explode (",", $donnees['img']); ligne 19, cela me balance plein d'insultes  :D , j'ai isolé [i]Warning: explode(): Empty delimiter in C:\wamp\www\worlwidesales.php on line <i>19</i></[/i], j'ai du me planter dans la formulation je pense
 
Mais comment je fais pour re-présenter les données dans l'array après ? puisque Jpgraph attend justement ces virgules comme séparateurs des ordonnées ?
merci !!!


Message édité par franck2015 le 09-02-2016 à 15:11:37
Reply

Marsh Posté le 09-02-2016 à 15:13:06    

Si pour toi c'est 2 lignes sont équivalentes :

Code :
  1. $datay2 = '12,9,42,8';
  2. $datay2 = array(12,9,42,8);


Tu as un soucis, en tout cas pour jpgraph elle sont différentes ! ^^
 
En fait ce serait plus simple de récupérer un array depuis MySQL, pourquoi faire un CONCAT(...) AS img ?
Fait un SELECT Q1, Q2, Q3, Q4 et récupère tes données dans :

Code :
  1. $array1 = array($donnees['Q1'],$donnees['Q2'],$donnees['Q3'],$donnees['Q4']);


---------------
D3
Reply

Marsh Posté le 09-02-2016 à 15:15:33    

C'est bien ce qu'il me semblait :
CONCAT(Q1,',',Q2,',',Q3,',',Q4)
 
-> Tu confonds syntaxe PHP (pour les array) et la manière d'insérer des valeurs dans un array :
$MonArray[] = 10.3;
 
Ton SELECT te renvoie une unique valeur qui est une chaîne. C'est pour ça que j'étais étonné pas de voir une boucle pour lire les enregistrements en base. D'où ma suggestion que tu fasse d'avoir sans BD ton premier graph.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-02-2016 à 15:21:53    

Oui c'est pas faux...Ca marche nickel !!! Merci !!!
 
Juste une dernière question, si le champ n'est pas renseigné, il me met automatiquement zero, sais tu comment on le forcer à ne pas mettre de valeur ? Dans cet exemple 2013 chute a 0 sur Q4 alors que le champ n'est pas renseigné
 
http://i68.servimg.com/u/f68/09/04/66/85/worlwi10.png
 
Merci encore!
 

Message cité 1 fois
Message édité par franck2015 le 09-02-2016 à 15:25:29
Reply

Marsh Posté le 09-02-2016 à 15:21:53   

Reply

Marsh Posté le 09-02-2016 à 15:29:10    

A mes débuts j'ai aussi fait mumuse avec jpgraph, je penses que le meilleur conseil à donner à un débutant c'est de récupérer tous tes résultats venant de Mysql d'un coté et de les mettre dans un gros tableau récursif:

Code :
  1. $res_mysql = " SELECT Year,Q1,Q2,Q3,Q4) as img FROM ps WHERE 1 ";
  2. $t_data = array();
  3. while($row = fetch $res_mysql){
  4.   $t_data[$row ['Year']] = array($row ['Q1'],$row ['Q2'],$row ['Q3'],$row ['Q4']);
  5. }
  6. var_dump($t_data);
  7. exit();


une fois que ton tableau de données et propre, tu peux générer ton jpgraph avec une boucle foreach (de memoire, si on ne précise pas de couleur il en pioche au hasard) :

Code :
  1. foreach($t_data as $year => $array) {
  2.   ${'p.'$year}= new LinePlot($array);
  3.   $graph->Add(${'p.'$year});
  4.   ${'p.'$year}->SetLegend('YTD ('.$year.')');
  5. }


 
C'est du pseudo code à la vas vite, mais ça devrait te débloquer...


---------------
D3
Reply

Marsh Posté le 09-02-2016 à 15:45:27    

C'est super sympa, je vais essayer ! Merci de ta compréhension et de ton aide ! :)

Reply

Marsh Posté le 09-02-2016 à 17:01:22    

franck2015 a écrit :

Oui c'est pas faux...Ca marche nickel !!! Merci !!!
 
Juste une dernière question, si le champ n'est pas renseigné, il me met automatiquement zero, sais tu comment on le forcer à ne pas mettre de valeur ? Dans cet exemple 2013 chute a 0 sur Q4 alors que le champ n'est pas renseigné
 
http://i68.servimg.com/u/f68/09/04/66/85/worlwi10.png
 
Merci encore!
 


Pas sûr qu'on puisse faire une "ligne brisée". Si t'as pas de valeur, soit tu mets 0, soit tu mets la moyenne entre la valeur précédente et suivante. Après, dans ce genre de cas, un histogramme (empilé) sera peut-être plus approprié ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-02-2016 à 17:30:10    

Reply

Marsh Posté le 09-02-2016 à 17:47:25    

Bon, ben t'as ta réponse du coup : c'est possible et le manuel te dit comment faire.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-02-2016 à 23:14:55    

Merci !

Reply

Sujets relatifs:

Leave a Replay

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