PHP/MySQL плюс graph статистика

nom3r1

Registered
Не съм запознат с graph статистиките т.е. примерно:
graph.png


Имам таблица на посещенията, като в тази таблица записвам:

-----------------------------------------------
id | aid | date | ip | view
1| 21 | 12331255 | 255.255.255.1 | 123
2| 23 | 23123131 | 255.255.255.3 | 1
3| 21 | 12333255 | 255.255.255.5 | 523
-----------------------------------------------

aid - уникален номер на статията
date - посещение на потребителя , като се прави update при всяко влизане
ip - нужно ли е да обяснявам?
view - записване на броя влизания в статията

-----------------------------------------------


Така. Обаче искам да направя graph статистика , за всеки месец колко пъти е била посещавана дадената статия като уникални посещения и като презареждания - точно заради т'ва правя и update на view - презарежданията.

Няк'ви идеи как точно ще стане визуализирането на подобна статистика за всяка отделна статия ?
 
Намерих един код и го промених малко, обаче когато се сложи мишката върху дадения "бар" т.е. колоната искам да излизат числата, а сега не излизат, ще трябва яко ръчкане, 'щото в тоя вариант, дето е кода сега - не виждам начин да стане

@relax4o, ако не се справя с т'ва което съм започнал ще обърна внимание и на pChart-а, който ми даде. :?:

4335.png


PHP:
<?php
$jan = 0;
$feb = 0;
$mar = 0;
$apr = 0;
$may = 0;
$jun = 0;
$jul = 0;
$aug = 51;
$sep = 215;
$oct = 130;
$nov = 0;
$dec = 0;
$values = array(
	"Jan" => $jan,
	"Feb" => $feb,
	"Mar" => $mar,
	"Apr" => $apr,
	"May" => $may,
	"Jun" => $jun,
	"Jul" => $jul,
	"Aug" => $aug,
	"Sep" => $sep,
	"Oct" => $oct,
	"Nov" => $nov,
	"Dec" => $dec
);
$img_width  = 700;
$img_height = 400; 
$margins    = 30;
# ---- Find the size of graph by substracting the size of borders
$graph_width  = $img_width - $margins * 2;
$graph_height = $img_height - $margins * 2; 
$img          = imagecreate($img_width,$img_height);
$bar_width    = 30;
$total_bars   = count($values);
$gap          = ($graph_width- $total_bars * $bar_width ) / ($total_bars +1);
# -------  Define Colors ----------------
$bar_color        = imagecolorallocate($img,0,64,128);
$background_color = imagecolorallocate($img,240,240,255);
$border_color     = imagecolorallocate($img,200,200,200);
$line_color       = imagecolorallocate($img,220,220,220);
# ------ Create the border around the graph ------
imagefilledrectangle($img,1,1,$img_width-2,$img_height-2,$border_color);
imagefilledrectangle($img,$margins,$margins,$img_width-1-$margins,$img_height-1-$margins,$background_color);
# ------- Max value is required to adjust the scale	-------
$max_value = max($values);
$ratio     = $graph_height/$max_value;
# -------- Create scale and draw horizontal lines  --------
$horizontal_lines = 20;
$horizontal_gap   = $graph_height/$horizontal_lines;
for($i = 1;$i<=$horizontal_lines;$i++){
	$y = $img_height - $margins - $horizontal_gap * $i ;
	imageline($img,$margins,$y,$img_width-$margins,$y,$line_color);
	$v = intval($horizontal_gap * $i /$ratio);
	imagestring($img,0,5,$y-5,$v,$bar_color);
}
# ----------- Draw the bars here ------
for($i = 0;$i< $total_bars; $i++){ # ------ Extract key and value pair from the current pointer position
	list($key,$value) = each($values); 
	$x1 = $margins + $gap + $i * ($gap+$bar_width) ;
	$x2 = $x1 + $bar_width; 
	$y1 = $margins +$graph_height- intval($value * $ratio) ;
	$y2 = $img_height-$margins;
	imagestring($img,0,$x1+3,$y1-10,$value,$bar_color);
	imagestring($img,3,$x1+3,$img_height-15,$key,$bar_color);		
	imagefilledrectangle($img,$x1,$y1,$x2,$y2,$bar_color);
}
header("Content-type: image/png;"); 
imagepng($img);
?>

