= date ORDER BY date"; logger(DEBUG, _("query : ") . $query, __FILE__ . ":" . __LINE__); if(!($mohaDB->result = $mohaDB->query($query))) { print _("mysql query error: ") . $mohaDB->error . __FILE__ . ":" . __LINE__; } $datas = $mohaDB->result->fetch_all(MYSQLI_ASSOC); //print_r($mohaDB); if ($mohaDB->affected_rows != 0) { $n = $mohaDB->affected_rows; for($i=0;$i<$n;$i++) { //echo $i . "======>"; if (strtolower($datas[$i]["value"]) == "on" or strtolower($datas[$i]["value"]) == "true") { //echo "setting value to : 1 =>" . __FILE__ . ":" . __LINE__ . EOLH; $datas[$i]["value"] = 1; }elseif (strtolower($datas[$i]["value"]) == "off" or strtolower($datas[$i]["value"]) == "false") { //echo "setting value to : 0 =>" . __FILE__ . ":" . __LINE__ . EOLH; $datas[$i]["value"] = 0; } /*else { //echo "strange value : " . $datas[$i]["value"] . " => " . __FILE__ . ":" . __LINE__ .EOLH; }*/ //var_dump($datas); } print diagramDisplay($datas); }else { print _("Sorry, no results"); } } }else { print _("Dates need to be of the form: YYYY-MM-DD 00:00:00"); } } } /************************************************************/ /* $datas => array of datas to display {date,value} */ /* $ndata => n datas to display */ /* $min => minimal value to display */ /* $max => maximal value to dispaly */ /************************************************************/ function diagramDisplay($datas) { global $months; $ndata = count($datas); $i = $ndata; $min = min(array_column($datas, "value")); $max = max(array_column($datas, "value")); //print "min =>" . $min . "max =>" . $max . EOLH; //Type mime de l'image //Chemin vers le police à utiliser $font_file = '/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf'; //Adapter la largeur de l'image avec le nombre de donnée $largeur = ($ndata + 1) * 30 + 90; $hauteur = 400; //Hauteur de l'abscisse par rapport au bas de l'image $absis = 120; //Création de l'image $courbe = imagecreatetruecolor($largeur, $hauteur); //Allouer les couleurs à utiliser $bleu = imagecolorallocate($courbe, 0, 0, 255); $ligne = imagecolorallocate($courbe, 220, 220, 220); $fond = imagecolorallocate($courbe, 250, 250, 250); $noir = imagecolorallocate($courbe, 0, 0, 0); $rouge = imagecolorallocate($courbe, 255, 0, 0); //Colorier le fond imagefilledrectangle($courbe,0 , 0, $largeur, $hauteur, $fond); //Tracer l'axe des abscisses imageline($courbe, 50, $hauteur - $absis, $largeur - 10, $hauteur - $absis, $noir); //Tracer l'axe des ordonnées imageline($courbe, 50, $hauteur - $absis, 50, 20, $noir); //Decaler 10px vers le haut si le minimum est différent de 0 $a = 0; if($min != 0) { $absis += 10; $a = 10; } //Nombres des grides verticales $nbOrdonne = 10; //Calcul de l'echelle des abscisses $echelleX = ($largeur - 130) / $ndata; //Calcul de l'echelle des ordonnees $echelleY = ($hauteur - $absis) / ($nbOrdonne + 1); $i = $min; //Calcul des ordonnees des grides $py = ($max - $min) / $nbOrdonne; $pasY = $absis; while($i <= ($max - $min)) { //Affiche la valeur de l'ordonnee imagestring($courbe, 2, 10 , $hauteur - $pasY - 6, round($i, 0, PHP_ROUND_HALF_DOWN), $noir); //Trace la gride imageline($courbe, 50, $hauteur - $pasY, $largeur - 20, $hauteur - $pasY, $ligne); //Decaller vers le haut pour la prochaine gride $pasY += $echelleY; //Valeur de l'ordonnee suivante $i += $py; } $j = -1; $pasX = 50; //Parcourir le tableau pour le traçage du diagramme. foreach ($datas as $row) { $date = $row["date"]; $quantite = $row["value"]; //calculer la hauteur du point par rapport à sa valeur $y = ($hauteur) - (($quantite - $min) * ($echelleY / $py)) - $absis; //dessiner le point imagefilledellipse($courbe, $pasX, $y, 6, 6, $rouge); //Afficher le mois en français avec une inclinaison de 315° //printf("pasx = %d hauteur = %d absis = %d noir= %d", $pasX, $hauteur, $absis, $noir); imagefttext($courbe, 10, 315, $pasX, $hauteur - $absis + 20, $noir, $font_file, $date); //Tracer une ligne verticale de l'axe de l'abscisse vers le point imageline($courbe, $pasX, $hauteur - $absis + $a, $pasX, $y, $noir); if($j !== -1) { //liée le point actuel avec la précédente imageline($courbe, ($pasX - $echelleX), $yprev, $pasX, $y, $noir); } //Afficher la valeur au dessus du point imagestring($courbe, 2, $pasX - 15, $y - 14, $quantite, $bleu); $j = $quantite; //enregister la hauteur du point actuel pour la liaison avec la suivante $yprev = $y; //Decaler l'abscisse suivante par rapport à son echelle $pasX += $echelleX; } //Envoyer le flux de l'image $file = tempnam("./", "moha-"); imagepng($courbe,$file); return ''; //Désallouer la mémoire utiliser par l'image imagedestroy($courbe); } $tmp = explode("|", $_GET["device"]); if (!empty($tmp[0]) && !empty($tmp[1]) && !empty($tmp[2])) { displayStats($tmp[0], $tmp[1], $tmp[2], $_GET["startDate"], $_GET["endDate"]); }else { logger(ERROR, "Your syntax is bad"); } ?>