Grafiek met unieke bezoekers

Door Snotty , 16 jaar geleden, 3.018x bekeken

Dit script registreert per bezoeker die je site bezoekt het ip-adres en de datum waarop men de site bezoekt. Per dag wordt maar één keer je ip-adres geteld. De gegevens worden in een grafiek geplaatst per maand. Enkel de voorbije 12 maanden worden weergegeven in de grafiek.

De mysql-code:
CREATE TABLE `bezoek` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(50) NOT NULL,
`datum` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

Er zijn 3 bestanden:
- connect.php: hierin moet je uiteraard je database gegevens zetten
- afb.php: dit is de grafiek
- bezoek.php: dit kan je op elke pagina includen waar je bezoekers wilt tellen.

Dit is denk ik alles dat je moet weten over het script. Het is m'n eerste script met de GD library dus er zullen waarschijnlijk nog wel fouten inzitten :).

Het script is NIET OOP ;).

Voorbeeld: http://www.olympia-rockrally-be.nl02.members.pcextreme.nl/af

Gesponsorde koppelingen

PHP script bestanden

  1. grafiek-met-unieke-bezoekers

 

Er zijn 17 reacties op 'Grafiek met unieke bezoekers'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Derk nvt
Derk nvt
16 jaar geleden
 
0 +1 -0 -1
Wat maakt dat dit alleen op PHP 5 werkt? volgens mij moet dit ook wel werken op PHP4 of ben ik nu gek?
Cyberboy fdsafds
Cyberboy fdsafds
16 jaar geleden
 
0 +1 -0 -1
Gaaf script, is wel een beter idee, die staaf grafieken ipv lijn.
Maar maak gewoon even een klasse, dan kun je het gemakkelijk aanroepen en hoef je ook niet meer in het script te prutsen.
Maarja, dat is een keuze opzich ik vind het makkelijker. Maar als nog mijn complimenten!
Snotty
snotty
16 jaar geleden
 
0 +1 -0 -1
@Derk: ik heb het script gemaakt in PHP5 en heb het niet getest op PHP4, maar kan inderdaad zijn dat het daar ook werkt hoor :-).

@Marcel Boersma: ik heb nog niet echt veel ervaring met klassen, vandaar dat ik het zonder heb gedaan. Ik ga me eerst nog wat verder daarin verdiepen en dan misschien een v2 maken met klassen zodat het eenvoudiger wordt om aan te passen. En bedankt voor het compliment :-).
- -
- -
16 jaar geleden
 
0 +1 -0 -1
[bijdehandje-die-denkt-grappig-te-zijnmodus]
Ik heb al veel ervaring met klassen, ik zit er al vanaf groep één in!
[/bijdehandje-die-denkt-grappig-te-zijnmodus]

Deze ga ik zeker op mijn site zetten!! Ik zocht nog zoiets =D
- -
- -
16 jaar geleden
 
0 +1 -0 -1
Kijk:

http://www.battleofthesea.nl/stats.php

Ik heb het script even aangepast, zodat je het ook per dag kunt zien. Dit is de code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

include('connect.php');

// afbeelding maken
header("content-type: image/png"); // soort afbeelding
$image = imagecreate(261, 320); // grootte van de afbeelding (360*200)

// kleuren instellen (RGB waarden)

$achtergrond = imagecolorallocate($image, 234, 234, 234); // achtergrondkleur
$verticale = imagecolorallocate($image, 224, 224, 224); // horizontale en verticale rechten
$zwart = imagecolorallocate($image, 0, 0, 0); // tekst
$grey = imagecolorallocate($image, 180, 180, 180); // balkjes

// verticale strepen trekken

$a=63; // startpunt linker-verticale
for($i=0;$i<7;$i++)
{

    imageline($image, $a, 0, $a, 300, $verticale);
    $a +=33; // afstand tot linkerkant telkens verhogen
}

// horizontale strepen trekken
$b=0; // startpunt bovenste horizontale
for($i=0;$i<10;$i++)
{

    imageline($image,30,$b,426,$b,$verticale);
    $b +=30; // afstand tot bovenkant telkens verhogen
}

