Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3017 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Problème de connection Jpgraph avec MySQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de connection Jpgraph avec MySQL

n°2275246
franck2015
Posté le 09-02-2016 à 12:20:10  profilanswer
 

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
mood
Publicité
Posté le 09-02-2016 à 12:20:10  profilanswer
 

n°2275251
rufo
Pas me confondre avec Lycos!
Posté le 09-02-2016 à 13:37:37  profilanswer
 

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
n°2275253
franck2015
Posté le 09-02-2016 à 13:51:41  profilanswer
 

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


 

n°2275261
mechkurt
Posté le 09-02-2016 à 14:38:58  profilanswer
 

Et si tu insères :

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


entre ta ligne 17 et 18 ?


---------------
D3
n°2275262
franck2015
Posté le 09-02-2016 à 14:43:52  profilanswer
 

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
n°2275268
mechkurt
Posté le 09-02-2016 à 14:56:36  profilanswer
 

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
n°2275272
franck2015
Posté le 09-02-2016 à 15:03:11  profilanswer
 

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
n°2275274
mechkurt
Posté le 09-02-2016 à 15:13:06  profilanswer
 

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
n°2275275
rufo
Pas me confondre avec Lycos!
Posté le 09-02-2016 à 15:15:33  profilanswer
 

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
n°2275277
franck2015
Posté le 09-02-2016 à 15:21:53  profilanswer
 

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
mood
Publicité
Posté le 09-02-2016 à 15:21:53  profilanswer
 

n°2275278
mechkurt
Posté le 09-02-2016 à 15:29:10  profilanswer
 

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
n°2275279
franck2015
Posté le 09-02-2016 à 15:45:27  profilanswer
 

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

n°2275284
rufo
Pas me confondre avec Lycos!
Posté le 09-02-2016 à 17:01:22  profilanswer
 

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
n°2275288
mechkurt
Posté le 09-02-2016 à 17:30:10  profilanswer
 
n°2275290
rufo
Pas me confondre avec Lycos!
Posté le 09-02-2016 à 17:47:25  profilanswer
 

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
n°2275303
franck2015
Posté le 09-02-2016 à 23:14:55  profilanswer
 

Merci !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Problème de connection Jpgraph avec MySQL

 

Sujets relatifs
Ajax - xmlhttprequest - Problème pour lancer deux fonctionsproblème liste déroulante avec BDD
SGBD à moyenne volumétrie : MySQL => SQL Server ?Problème d'adaptation du header avec bootstrap
Probleme compatibilité VBA MSFLEXGRID Excel 2013Problème de date dans base de données
Problème avec DreamweaverProblème avec mon programme
(VB.NET) Problème integration dll (au logiciel SmarTeam)Chemin relatif : problème
Plus de sujets relatifs à : Problème de connection Jpgraph avec MySQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR