Stats met MySQL

Door Robert Deiman, 20 jaar geleden, 5.973x bekeken

Deze post ik eigenlijk meer als reactie op het script van ick-in-noot. Het maakt gebruik van een database en telt unieke id's maar 1 keer per dag mee in het totaalplaatje.
Daarnaast is het dus heel eenvoudig andere statistieken te bepalen en op te halen.

De SQL database ziet er zo uit:
CREATE TABLE visitors (
id int(6) NOT NULL auto_increment,
ip varchar(15) collate latin1_general_ci NOT NULL,
online datetime NOT NULL,
PRIMARY KEY (`id`)
)

(waarom varchar voor IP -> Omdat de meesten nog met MySQL werken, heb ik het daarop gemaakt)

Edit:

Ik heb de code wat aangepast, eerst controle over de opgehaalde query's. Daarnaast heb ik ook een voorbeeld online gezet


Edit:

13-12-'07 om 12:34:
Een aantal opmerkingen van hieronder zijn verwerkt, foutafhandeling nu correct toegevoegd, MySQL in ANSI modus (strict) gezet in het script, en de query's op een nettere manier in het script gezet. (meerregelig -> Leesbaarder)

Bedankt allen voor de tips!

Voorbeeld: http://www.robertdeiman.net/phphulp/stats/

Gesponsorde koppelingen

PHP script bestanden

  1. stats-met-mysql

 

Er zijn 19 reacties op 'Stats met mysql'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Quote:
ip varchar(15) collate latin1_general_ci NOT NULL
ipv6?
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
Met mysql kan je toch verschillende typen velden aanmaken? Ik heb ooit gezien dat een ip ook in een ander soort veld kan alleen ik weet niet meer precies welke. Was ik van de week nog naar op zoek.

Iemand nog suggesties? pgFrank?
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
In MySQL niet. In postgreSQL heb je het INET datatype dat geschikt is voor ip adressen...
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
inet en cidr inderdaad
Pieter van Linschoten
Pieter van Linschoten
20 jaar geleden
 
0 +1 -0 -1
Heb je hier ook een voorbeeldje van op het web staan. Hij is momenteel wel snel uitgeteld, zonder bezoekers ;)
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
ohw, ik dacht in mysql ook...
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Dan zul je alleen de else waarin je de waarde 0 toekent aan die variabele wel aan het buitenste if-statement moeten verbinden. Dus aan die waarin je controleert of de query lukt...

Quote:
en is ook meteen IPv6 geschikt
Dit adres gaat niet in een varchar(15) passen, dus niet echt geschikt voor ipv6:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2001:0db8:85a3:08d3:1319:8a2e:0370:7334
Wouter K
Wouter K
20 jaar geleden
 
0 +1 -0 -1
Nu zou het nog handig zijn om te zien welke Ip's er zijn geweest , :p
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
wouter:
Nu zou het nog handig zijn om te zien welke Ip's er zijn geweest , :p
Enkel deze eenvoudige query is al voldoende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT DISTINCT(ip) FROM visitors
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
Deze query is een geldige query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
    COUNT( id ) AS unique_day,
    DATEDIFF(NOW(),DATE(online)) AS date
FROM
    visitors
GROUP BY
    DATE(DATEDIFF(NOW(),DATE(online))), online
ORDER BY
    unique_day DESC,
    online DESC
LIMIT 1

Of het ook de gewenste resultaten ophaalt, dat is een ander verhaal. Maar je kunt nooit een groep aanmaken en dan een detail van een enkel record opvragen. Hoe moet MySQL weten van welk record het detail afkomstig moet zijn? Daar kun je alleen naar raden. In ANSI-mode wordt de oorspronkelijke query (als het goed is...) dan ook afgekeurd.

Stel in je scriptje nog even de juiste SQL-mode in, dan heb je dat ook direct goed voor elkaar.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SET SESSION sql_mode = 'ANSI';
En daarna pas de overige queries uitvoeren.
Mebus  Hackintosh
Mebus Hackintosh
20 jaar geleden
 
0 +1 -0 -1
Ho wacht even.. MySQL, ip als int opslaan kan niet?

Zeker wel: http://dev.mysql.com/doc/refman/4.1/en/miscellaneous-functions.html
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Ja je kunt het als INT opslaan en dan die functies gebruiken ja. Maar er is geen inet datatype voor.

