Graphique sous google chart

Rechercher

Graphique sous google chart

Par arbilus  -  10 reponses  -  Le 19/07/2010 17:57  -  Editer  - 

Bonjours, j'ai un problème concernant les graphiques de Google Charts

J'ai réussi à les afficher . Tout va bien . Voila où j'en suis :

<?phpinclude "../sqlconnect.php";function imp($char,$tag){  foreach($char as $key=>$value){  $char[$key] = $value;  }  $char = implode($tag,$char);  return $char;}  $sql = "SELECT * FROM xxxxx WHERE 1 ORDER BY date ASC LIMIT 0,10";  $query = mysql_query($sql);  while($row = mysql_fetch_array($query)){  $date[] = $row[date];  $count[] = $row[count];  }?>

 

<img src="http://chart.apis.google.com/chart?chxl=1:|<?=imp($date,'|')?>&chxr=0,0,<? echo $data['MAX(count)']; ?>&chxt=y,x&chbh=a&chs=300x225&cht=bvg&chco=76A4FB,3D7930,FF9900&chds=0,<? echo $data['MAX(count)']; ?>&chd=t:<?=imp($count,',')?>|-1&chtt=Vertical+bar+chart" width="300" height="225" alt="Vertical bar chart" />

 

Le problème c'est . Effectivement, dans ma BDD la date est au format JJ/MM/AAAA . Seulement le fait d'afficher cette date sous ce format sur l'axe x créé une erreur d'affichage :

[img]http://img834.imageshack.us/img834/1802/imagewi.jpg[/img]

Je pense que la solution vient avec DAYOFMONTH() de $date . Mais je ne sais pas comment faire pour obtenir uniquement les jours ET les mois de la date à afficher sur l'axe des abscisses .

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 20/07/2010 09:54  -  Haut de page  - 

Salut arlibus,

décidément, tu n'es pas discipliné. On va commencer par analyser un peu ton code avant d'aller plus loin.

  1. Ta fonction imp() ne sertstrictement à rien : en utilisant implode() directement, tu obtiendras exactement la même chose.
  2. Ta requête SQL : je suppose que tu as vu ce système consistant à mettre systématiquement une clause WHERE en commençant par « WHERE 1» : c'est une très mauvaise habitude et ici, comme il n'y a pas d'autre clause WHERE, elle devient inutile.
  3. Toujours dans ta requête, tu fais un « SELECT * » alors que tu n'as besoin que de deux des colonnes de ta table : donc, précise ces deux colonnes et ne ramènes pas de résultats inutiles;
  4. Encore dans la requête : tu sembles avoir deux colonnes nommées avec des mots réservés : «date» et «count» : C'est la meilleure manière d'avoir des résultats pour le moins surprenants pour ne pas dire completement incohérents voire dans le pire des cas pour planter un serveur de base de données. Donc, renomme tes colonnes en leur mettant un préfixe. Par exemple, si ta table s'appelle « statistiques », utilise un préfixe «stt» et tes colonnes deviendront stt_date et stt_count : là, plus de risque.
  5. Dans ta balise image, tu utilises deux formes d'insertion PHP dont une qui est à bannir :celle utilisant les short_open_tag : «
 
Par arbilus  -  Le 20/07/2010 12:05  -  Haut de page  - 

Merci, effectivement c'est largement mieux comme ça !

Mais il y a cependant un problème qui vient de $params[] = 'chx1=1:'. implode('|', $date); .

Effectivement, cela créer les valeurs sur l'axe x , et si on fait ce que tu dis ces valeurs deviennent : 1 2 3 4 5 6 etc .. Alors qu'elles devraient être des dates .

Donc avant de répondre à mon problème avec ta façon de faire (bien plus propre !) il faudrait régler ce problème .

Je me suis renseigné sur implode . Effectivement c'est la même chose . Et ce que tu as écris me semble correcte alors je ne comprend pas d'où vient la faute .

 

 
Par Cyrano  -  Le 20/07/2010 13:03  -  Haut de page  - 

Prenons le problème en considérant tous les éléments... sauf que je n'ai pas tous les éléments.

Tu dis avoir stocké tes dates au format JJ/MM/AAAA dans ta base : pourquoi pas en type DATE en laissant le serveur gérer le stockage ? Normalement, le type date stockes les données au format AAAA-MM-JJ : ensuite, il existe pas mal de fonctions natives qui te permettraient au besoin de récupérer une partie seulement. Mais bon, à la limite, peu importe, il faut que tu m'indiques de quoi tu pars et à quoi tu veux arriver, par exemple, tu pars de « 12/07/2010 » : à partir de ça, tu veux obtenir quoi en fin de compte ?

Note qu'il existe beaucoup de fonctions natives dans MySQL et qu'il n'est pas forcément plus intéressant de tout traiter en PHP alors quon pourrait exploiter les ressources disponibles de la base.

 
Par arbilus  -  Le 20/07/2010 13:34  -  Haut de page  - 

