statistieken->grafiek per dag in maand uit database
ik wil een overzicht maken van een aantal statistieken;
het aantal views per website
aantal clicks op een link ect.
elke keer als je een pagina bekijkt dan komt er een nieuw rijtje in de database met de dag (maand en jaar), welke site en welk ip.
nu wil ik hiervan een grafiek maken van de maand waar je inzit (evt functie van naar vorige maand), dus je moet uitrekenen hoeveel dagen die maand heeft, verder moet je van elke dag in die maand een count doen van hoeveel views die website heeft gehad, en vervolgens in de grafiek plaatsen.
Ik heb dus echt geen idee hoe dit moet... (met een while loop denk ik?).
voor de grafiek wil ik het volgende script gebruiken:
http://www.pfz.nl/scripts/142-simpele-grafiek/
het aantal views heet bijv. views_site (where user_id=session user_id).
aantal clicks heet bijv. site_clicks (en deze wederom via where user_id=session user_id)
het mooiste zou zijn als die 2 lijnen ook bij elkaar in 1 grafiek komen, maar ik weet niet of dit kan...
(hieronder de code uit dit script):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?php
// door Daniel Dingemanse voorbeelden op http://rotterdamned.com/statistieken/grafieken/
$titel = "bezoekers";
// array op deze manier genereren $hoofdarray = array(x-as => y-as)
// bv:
$hoofdarray = array(
"1-1" => 45,
"2-1" => 35,
"3-1" => 42,
"4-1" => 46,
"5-1" => 51,
"6-1" => 49,
"7-1" => 33,
"8-1" => 39,
"9-1" => 40,
"10-1" => 34
);
$gebied_breedte = 400; // grootte van de grafiek zelf (zonder randen)
$gebied_hoogte = 200; // hoogte van de grafiek zelf (zonder randen)
$rand_links = 20; // de breedte van de linker rand (hou rekening met de lengte van de waardes die op de y-as komen, in toekomst misschien automatisch)
$rand_rechts = 10; // de breedte van de rechter rand
$rand_onder = 40; // de rand onder de grafiek (hou rekening met de lengte van de waardes die op de x-as komen, in toekomst misschien automatisch)
$rand_boven = 30; // de rand boven (hou rekening met de titel die hier in komt)
$hor_lijnen = 4; // het aantal verdelingen van de y-as
$hor_raster = TRUE; // horizontale lijnen zichtbaar?
$ver_lijnen = 10; // het aantal verdelingen van de x-as
$ver_raster = FALSE; // verticale lijnen zichtbaar?
$grafiek_titel = $titel; // de titel van de grafiek
header("Content-type: image/png");
if(function_exists("ImageCreateTrueColor"))
{
$plaatje = ImageCreateTrueColor(($gebied_breedte + $rand_rechts + $rand_links), ($gebied_hoogte + $rand_onder + $rand_boven));
}
else
{
$plaatje = ImageCreate(($gebied_breedte + $rand_rechts + $rand_links), ($gebied_hoogte + $rand_onder + $rand_boven));
}
$zwart = ImageColorAllocate($plaatje, 000, 000, 000);
$wit = ImageColorAllocate($plaatje, 255, 255, 255);
$grijs = ImageColorAllocate($plaatje, 225, 225, 225);
$lijn = ImageColorAllocate($plaatje, 000, 000, 255); // blauwe grafieklijn
imagefill($plaatje,1,1,$wit);
// zwarte rand of niet:
//imagefilledrectangle($plaatje, 1, 1, ($gebied_breedte + $rand_rechts + $rand_links - 2), ($gebied_hoogte + $rand_onder + $rand_boven -2), $wit); //
imagefilledrectangle($plaatje, ($rand_links + 1), ($rand_boven + 1), ($rand_links + $gebied_breedte - 1), ($rand_boven + $gebied_hoogte -1), $grijs);
$hoogste = 1;
foreach($hoofdarray as $key => $value)if($value > $hoogste)$hoogste = $value;
$style=array($zwart, $zwart, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT );
imagesetstyle($plaatje,$style);
$waarde = 1;
for($y = $rand_boven;$y < ($gebied_hoogte + $rand_boven + 1);$y += ($gebied_hoogte / $hor_lijnen))
{
$align = $rand_links - 3 - strlen(round($hoogste * $waarde)) * 5;
imagestring($plaatje, 2, $align, $y - 7 , round($hoogste * $waarde), $zwart);
if($hor_raster)imageline($plaatje, $rand_links, $y, ($rand_links + $gebied_breedte), $y, IMG_COLOR_STYLED);
$waarde -= (1 / $hor_lijnen);
}
$aantal = count($hoofdarray);
$interval = $gebied_breedte / ($aantal - 1);
$yinterval = $gebied_hoogte / $hoogste;
$x = $rand_links;
$coords = array();
$ticker = 0;
$numdates = round($aantal / $ver_lijnen);
if($numdates < 1)$numdates = 1;
foreach($hoofdarray as $xas => $yas)
{
$coords[$ticker]["x"] = round($x);
$coords[$ticker]["y"] = ($rand_boven + $gebied_hoogte) - (round($yas * $yinterval));
if($ticker / $numdates == round($ticker / $numdates) || $ticker == 0 || $ticker == $aantal-1)
{
$align = ($gebied_hoogte + $rand_boven) + (strlen($xas) * 5) + 5;
imagestringup($plaatje, 2 , round($x) - 7 , $align, $xas ,$zwart);
if($ver_raster)imageline($plaatje, round($x) , $rand_boven , round($x) , ($rand_boven + $gebied_hoogte), IMG_COLOR_STYLED);
}
$x += $interval;
$ticker++;
}
for($a = 0;$a < count($coords)-1;$a++)
{
imagesmoothline($plaatje, $coords[$a]["x"] , $coords[$a]["y"] , $coords[$a+1]["x"] , $coords[$a+1]["y"], $lijn);
}
imagerectangle($plaatje, $rand_links, $rand_boven, ($rand_links + $gebied_breedte), ($rand_boven + $gebied_hoogte), $zwart);
imagestring($plaatje, 4 , ((($rand_links + $rand_rechts + $gebied_breedte) / 2) - ((strlen($grafiek_titel) / 2) * 8)) , ($rand_boven / 2) - 8 , $grafiek_titel , $zwart);
ImagePNG($plaatje);
ImageDestroy($plaatje);
// functie voor de anti-aliasing van de grafieklijn (van php.net)
function imagesmoothline ( $image , $x1 , $y1 , $x2 , $y2 , $color )
{
$colors = imagecolorsforindex ( $image , $color );
if ( $x1 == $x2 )
{
imageline ( $image , $x1 , $y1 , $x2 , $y2 , $color ); // Vertical line
}
else
{
$m = ( $y2 - $y1 ) / ( $x2 - $x1 );
$b = $y1 - $m * $x1;
if ( abs ( $m ) <= 1 )
{
$x = min ( $x1 , $x2 );
$endx = max ( $x1 , $x2 );
while ( $x <= $endx )
{
$y = $m * $x + $b;
$y == floor ( $y ) ? $ya = 1 : $ya = $y - floor ( $y );
$yb = ceil ( $y ) - $y;
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , floor ( $y ) ) );
$tempcolors['red'] = $tempcolors['red'] * $ya + $colors['red'] * $yb;
$tempcolors['green'] = $tempcolors['green'] * $ya + $colors['green'] * $yb;
$tempcolors['blue'] = $tempcolors['blue'] * $ya + $colors['blue'] * $yb;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , $x , floor ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , ceil ( $y ) ) );
$tempcolors['red'] = $tempcolors['red'] * $yb + $colors['red'] * $ya;
$tempcolors['green'] = $tempcolors['green'] * $yb + $colors['green'] * $ya;
$tempcolors['blue'] = $tempcolors['blue'] * $yb + $colors['blue'] * $ya;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , $x , ceil ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$x ++;
}
}
else
{
$y = min ( $y1 , $y2 );
$endy = max ( $y1 , $y2 );
while ( $y <= $endy )
{
$x = ( $y - $b ) / $m;
$x == floor ( $x ) ? $xa = 1 : $xa = $x - floor ( $x );
$xb = ceil ( $x ) - $x;
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , floor ( $x ) , $y ) );
$tempcolors['red'] = $tempcolors['red'] * $xa + $colors['red'] * $xb;
$tempcolors['green'] = $tempcolors['green'] * $xa + $colors['green'] * $xb;
$tempcolors['blue'] = $tempcolors['blue'] * $xa + $colors['blue'] * $xb;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , floor ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , ceil ( $x ) , $y ) );
$tempcolors['red'] = $tempcolors['red'] * $xb + $colors['red'] * $xa;
$tempcolors['green'] = $tempcolors['green'] * $xb + $colors['green'] * $xa;
$tempcolors['blue'] = $tempcolors['blue'] * $xb + $colors['blue'] * $xa;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , ceil ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$y ++;
}
}
}
}
?>
// door Daniel Dingemanse voorbeelden op http://rotterdamned.com/statistieken/grafieken/
$titel = "bezoekers";
// array op deze manier genereren $hoofdarray = array(x-as => y-as)
// bv:
$hoofdarray = array(
"1-1" => 45,
"2-1" => 35,
"3-1" => 42,
"4-1" => 46,
"5-1" => 51,
"6-1" => 49,
"7-1" => 33,
"8-1" => 39,
"9-1" => 40,
"10-1" => 34
);
$gebied_breedte = 400; // grootte van de grafiek zelf (zonder randen)
$gebied_hoogte = 200; // hoogte van de grafiek zelf (zonder randen)
$rand_links = 20; // de breedte van de linker rand (hou rekening met de lengte van de waardes die op de y-as komen, in toekomst misschien automatisch)
$rand_rechts = 10; // de breedte van de rechter rand
$rand_onder = 40; // de rand onder de grafiek (hou rekening met de lengte van de waardes die op de x-as komen, in toekomst misschien automatisch)
$rand_boven = 30; // de rand boven (hou rekening met de titel die hier in komt)
$hor_lijnen = 4; // het aantal verdelingen van de y-as
$hor_raster = TRUE; // horizontale lijnen zichtbaar?
$ver_lijnen = 10; // het aantal verdelingen van de x-as
$ver_raster = FALSE; // verticale lijnen zichtbaar?
$grafiek_titel = $titel; // de titel van de grafiek
header("Content-type: image/png");
if(function_exists("ImageCreateTrueColor"))
{
$plaatje = ImageCreateTrueColor(($gebied_breedte + $rand_rechts + $rand_links), ($gebied_hoogte + $rand_onder + $rand_boven));
}
else
{
$plaatje = ImageCreate(($gebied_breedte + $rand_rechts + $rand_links), ($gebied_hoogte + $rand_onder + $rand_boven));
}
$zwart = ImageColorAllocate($plaatje, 000, 000, 000);
$wit = ImageColorAllocate($plaatje, 255, 255, 255);
$grijs = ImageColorAllocate($plaatje, 225, 225, 225);
$lijn = ImageColorAllocate($plaatje, 000, 000, 255); // blauwe grafieklijn
imagefill($plaatje,1,1,$wit);
// zwarte rand of niet:
//imagefilledrectangle($plaatje, 1, 1, ($gebied_breedte + $rand_rechts + $rand_links - 2), ($gebied_hoogte + $rand_onder + $rand_boven -2), $wit); //
imagefilledrectangle($plaatje, ($rand_links + 1), ($rand_boven + 1), ($rand_links + $gebied_breedte - 1), ($rand_boven + $gebied_hoogte -1), $grijs);
$hoogste = 1;
foreach($hoofdarray as $key => $value)if($value > $hoogste)$hoogste = $value;
$style=array($zwart, $zwart, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT );
imagesetstyle($plaatje,$style);
$waarde = 1;
for($y = $rand_boven;$y < ($gebied_hoogte + $rand_boven + 1);$y += ($gebied_hoogte / $hor_lijnen))
{
$align = $rand_links - 3 - strlen(round($hoogste * $waarde)) * 5;
imagestring($plaatje, 2, $align, $y - 7 , round($hoogste * $waarde), $zwart);
if($hor_raster)imageline($plaatje, $rand_links, $y, ($rand_links + $gebied_breedte), $y, IMG_COLOR_STYLED);
$waarde -= (1 / $hor_lijnen);
}
$aantal = count($hoofdarray);
$interval = $gebied_breedte / ($aantal - 1);
$yinterval = $gebied_hoogte / $hoogste;
$x = $rand_links;
$coords = array();
$ticker = 0;
$numdates = round($aantal / $ver_lijnen);
if($numdates < 1)$numdates = 1;
foreach($hoofdarray as $xas => $yas)
{
$coords[$ticker]["x"] = round($x);
$coords[$ticker]["y"] = ($rand_boven + $gebied_hoogte) - (round($yas * $yinterval));
if($ticker / $numdates == round($ticker / $numdates) || $ticker == 0 || $ticker == $aantal-1)
{
$align = ($gebied_hoogte + $rand_boven) + (strlen($xas) * 5) + 5;
imagestringup($plaatje, 2 , round($x) - 7 , $align, $xas ,$zwart);
if($ver_raster)imageline($plaatje, round($x) , $rand_boven , round($x) , ($rand_boven + $gebied_hoogte), IMG_COLOR_STYLED);
}
$x += $interval;
$ticker++;
}
for($a = 0;$a < count($coords)-1;$a++)
{
imagesmoothline($plaatje, $coords[$a]["x"] , $coords[$a]["y"] , $coords[$a+1]["x"] , $coords[$a+1]["y"], $lijn);
}
imagerectangle($plaatje, $rand_links, $rand_boven, ($rand_links + $gebied_breedte), ($rand_boven + $gebied_hoogte), $zwart);
imagestring($plaatje, 4 , ((($rand_links + $rand_rechts + $gebied_breedte) / 2) - ((strlen($grafiek_titel) / 2) * 8)) , ($rand_boven / 2) - 8 , $grafiek_titel , $zwart);
ImagePNG($plaatje);
ImageDestroy($plaatje);
// functie voor de anti-aliasing van de grafieklijn (van php.net)
function imagesmoothline ( $image , $x1 , $y1 , $x2 , $y2 , $color )
{
$colors = imagecolorsforindex ( $image , $color );
if ( $x1 == $x2 )
{
imageline ( $image , $x1 , $y1 , $x2 , $y2 , $color ); // Vertical line
}
else
{
$m = ( $y2 - $y1 ) / ( $x2 - $x1 );
$b = $y1 - $m * $x1;
if ( abs ( $m ) <= 1 )
{
$x = min ( $x1 , $x2 );
$endx = max ( $x1 , $x2 );
while ( $x <= $endx )
{
$y = $m * $x + $b;
$y == floor ( $y ) ? $ya = 1 : $ya = $y - floor ( $y );
$yb = ceil ( $y ) - $y;
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , floor ( $y ) ) );
$tempcolors['red'] = $tempcolors['red'] * $ya + $colors['red'] * $yb;
$tempcolors['green'] = $tempcolors['green'] * $ya + $colors['green'] * $yb;
$tempcolors['blue'] = $tempcolors['blue'] * $ya + $colors['blue'] * $yb;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , $x , floor ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , ceil ( $y ) ) );
$tempcolors['red'] = $tempcolors['red'] * $yb + $colors['red'] * $ya;
$tempcolors['green'] = $tempcolors['green'] * $yb + $colors['green'] * $ya;
$tempcolors['blue'] = $tempcolors['blue'] * $yb + $colors['blue'] * $ya;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , $x , ceil ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$x ++;
}
}
else
{
$y = min ( $y1 , $y2 );
$endy = max ( $y1 , $y2 );
while ( $y <= $endy )
{
$x = ( $y - $b ) / $m;
$x == floor ( $x ) ? $xa = 1 : $xa = $x - floor ( $x );
$xb = ceil ( $x ) - $x;
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , floor ( $x ) , $y ) );
$tempcolors['red'] = $tempcolors['red'] * $xa + $colors['red'] * $xb;
$tempcolors['green'] = $tempcolors['green'] * $xa + $colors['green'] * $xb;
$tempcolors['blue'] = $tempcolors['blue'] * $xa + $colors['blue'] * $xb;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , floor ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , ceil ( $x ) , $y ) );
$tempcolors['red'] = $tempcolors['red'] * $xb + $colors['red'] * $xa;
$tempcolors['green'] = $tempcolors['green'] * $xb + $colors['green'] * $xa;
$tempcolors['blue'] = $tempcolors['blue'] * $xb + $colors['blue'] * $xa;
if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
imagesetpixel ( $image , ceil ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
$y ++;
}
}
}
}
?>
graag hulp!
bedankt!
groetjes,
wouter
Edit:
als er niks bij een bepaalde datum uit de database komt, moet er natuurlijk ook gewoon 0 in de grafiek komen te staan;) (weet niet of hij dit standaard doet of dat je anders foutmeldingen krijgt...)
als er niks bij een bepaalde datum uit de database komt, moet er natuurlijk ook gewoon 0 in de grafiek komen te staan;) (weet niet of hij dit standaard doet of dat je anders foutmeldingen krijgt...)
Gewijzigd op 18/03/2011 11:19:45 door Wouter bakker
Ja, dat valt allemaal mee, wat je vraagt.
Een maand heeft altijd ongeveer evenveel dagen, dus horizontaal zullen we niet te veel moeten rekken en krimpen.
Verticaal uitrekken is sowieso geen probleem. Waar je wel op moet letten: een grafiek hoort niet te stoppen bij 51; de horizontale hulplijnen (inclusief het maximum) horen op afgeronde waarden te staan.
Nu ja, dat valt allemaal mee hoor; ik zal eens zien wat ik kan doen.
ik heb dus geen idee hoe ik dit moet doen... xD
is er ook een manier om de grafiek af te ronden, nu is het allemaal zo hoekig...