Robert, overigens vind ik niet dat je je bovenin hoeft te verontschuldigen voor varchar als IP. Lees de reacties nog maar eens, het was gewoon even een uitleg aan anderen hoe je het in Postgres zou kunnen doen.
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Oké, heb het nu allemaal verwerkt, de query's aangepast, mysql in ANSI modus gezet.

Voor IP -> Prima, dat is ook goed. Niet alleen blindstaren op MySQL.

@mebus: Het kan wel door die functies te gebruiken, ik vraag me alleen af of dat echt nuttig is om op die manier te doen. Alle query's worden dan wel heel erg "alleen MySQL".

Edit:

Het leuke van het werken met zo'n opgebouwde database is dat je het heel eenvoudig uit kan breiden, zodat je bijvoorbeeld een grafiek krijgt met het aantal bezoekers per dag voor een opgevraagde maand. Ook per jaar (en dan bijvoorbeeld het aantal bezoekers per week, of misschien per maand) is dit een prima mogelijkheid.
Ik denk ook dat ik nu wel heb laten zien dat de mogelijkheden van het werken met een tabel een stuk groter zijn dan het werken met textfiles.
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
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
<?
$sql_max_day
= "
    SELECT
        COUNT( id ) AS unique_day,
        DATEDIFF(NOW(),DATE(online)) AS date
    FROM
        visitors
    GROUP BY
        DATE( online ),
        DATEDIFF(NOW(),DATE(online))
    ORDER BY
        unique_day DESC,
        online DESC
    LIMIT
        1"
;
?>


Ik snap deze query niet. Je doet een dubbele group by en order by en vervolgens ook een limit 1. Volgens mij is deze query vrij omslachtig.
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
@PHPERIK

Dat heeft ermee te maken dat ik de meest recente datum waarop het maximum aantal bezoekers (dit kunnen meerdere data zijn) online waren weer wil geven. Dus eerst op het aantal bezoekers, en daarna op de datum sorteren.

@Allen
Ik ben ook bezig om dit allemaal om te zetten naar PDO.. Pff, gebruikte iedereen het maar, omzetten is rotwerk, maar als je het gebruikt is het gemakkelijk naar een andere db overstappen..
Jesse Degger
Jesse Degger
20 jaar geleden
 
0 +1 -0 -1
Wow ik word geowned :D mijn respect ;)
Robbin
Robbin
20 jaar geleden
 
0 +1 -0 -1
Ik snap het niet helemaal, ik wil de statestieken van mijn domein hebben.
Nu heb ik een mapje stats gemaak met hierin bovenstaand script en connect.php naar mysql database alleen krijg ik nu de statestieken van het stats mapje terwijl ik dit van mijn hoofd domein wil.. wat nu
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
@Robbin

Je moet deze file ook includen (ongeveer bovenin, let wel op dat hier ook session_start(); in staat) in je index.php. Het onderste stukje met de echo 's erin van de aantallen kan je dan plaatsen waar je het maar wil.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


19 jaar geleden
 
0 +1 -0 -1
Lekkere foutmeldingen op je website robert



Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'web93-annaweb'@'localhost' (using password: YES) in /home/sites/robertdeiman.net/public_html/phphulp/stats/connect.php on line 5

Notice: Het maken van de verbinding met de database is mislukt in /home/sites/robertdeiman.net/public_html/phphulp/stats/connect.php on line 5

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /home/sites/robertdeiman.net/public_html/phphulp/stats/connect.php on line 6

Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 9

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 9
werkt niet in ANSI modus
Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 23

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 23

Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 99

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 99

Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 107

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 107

Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 115

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 115

Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 132

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 132

Warning: mysql_query() [function.mysql-query]: Access denied for user 'robertdeiman.net'@'localhost' (using password: NO) in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 141

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 141
Datum: 2009-06-27
Nu online:
Notice: Undefined variable: row_now_online in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 152

Totaal bezoekers:
Notice: Undefined variable: row_unique in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 153

Max per dag:
Notice: Undefined variable: row_max_day in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 154

Wanneer:
Notice: Undefined variable: row_max_day in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 155

Gemiddeld:
Notice: Undefined variable: row_unique in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 158

Notice: Undefined variable: row_count_avg in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 158

Warning: Division by zero in /home/sites/robertdeiman.net/public_html/phphulp/stats/index.php on line 158

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

Inhoudsopgave

  1. stats-met-mysql

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.