En prenant ton exemple: à partir de 12/07/2010 j'aimerais afficher 12/07 uniquement sur l'axe des abscisses (12/07 serait un point sur l'axe x) .

Mais ça c'est je pense plus un problème . En fin bon.. J'ai pas réglé le problème (le problème réglé se serait : dans la BDD la date est au format JJ/MM/AAAA et à l'affichage sur l'axe x la date est au format JJ/MM) . Mais je l'ai contourné en faisant en sorte que tous les nouveaux enregistrements aient une date au format JJ/MM . Ainsi sur l'axe des abscisses c'est bien au format JJ/MM .

Certe, faire comme j'ai fait c'est que contourner le problème. Mais je m'explique pourquoi je trouve cette solution pas si mal pour mon cas :

Mon graphique n'affiche que les 31 dernieres valeurs de y . Donc je n'ai besoin que des 31 derniers jours .

ps: par contre il affiche uniquement les 31 derniers jours, donc (mais c'est un autre problème, je verais plutard) il faudra que je fasse en sorte de créer un script pour supprimer toutes les valeurs donc la date excède 31 jours d'ancienneté POUR CHAQUE ID . (car ce graph affiche les données persos de chaque membre en fonction du temps) .

 

ps2 : c'est pour mon systeme d'affiliation à mon site .

 
Par arbilus  -  Le 20/07/2010 13:41  -  Haut de page  - 

Le script à rajouter dans les pages pour ajouter des données au graph est :

$time = time();   $time = date("d/m",$time);  // C'EST ICI, J'AI CHANGE d/m/Y pour d/m pour faire JJ/MM   $sql = "SELECT * FROM xxxx WHERE date = '$time' AND lienaffi = $data[lienaffi]";   $query = mysql_query($sql);     if ($row = mysql_fetch_array($query)){         $count = $row[count]+1;         $sql = "UPDATE xxxx SET count = '$count' WHERE lienaffi = $data[lienaffi] AND user = $data[user]";         mysql_query($sql);         }else{         $sql = "INSERT INTO xxxx values ('','$data[lienaffi]','$data[user]','$time','1')";         mysql_query($sql);               }
 
Par arbilus  -  Le 20/07/2010 13:42  -  Haut de page  - 

Biensûr il faut changer date et count de la BDD par autre chose . Je l'ai pas mis à jour pour l'instant ..

 
Par Cyrano  -  Le 20/07/2010 16:08  -  Haut de page  - 

La question va se poser l'an prochain.

Pour le moment, tu enregistres des données valides. L'an prochain, tes données ne comprenant pas l'année e confondront et tu auras des graphiques qui ne voudront rien dire parce que tes dates seront fausse. Voilà pourquoi tu devrais enregistrer tes dates dans une colone correctement typée au format DATE ou DATETIME.

Ensuite à partir d'un format DATE, tu pourrais récupérer la chaine voulue en faisant un truc du genre :

SELECT
  CONCAT(
    DAY(stt_date),
    '/',
    MONTH(stt_date)
) AS date_statistique
FROM xxx
WHERE YEAR(stt_date) = 2010;

Tu peux bien entendu ajouter d'autres critères de tri dans la clause WHERE, mais la base est là et c'est un peu moins bricolage que ton système actuel.

En attendant, si ta colonne est de type VARCHAR, il y a aussi SUBSTRING() qui existe dans MySQL :

SELECT SUBSTRING(stt_date, 1, 5)
FROM xxx
WHERE SUBSTRING(stt_date, 6, 4) = 2010;

 

 

 
Par arbilus  -  Le 20/07/2010 18:34  -  Haut de page  - 

Problème réglé . J'ai ajouté une colonne au tableau où j'ai mis la date au type timestamp . Résultat j'ai l'affichage des dates au format DD/MM à l'affichage des stats et dans ma BDD j'ai les dates au format DD/MM/AAAA . Ensuite pour classé le tout en prenant compte les mois j'ai utilisé la version timestamp de ma date dans ma BDD .

Résultat il ne manque plus qu'une chose ....

 

Ta faute :D :

Voir mon message en amont :

Merci, effectivement c'est largement mieux comme ça !

 

Mais il y a cependant un problème qui vient de $params[] = 'chx1=1:'. implode('|', $date); .

Effectivement, cela créer les valeurs sur l'axe x , et si on fait ce que tu dis ces valeurs deviennent : 1 2 3 4 5 6 etc .. Alors qu'elles devraient être des dates .

 

Car pour réussir à l'afficher j'ai utilisé ma version .. Mais ta façon de faire est largement mieux

 

 

 
Par arbilus  -  Le 20/07/2010 18:37  -  Haut de page  - 

Voila les images :

avec ma version : http://img192.imageshack.us/img192/6673/chart2dv.png

avec la tienne : http://img191.imageshack.us/img191/8946/chartv.png

 
Par Cyrano  -  Le 20/07/2010 19:07  -  Haut de page  - 

Si tu as obtenu ce que tu voulais, c'est l'essentiel :)

 

Ajouter une réponse à la discussion

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

Identifiez-vous
Join |  ID/MDP? |