Views tellen
Ik wil graag het aantal views van bepaalde pagina's/artikelen gaan bijhouden en probeer een beetje te bedenken hoe je dat het beste kan doen.
Je zou natuurlijk kunnen denken gewoon +1 in een views kolom maar dan kan iemand views gaan lopen krikken door telkens de pagina te vernieuwen.
Hoe kan ik beste het aantal views bijhouden?
Ideeën, tips, eigen evaringen?
Alvast bedankt!
Beetje dit:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
if(!isset($_SESSION['views']][$pagina]))
{
mysql_query("UPDATE tabel ... .etc"); // Met foutafhandeling...
$_SESSION['views'][$pagina] = true;
}
?>
if(!isset($_SESSION['views']][$pagina]))
{
mysql_query("UPDATE tabel ... .etc"); // Met foutafhandeling...
$_SESSION['views'][$pagina] = true;
}
?>
Kan je dus gewoon in je header downloaden.
Voor iedere pagina ($pagina) kan je dus apart de views bijhouden.
En ja: een gebruiker kan inderdaad de browser afsluiten en daarna terugkomen voor NOG een bezoek. Dat is niet/nauwelijks tegen te gaan.
Maar F5-en werkt niet.
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
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
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$sql = mysql_query('SELECT * FROM tabel');
while($res = mysql_fetch_array($sql))
{
if($ip == $res['ip'])
{
$al_eerder_geweest = true;
}
else
{
$al_eerder_geweest = false;
}
}
if($al_eerder_geweest == true)
{
mysql_query('UPDATE tabel SET timevisited = timevisited + 1');
}
else
{
mysql_query('INSERT INTO tabel(ip) VALUES("'.$ip.'")');
}
?>
$ip = $_SERVER['REMOTE_ADDR'];
$sql = mysql_query('SELECT * FROM tabel');
while($res = mysql_fetch_array($sql))
{
if($ip == $res['ip'])
{
$al_eerder_geweest = true;
}
else
{
$al_eerder_geweest = false;
}
}
if($al_eerder_geweest == true)
{
mysql_query('UPDATE tabel SET timevisited = timevisited + 1');
}
else
{
mysql_query('INSERT INTO tabel(ip) VALUES("'.$ip.'")');
}
?>
of niet ?
Edit:
script aangepast
script aangepast
Gewijzigd op 01/01/1970 01:00:00 door Ivo K
Nadeel (ja, die zijn er ook) is dat veel mensen 1 ip-adres delen. Denk bijvoorbeeld aan bedrijven en scholen. Met een beetje geluk deelt een hele scholengemeenschap één enkel ip-adres. Dus wanneer er 500 studenten zijn die individueel lekker met hun schoolcomputer of laptop op school jouw pagina aanroepen, zie jij het als slechts 1 view.
En dan zijn er nog de mensen die wisselen van IP. Bij die mensen verandert het ip-adres soms wanneer ze de router opnieuw starten, dus met een beetje geluk valt het aantal veranderingen mee. En daarnaast zou dit slechts 2 of 3 extra views van slechts enkele personen opleveren. Ik denk niet dat je je hier zorgen over hoeft te maken.
Nu terugkomend op die database-structuur; persoonlijk zou ik een tabel (bijv. "visitors") bijhouden met alle ip-adressen en welke pagina ze hebben opgevraagd, en geen UPDATE-query loslaten op de tabel met je pagina's. Via een query met COUNT() erin kan je dan het aantal bezoeken van een artikel ophalen door te tellen hoeveel ip-adressen in de tabel "visitors" de pagina op hebben gehaald. Je kan daarnaast ook meteen kijken hoeveel pagina's 1 ip-adres heeft opgevraagd :) En later, wanneer je site succesvol is, kan je het relatief gemakkelijk optimaliseren door te werken met truucjes waarbij je ervan profiteert dat een INSERT-query meestal lichter is dan een UPDATE-query. Én je kan misbruik terugdraaien door gewoon wat regels uit je visitors-tabel te gooien :)
Later kan je alle statistieken maken die je wil. Meeste view per maand, ingelogden, ...
Ps een paar views extra is geen probleem: immers, als 1 persoon de pagina 2x bekijkt, dan zijn dat toch ook 2 views?
Wat jij wilt is bezoekers tellen... en dat is wat anders dan views ;).
Nou eigenlijk views, maar iemand die 100 x op F5 drukt heeft niet 100 x iets bekeken.
id, tijd, IP, pagina
Dan kan je later nog query's maken die rekening houden met wat je net zei.
Je hebt gelijk hoor. Ik hoorde ooit iemand zeggen:
Hits is de afkorting voor "How Idiots Translate Succes".
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
Voor de anonieme bezoekers weet ik niet of ik beter het ip-adres kan gebruiken - dat is immers niet echt uniek zoals jelmer zegt - of gewoon een sessie starten die ook 24 uren duurt en het sessionid gebruiken om te kijken hoe lang geleden de laatste view was. Dit valt wel weer te omzeilen door je cookie's te wissen maar het is iniedergeval omslachtiger voor de neppert dan om op F5 te drukken.
SESSIES zijn NIET hetzelfde als COOKIES!
Ik vind het nogal ver gaan om een hele grote tabel (denk aan: 1000 bezoekers per dag, gemiddeld 10 pagina's per persoon... is 10.000 records per dag erbij.... na een jaar... vat u hem?).
Gewoon 1 teller met 1 kolom met 1 record (of meerdere als je per pagina/artikel wil bijhouden).
Met SESSIES (en eventueel cookies, maar dat is alweer zo veel trager voor een bezoekersteller) werken moet voldoende zijn.
En zeg nou eens eerlijk: wie er zo stom om 100x zijn browser af te sluiten en weer op te starten om een pagina-view met 100 te vermeerderen?
En waarom zou ik niet 5x op een dag eendezelfde pagina (nieuwspagina van nu.nl oid?) kunnen bekijken?
Voor een teller als dit zou ik echt niet te moeilijk gaan doen.
Of gebruik GoogleAnalystics (vind ik erg goed!) OF hou het zelf bij met een simpel tellertje.
Maar om alle gebruikers te loggen.... dat vind ik totaal niet nodig.
Als ik een sessie start dan word een cookie met PHPSESSID aangemaakt en je sessionid. Als die verwijdert wordt dan is je sessie weg.
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
http://www.phphulp.nl/php/scripts/3/1198/
Ik hoop dat je er wat aan hebt.
Gewijzigd op 01/01/1970 01:00:00 door Loran DP
Deze heb ik inderdaad wel geschreven, maar deze voldoet ook zeker niet aan jou eisen.. Dit script telt het totaal aantal bezoekers en niet het aantal views per pagina.
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
Het ligt er een beetje aan: Wil je dat het tellertje exact is, of mag hij ook een paar views achterlopen? Als hij niet heel precies hoeft te zijn kan je een soort van cache gebruiken die eens in de zoveel minuten wordt ververst waardoor het tellen relatief heel weinig gebeurt.
Maar dat soort optimalisaties zou ik pas uitvoeren wanneer er tekens zijn dat je server er moeite mee krijgt. Op dit moment is je site nog klein, neem ik aan, en hoeft de database amper moeite te doen. Het is wel handig om er nu vast rekening mee te houden maar zolang je je code een beetje netjes en je jezelf niet te veel herhaalt (en dus gebruik maakt van functies?) zou zo'n aanpassing later geen moeite moeten zijn.
Hamvraag is: wil je wat met de data, later of nu?
Je kan trouwens af en toe een backup nemen en de tabel legen vanaf een bepaalde tijd.
Henk schreef op 25.09.2008 23:06:
Wanneer je alles op bierviltjes wilt gaan bijhouden, dan is het wat veel. Wanneer je de boel in een database gaat bijhouden, stelt het niets null noppes nada voor. Hoeveel miljard records wil je gaan opslaan? 25 miljard? Geen probleem. Gebruik een BIGINT om de id's in op te slaan en je kunt bijna tot in eeuwigheid doorgaan.Ik vraag me ook af, als die tabel na een tijdje propvol zit, wordt het dan niet enorm traag om alles op de tellen en te selecteren? Is een rij per view niet nogal veel?
Snelheid ligt meer aan de door jou gekozen indexen en de door jou opgestelde queries, dan die paar records die jij wilt opslaan. Gebrek aan snelheid duidt dan ook vaak op een gebrek aan SQL kennnis. Dat zijn dan ook de momenten om weer even in de handleidingen te duiken!
Emmanuel Delay schreef op 25.09.2008 18:22:
Da's een fraaie!Hits is de afkorting voor "How Idiots Translate Succes".