// gegevens uit database halen per maand en in array steken
$next = date("w")+1; // volgende dag
if($next == 7)
    {

        $next = 0;
    }

$vorig_jaar = date("Y")-1; // vorig jaar
$dit_jaar = date("Y"); // dit jaar
$deze_week = date("W")+1; // deze week (1 tot 52)
$vorige_week = date("W"); // vorige week (1 tot 52)
for($i=$next;$i<7;$i++)
{
// dagen vorige week
    $sql = "SELECT id FROM bezoek WHERE date_format(datum, '%w') = '".$i."' AND date_format(datum, '%Y') = '".$dit_jaar."' AND date_format(datum, '%V') = '".$vorige_week."'";
    $query = mysql_query($sql);
    if(!$query)
      {

                echo mysql_error();
                exit();
            }

    $aant_bez = mysql_num_rows($query);
    $dag_bez[] = $aant_bez; // aantallen in array steken
}
if($i>=6)
{
// dagen deze week
    for($i=0;$i<=$next;$i++)
    {

        $sql = "SELECT id FROM bezoek WHERE date_format(datum, '%w') = '".$i."' AND date_format(datum, '%Y') = '".$dit_jaar."' AND date_format(datum, '%V') = '".$deze_week."'";
            $query = mysql_query($sql);
            if(!$query)
              {

                        echo mysql_error();
                        exit();
                    }

        $aant_bez = mysql_num_rows($query);
        $dag_bez[] = $aant_bez; // aantallen in array steken
    }
}


// balken weergeven
$maximum=max($dag_bez); // getal selecteren van de dag met meeste bezoekers
$var_opt=34; // startpunt balk tot linker verticale streep
$var_opt2=59; // startpunt balk tot rechter verticale streep
if($maximum == 0) // als maximum 0 is gaat ie zometeen delen door 0, en dat kan niet!!
    {
        $maximum = 1; // daarom zetten we maximum op 1 als ie 0 zou zijn.
    }
for($i = 0; $i < 7; $i++)
{

    $hoogte = ( $dag_bez[$i] / ( $maximum ) ) * 300; // hoogte van je balkje bepalen
    $hoogte = round($hoogte, 0);
    $tot = 300 - $hoogte;
    imagefilledrectangle($image,$var_opt,$tot,$var_opt2,300,$grey); // balkje tekenen
    $var_opt+=33; // telkens 33 px opschuiven nr rechts
    $var_opt2+=33; // telkens 33 px opschuiven nr rechts
}

// namen van de dagen weergeven
$dagen_ned = array("Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag");
$dag_eng = date("w");
$a = 42; // afstand tot linker verticale streep
for($i=$dag_eng;$i<7;$i++)
{

    $dag_ned = $dagen_ned[$i];
    $dag_ned = substr($dag_ned,0,2);
    imagestring($image, 2, $a, 304, $dag_ned, $zwart);
    $a += 33;
}

if($i==7)
{

    for($i=0;$i<$dag_eng;$i++)
    {

        $dag_ned = $dagen_ned[$i];
        $dag_ned = substr($dag_ned,0,2);
        imagestring($image, 2, $a, 304, $dag_ned, $zwart);
        $a += 33;
    }
}


// aantallen links plaatsen
$b = 1;
for($i = 10; $i > -1; $i--)
{
// 10 getallen weergeven, van boven naar beneden
    $getal = $maximum/10*$i; // getal berekenen
    imagestring($image, 1, 3, $b, $getal, $zwart);
    $b += 30;
}


// kader trekken rondom afbeelding
imagerectangle($image,30,0,260,299,$zwart);
imageline($image,33,300,260,300,$achtergrond);

imagepng($image);
imagedestroy($image);
?>


Dit is de grafiek, dus die moet je aanroepen met <img src=""> enz.

edit: bugs eruit gehaald
Josko
josko
16 jaar geleden
 
0 +1 -0 -1
wel nice.
Staaf diagrammen zat ik ook al aan te denken, maar ach =]

voor classes: www.php.net/class
is genoeg ervoor =] en op www.phpfreakz.nl staat een tut erover.