П.С. Арбалетите , които делкам , режа и сглобявам са триста пъти по прости от т'ва php.. За толкова години се убеждавам, че във всяко едно отношение можеш да научиш все нови неща хахах :D
 
Не съм много на ТИ с GD библиотеката, но това, което ти се опитваш да направиш може би ще се получи, ако си направиш с JavaScript функция-балонче(ако ме разбираш) и при mouseover да слагаш imagestring($img,0,$x1+3,$y1-10,$value,$bar_color);(това е в последния for-цикъл).
 
Нещо не ми се връзва как да направя картинка да използва javascript?

Ясно, ако е html просто е слагането на JavaScript балон, но не ми се връзва при картинката как ще работи?

Да речем , че трябва да "вкарам" js файла:
HTML:
<script type="text/javascript" src="baloni.js"></script>

Т'ва е картинка , как ще го разчете?
 
Може би, ако взимаш координатите на изображението. Сините правоъгълници са направени чрез координати ръгнати в цикъл. Вземи изображението след това и задай координатите, които са сметнати в PHP кода.
Мога само насоки да давам, макар че не съм сигурен дали са постижими по принцип, понеже GD и JavaScript съм много скаран с тях.

Може би някой друг ще може да ти помогне повече, а ако не опитай pChart.
 
Т'ва с image map не е лоша идея, но няк'в по лесен вариант от т'ва да цъкам с Paint за да му видя координатите имате ли - т.е. направо да му взема целите координати?

Иначе тествах и става, обаче трябва да си играя до утре сигурно с тия координати.
 
Ето един флаш вариант, който си има "балони" по подразбиране и изглежда доста интерактивно:

Едит: има по-нова версия:
http://teethgrinder.co.uk/open-flash-chart-2/
 
Добре, чудех се дали да пусна нова тема, но направо ще питам тук.
Имате ли представа как да изкарам за всеки месец броя посещения през сегашната година?

Като имам 1 таблица , в която записвам:
visitor_page - статия ID
visitor_day - дата
visitor_month - месец
visitor_year - година
viewed - Брой презареждания
visitor_ip - ip address

След т'ва трябва да вкарам данните във следния масив:
$values = array(
"Jan" => $jan,
"Feb" => $feb,
"Mar" => $mar,
"Apr" => $apr,
"May" => $may,
"Jun" => $jun,
"Jul" => $jul,
"Aug" => $aug,
"Sep" => $sep,
"Oct" => $oct,
"Nov" => $nov,
"Dec" => $dec
);

Като променливите $jan, $feb, $mar, $apr, $may, $jun, $jul, $aug, $sep, $oct, $nov, $dec трябва да бъдат броя презареждания т.е. viewed.

Като тази статистика трябва да излиза за всяка статия, колко пъти е била посетена всеки месец от всички потребители.
 
Малко е странно, че си разделил датата в три отделни колони, но нека да е така.

Код:
$sql = "select date_format(concat_ws('-', visitor_year, visitor_month, visitor_day), '%b') as vdate, sum(viewed) as total from visits where visitor_year = YEAR(NOW()) group by vdate";

$resultSet = mysql_query($sql) or die(mysql_error());

$values = array();

while($data = mysql_fetch_array($resultSet)){
    $values[$data['vdate']] = $data['total'];
}

Този код, обаче ще изкара данни само за месеците, през които е имало посещения. Месеците през които не е имало посещения, ще липсват. Но вероятно лесно ще се сетиш как да разрешиш този проблем с РНР, веднъж след като вече имаш данните изкарани от базата-данни.
 
Като извадя резултата ~
Array
(
[Jan] =>
[Feb] =>
[Mar] =>
[Apr] =>
[May] =>
[Jun] =>
[Jul] =>
[Aug] =>
[Sep] =>
[Oct] =>
[Nov] =>
[Dec] =>
)

К'во ти иначе предложението за датата, мислиш ли че ще е по-добре с едно поле?
 
Този код го махни:

$values = array(
"Jan" => $jan,
"Feb" => $feb,
"Mar" => $mar,
"Apr" => $apr,
"May" => $may,
"Jun" => $jun,
"Jul" => $jul,
"Aug" => $aug,
"Sep" => $sep,
"Oct" => $oct,
"Nov" => $nov,
"Dec" => $dec
);

За датата - MySQL предоставя няколко типа данни за колона за съхранение на дата и време и се работи много по-лесно, най-малкото този concat в началото щеше да се избегне.
 

Back
Горе