Comme son nom l'indique, ce script trace un graphique, clair et net, de vos statistiques sauvegardés dans une base de données mySql. Très utile et bien expliqué... Si vous avez des problèmes à faire fonctionner le script, dites le moi. Il fait une colonne pour chaque mois de l'année courante (enregistre la/les visite(s) unique(s) (avec cookie) et la/les connexion(s) (sans cookie)).
Source / Exemple :
<?php
/*
Script réalisé par Kevin Gilbert (KeGi)
une très petite partie de script du graphique est inspirée de www.phpdebutant.org
IMPORTANT: vous devez créer une table "stats" et uploader le fichier SQl qui vient avec le zip
Pour afficher le graphique du/des visiteur(s) unique(s):
<img border="1" src="compteur.php?what=no_reload&save=no" alt="Nombre de visiteurs" /> (affichage sans les reloads et ne sauvegarde pas)
Pour afficher la/les connexion(s):
<img border="1" src="compteur.php?what=reload&save=no" alt="Nombre de visiteurs" /> (affichage avec les reloads et ne sauvegarde pas)
Pour insérer le code qui enrégistre les visiteurs (invisible):
<?php $what="save"; $save="yes"; include("compteur.php"); ?> (en début de page sans espace)
pour afficher le nombre de visiteur(s) ce mois-ci :
<?php $what="save"; $save="no"; include("compteur.php"); echo $hit; ?>
pour afficher le nombre de connexion(s) ce mois-ci :
<? $what="save"; $save="no"; include("compteur.php"); echo $hit2; ?>
bonne prog ;)
if($what==""){ $what="no_reload"; }
if($save==""){ $save="yes"; }
$host = "localhost";
$user = "root";
$pass = "";
$table = "stats";
mysql_connect($host,$user,$pass);
mysql_select_db("Base");
$m = date("m"); //numéro du mois
$a = date("Y"); //année
//partie qui ne compte pas les reloads...
$query = "SELECT * FROM $table WHERE (year='$a' && month='$m' && type='no_reload')";
$result = mysql_query($query);
$nbrep = mysql_numrows($result);
if($nbrep=="0"){ //si le mois n'est pas entré, on l'ajoute
if($save=="yes"){
$query = "INSERT INTO $table(hit,year,month,type)";
$query .= " VALUES('1','$a','$m','no_reload')";
$result = mysql_query($query);
}
}else{ //sinon on récupère la valeur du compteur
while ($val = mysql_fetch_array($result)) {
$hit=$val["hit"]; if($hit==""){ $hit = 0; }
}
}
if(empty($_COOKIE["Visite"])){ //si le visiteur n'a pas de cookie, on incrémente le compteur
$hit ++;
if($save=="yes"){
setcookie("Visite","ok",time()+365*24*3600); //on lui donne un cookie d'un an
}
}
if($save=="yes"){ //on enregistre le compteur incrémenté ou non...
$query = "UPDATE $table SET hit='$hit'";
$query .= " WHERE year='$a' && month='$m' && type='no_reload'";
$result = mysql_query($query);
}
// partie qui compte les reloads... (même chose sauf qu'ici on met le champ type en reload et on ne met pas de cookie)
$query = "SELECT * FROM $table WHERE (year='$a' && month='$m' && type='reload')";
$result = mysql_query($query);
$nbrep = mysql_numrows($result);
if($nbrep=="0"){
if($save=="yes"){
$query = "INSERT INTO $table(hit,year,month,type)";
$query .= " VALUES('1','$a','$m','reload')";
$result = mysql_query($query);
}
}else{
while ($val = mysql_fetch_array($result)) {
$hit2=$val["hit"]; if($hit2==""){ $hit2 = 0; }
}
}
$hit2 ++;
if($save=="yes"){
$query = "UPDATE $table SET hit='$hit2'";
$query .= " WHERE year='$a' && month='$m' && type='reload'";
$result = mysql_query($query);
}
if($what!=="save"){
//dessin du graphique...
$query = "SELECT * FROM $table WHERE (year='$a' && type='$what')"; //requette mysql pour savoir quoi afficher
$result = mysql_query($query);
$nbrep = mysql_numrows($result);
while ($val = mysql_fetch_array($result)) {
$month = $val["month"];
$mois[$month]=$val["hit"]; if($mois[$month]==""){ $mois[$month] = 0; } //arrabgement des 12 mois ou valeur de 0
}
$nbuse = 0;
$top = 0;
while($nbuse<12){
$nbuse ++;
if($mois[$nbuse]==""){ $mois[$nbuse]="0"; }
if($mois[$nbuse]>$top){ $top=$mois[$nbuse]; }
//on veux savoir qu'elle est la plus grande des valeurs (il doit surement exister une meilleure facon mais ca marche ...)
}
$visites = array($mois[1], $mois[2], $mois[3], $mois[4], $mois[5], $mois[6], $mois[7], $mois[8], $mois[9], $mois[10], $mois[11], $mois[12]);
$pl=0;
header ("Content-type: image/png"); //on entre en mode image
$largeurImage = 400; //largeur du graphique
$hauteurImage = 300; //hauteur du graphique
$topmonth = $top; //Pour mettre la colone la plus haute en rouge
$top = ($top + 10); //une marge d'erreur pour voir les chiffres en dessus des colones
$im = ImageCreate ($largeurImage, $hauteurImage) //on créer l'image
or die ("Erreur lors de la création du graphique");
$blanc = ImageColorAllocate ($im, 255, 255, 255); //couleurs préfaite...
$noir = ImageColorAllocate ($im, 0, 0, 0);
$bleu = ImageColorAllocate ($im, 0, 0, 255);
$rouge = ImageColorAllocate ($im, 255, 0, 0);
ImageLine ($im, 10, $hauteurImage-10, $largeurImage-10, $hauteurImage-10, $noir);
for ($mois=1; $mois<=12; $mois++) { //assosiation des lettre avec les numéro de mois, encore là surement pas la meilleure facon mais ça marche ...
if($mois=="1"){ $mois_lettre = "J"; }
if($mois=="2"){ $mois_lettre = "F"; }
if($mois=="3"){ $mois_lettre = "M"; }
if($mois=="4"){ $mois_lettre = "A"; }
if($mois=="5"){ $mois_lettre = "M"; }
if($mois=="6"){ $mois_lettre = "J"; }
if($mois=="7"){ $mois_lettre = "J"; }
if($mois=="8"){ $mois_lettre = "A"; }
if($mois=="9"){ $mois_lettre = "S"; }
if($mois=="10"){ $mois_lettre = "O"; }
if($mois=="11"){ $mois_lettre = "N"; }
if($mois=="12"){ $mois_lettre = "D"; }
ImageString ($im, 0, $mois*30, $hauteurImage-10, $mois_lettre, $noir);
}
ImageLine ($im, 10, 10, 10, $hauteurImage-10, $noir);
$visitesMax = $top; //maximum des colones
for ($mois=1; $mois<=12; $mois++) { //dessinage des colones...
if($visites[$mois-1]==$topmonth){ //si c'est la plus haute ou égale : Rouge
$hauteurImageRectangle = round(($visites[$mois-1]*$hauteurImage)/$visitesMax);
ImageFilledRectangle ($im, $mois*30-7, $hauteurImage-$hauteurImageRectangle, $mois*30+7, $hauteurImage-10, $rouge);
ImageString ($im, 0, $mois*30-7, $hauteurImage-$hauteurImageRectangle-10, $visites[$mois-1], $rouge);
}else{ //sinon Bleu
$hauteurImageRectangle = round(($visites[$mois-1]*$hauteurImage)/$visitesMax);
ImageFilledRectangle ($im, $mois*30-7, $hauteurImage-$hauteurImageRectangle, $mois*30+7, $hauteurImage-10, $bleu);
ImageString ($im, 0, $mois*30-7, $hauteurImage-$hauteurImageRectangle-10, $visites[$mois-1], $rouge);
}
}
ImagePng ($im); //affichage de l'image ...
}
mysql_close(); //fermeture de la connexion mysql
?>
Conclusion :
n'oubliez pas d'uploader le script sql sur votre serveur et ne mettez pas d'espace ou de commandes avant le script.
laissez vos commentaires.
bonne prog ;)
cordialement,
kevin (kegi@hotmail.com)
16 mai 2005 à 11:35
Pas tout le temps de regarder mais deux petites remarques: Pour commencer, il faut tester les retours mysql ( connextion, sélection de base, query, ... )
if(!@mysql_connect($host,$user,$pass) || !@mysql_select_db("Base"))
die('Erreur');
Idem pour les requêtes
Pour les mois, tu peux faire:
$mois_lettres = array('J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D');
$mois_lettre = $mois_lettres[ $mois - 1];
Autrement, ca à l'air sympa.
@++
R@f
17 mai 2005 à 01:17
cordialement,
kegi@hotmail.com
18 oct. 2005 à 22:28
J'utilise ta source pour essayer de faire un petit module de statistiques. Je prends chaque mois de l'année et je calcule ce que j'ai dépensé pour mes interventions.
Malheureusement le graphique ne sort pas, j'cherche mais je trouve pas, peut-on m'aider?
Voici ma source :
<?php
header ("Content-type: image/png"); //on entre en mode image
include("../../Mysql/connexion.php");
function nbjour($m,$a)
{
if(($a%4)==0)
{
$fev=29;
}
else
{
$fev=28;
}
$mois = array(0,31,$fev,31,30,31,30,31,31,30,31,30,31);
for($x=1;$x<13;$x++)
{
if($m == $x)
{
return $mois[$x];
}
}
}
$m = date("m"); //numéro du mois
$a = date("Y"); //année
//Pour tous les mois de l'année on va calculer le cout engendrer !
for($i=1;$i<=12;$i++){
$nbJours_sql2 = nbjour($i,$a);
if ($i<10) $m = "0".$i; else $m=$i;
$premierjour_sql = "$a"."-"."$m"."-"."01";
$dernierjour_sql = "$a"."-"."$m"."-"."$nbJours_sql2";
//maintenant qu'on les dates concernées pour chaque mois on peut faire notre requete
$req0 mysql_query("SELECT * from dbinterventions p ,dbplanning q WHERE p.int_ID q.pla_IDIntervention AND p.int_Date>='$premierjour_sql' and p.int_Date<='$dernierjour_sql'");
//
$total = 0;
$cout = 0;
while ($rs = mysql_fetch_object($req0)) {
//
$heuredeb = $rs->pla_HeureDebut;
$heurefin = $rs->pla_HeureFin;
$heuredeb = substr($heuredeb,0,5);
$heuredeb = str_replace(':','',$heuredeb);
$heurefin = substr($heurefin,0,5);
$heurefin = str_replace(':','',$heurefin);
if ($heurefin!=0) {
if ($heurefin<=$heuredeb) {
//Etape 1
$hfin = substr($heurefin,0,2);
$mfin = substr($heurefin,2,2);
$heurefin = $hfin+($mfin/60);
$tampon_duree = $heurefin - $minuit;
//Etape 2
$minuit2=24;
$hdeb = substr($heuredeb,0,2);
$mdeb = substr($heuredeb,2,2);
$heuredeb = $hdeb+($mdeb/60);
$tamponduree2 = $minuit2 - $heuredeb;
//Totalisons...
$duree = $tampon_duree+$tamponduree2;
$cout = $rs->pla_Coefficient * $rs->pla_TauxHoraire * round($duree,2);
}else{
$hdeb = substr($heuredeb,0,2);
$mdeb = substr($heuredeb,2,2);
$hfin = substr($heurefin,0,2);
$mfin = substr($heurefin,2,2);
//Maintenant on transforme les deux o format décimal ..
//Pour cela, on divise les minutes par 60 et on arrondi au centième
$heuredeb = $hdeb+($mdeb/60);
$heurefin = $hfin+($mfin/60);
$duree = $heurefin-$heuredeb;
//Cout
$cout = $rs->pla_Coefficient * $rs->pla_TauxHoraire * round($duree,2);
}
}else{
$duree=0;
//Cout
$cout = $rs->pla_Coefficient * $rs->pla_TauxHoraire * round($duree,2);
}
//echo $cout;
$total = $total + $cout;
}
//
$mois[$i] = round($total,2);
// exit;
}
$top = max($mois);
//dessin du graphique...
$visites = array($mois[1], $mois[2], $mois[3], $mois[4], $mois[5], $mois[6], $mois[7], $mois[8], $mois[9], $mois[10], $mois[11], $mois[12]);
$pl=0;
$largeurImage = 700; //largeur du graphique
$hauteurImage = 300; //hauteur du graphique
$topmonth = $top; //Pour mettre la colone la plus haute en rouge
$top = ($top + 1000); //une marge d'erreur pour voir les chiffres en dessus des colones
$im = ImageCreate($largeurImage, $hauteurImage) //on créer l'image
or die ("Erreur lors de la création du graphique");
$blanc = ImageColorAllocate ($im, 255, 255, 255); //couleurs préfaite...
$noir = ImageColorAllocate ($im, 0, 0, 0);
$bleu = ImageColorAllocate ($im, 0, 0, 255);
$rouge = ImageColorAllocate ($im, 255, 0, 0);
ImageLine ($im, 10, $hauteurImage-10, $largeurImage-10, $hauteurImage-10, $noir);
for ($mois=1; $mois<=12; $mois++) { //assosiation des lettre avec les numéro de mois, encore là surement pas la meilleure facon mais ça marche ...
if($mois=="1"){ $mois_lettre = "J"; }
if($mois=="2"){ $mois_lettre = "F"; }
if($mois=="3"){ $mois_lettre = "M"; }
if($mois=="4"){ $mois_lettre = "A"; }
if($mois=="5"){ $mois_lettre = "M"; }
if($mois=="6"){ $mois_lettre = "J"; }
if($mois=="7"){ $mois_lettre = "J"; }
if($mois=="8"){ $mois_lettre = "A"; }
if($mois=="9"){ $mois_lettre = "S"; }
if($mois=="10"){ $mois_lettre = "O"; }
if($mois=="11"){ $mois_lettre = "N"; }
if($mois=="12"){ $mois_lettre = "D"; }
ImageString ($im, 0, $mois*30, $hauteurImage-10, $mois_lettre, $noir);
}
ImageLine ($im, 10, 10, 10, $hauteurImage-10, $noir);
$visitesMax = $top; //maximum des colones
for ($mois=1; $mois<=12; $mois++) { //dessinage des colones...
if($visites[$mois-1]==$topmonth){ //si c'est la plus haute ou égale : Rouge
$hauteurImageRectangle = round(($visites[$mois-1]*$hauteurImage)/$visitesMax);
ImageFilledRectangle ($im, $mois*30-7, $hauteurImage-$hauteurImageRectangle, $mois*30+7, $hauteurImage-10, $rouge);
ImageString ($im, 0, $mois*30-7, $hauteurImage-$hauteurImageRectangle-10, $visites[$mois-1], $rouge);
}else{ //sinon Bleu
$hauteurImageRectangle = round(($visites[$mois-1]*$hauteurImage)/$visitesMax);
ImageFilledRectangle ($im, $mois*30-7, $hauteurImage-$hauteurImageRectangle, $mois*30+7, $hauteurImage-10, $bleu);
ImageString ($im, 0, $mois*30-7, $hauteurImage-$hauteurImageRectangle-10, $visites[$mois-1], $rouge);
}
}
ImagePng ($im); //affichage de l'image ...
mysql_close(); //fermeture de la connexion mysql
?>
4 nov. 2005 à 04:47
tu doit afficher le fichier php en image...
ex:
Je te donne cette réponse en suposant que tu débute en php, si je me trompe et que l'erreur n'est pas à cette endroit, dit moi ;)
cordialement,
kevin (kegi@hotmail.com)
5 févr. 2006 à 14:37
#
# if($mois=="1"){ $mois_lettre = "J"; }
#
# if($mois=="2"){ $mois_lettre = "F"; }
#
# if($mois=="3"){ $mois_lettre = "M"; }
#
# if($mois=="4"){ $mois_lettre = "A"; }
#
# if($mois=="5"){ $mois_lettre = "M"; }
#
# if($mois=="6"){ $mois_lettre = "J"; }
#
# if($mois=="7"){ $mois_lettre = "J"; }
#
# if($mois=="8"){ $mois_lettre = "A"; }
#
# if($mois=="9"){ $mois_lettre = "S"; }
#
# if($mois=="10"){ $mois_lettre = "O"; }
#
# if($mois=="11"){ $mois_lettre = "N"; }
#
# if($mois=="12"){ $mois_lettre = "D"; }
#
pourquoi ne pas faire de boucles ?
t'as oublié tout les or die() pour est erreurs de connexions et de requettes !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.