scc6
- -
- -
16 jaar geleden
 
0 +1 -0 -1
En wat dacht je van http://www.phphulp.nl/php/howto/index.php?page=9 ? Dat gaat ook over classes :D
Menno
menno
16 jaar geleden
 
0 +1 -0 -1
dat is vet :P
Snotty
snotty
16 jaar geleden
 
0 +1 -0 -1
@Herjan: ik was nog van plan dat te maken maar jij bent me dus voor :p. Handig, nu moet ik het niet meer doen ;). Een jaaroverzicht zit ik ook aan te denken maar ik denk dat dat pas nut heeft als je een site hebt over meerdere jaren. Maar misschien zal ik er, na mijn vakantie (ik vertrek morgen :D), aan werken.

Ik zal wat opzoeken ivm classen ed en misschien kan je dan over enige tijd een nieuwe versie aanschouwen met classes ;).
- -
- -
16 jaar geleden
 
0 +1 -0 -1
Hmmm, mijn script zit nog vol bugs volgens mij :S Ik ga het ff oplossen en dan dump ik hem hier weer neer.

edit: bugs eruit. Ik weet alleen niet wat er gebeurt als een nieuw jaar met zondag of maandag begint, of als hij in de eerste week van het jaar zit. Het zou dan kunnen dat ie van week 0 gaat selecteren ofzo, maar dat is dan hooguit 1 week per jaar :P

edit2: @snotty: als je het heel uitgebreid wilt doen, kun je ook nog doen rond welke tijd de mensen komen. Gewoon alle records selecteren, per uur groeperen en het gemiddelde berekenen en dat ze je in een grafiek.
Joost
Joost
16 jaar geleden
 
0 +1 -0 -1
Als eerste wil ik snotty even bedanken voor het script, werkt echt perfect :)

Maar ik heb een vraag aan Herjan, op de 1 of andere manier krijg ik niks te zien, terwijl die van snotty het gewoon doet.

van snotty: www.sjikkesdownunder.nl/stats.php
van herjan:www.sjikkesdownunder.nl/stats2.php

Heeft iemand enig id hoe dit kan?
Lissy Pixel
Lissy Pixel
16 jaar geleden
 
0 +1 -0 -1
wellicht mis je een onderdeel in je GD Graphics Library en dit is dus geinstalleerd op de server waar je host. dit effies verrifieren met je hostingsbedrijf en weetje zeker dat dit allemaal OK is dan zou ik het gaan zoeken in je script (dus hier).
T H
T H
16 jaar geleden
 
0 +1 -0 -1
De Firewall van mijn webhost registreerde een mogelijkheid tot mysql injection!
Is dit script daar echt gevoelig voor? Ik kan geen risico's vinden :|

gr, tim
Jason de Ridder
Jason de Ridder
16 jaar geleden
 
0 +1 -0 -1
Ik kan ook geen mysql-injection vinden. Strenge firewall man!
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
@Tim: Weet je wel wat SQL-injection is? Zo ja, dan zou je ook moeten weten dat een firewall dat onmogelijk kan registreren. Het is dus de grootst mogelijke onzin wat je nu roept.

Zo nee, ga je er eerst eens in verdiepen voordat je zo maar iets roept.
T H
T H
16 jaar geleden
 
0 +1 -0 -1
@frank Ik neem aan dat een windows leraar wel weet waarover hij praat, hij had het over firewall, maar het kan netzo goed zijn dat hij gewoon mod_security of een andere security mod ingebruik heeft wat dat als resultaat geeft...

En ja ik weet wat mysql injection is :) en ik weet ook hoe je het kan voorkomen
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jurgen assaasas
Jurgen assaasas
15 jaar geleden
 
0 +1 -0 -1
SQL injection is niet mogelijk als er geen invoervelden zijn of bijv een GET variabel. Enige wat er in dit script gebeurd is het invoegen uitlezen van een db dat je met evt mysql_real_escape_string() nog beter zou kunnen beveiligen. Knappe firewal die in je URL of textfield "INSERT INTO ...." kan lezen ;)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. grafiek-met-unieke-bezoekers

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.