Scripts

Stats met MySQL

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) Ik heb de code wat aangepast, eerst controle over de opgehaalde query's. Daarnaast heb ik ook een voorbeeld online gezet 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!

stats-met-mysql
[code]
<?php
session_start();
ini_set('display_errors', 1);
error_reporting(E_ALL);

//onderstaand bestandje zorgt voor de verbinding met de database.
require_once 'connect.php';
$sql_ansi = "SET SESSION sql_mode = 'ANSI'";
if(!mysql_query($sql_ansi)){
	echo 'werkt niet in ANSI modus';
	}
//query voor bekijken of er al iemand met dit ip eerder op de dag online is geweest
$getsql = "
	SELECT 
		id 
	FROM 
		visitors 
	WHERE 
		ip = '".$_SERVER['REMOTE_ADDR']."' 
	AND 
		DATE(online) = CURDATE() LIMIT 1";
		//Limit 1 toegevoegd, omdat die als er 1 is gevonden, niet verder hoeft te zoeken.
if($getresult = mysql_query($getsql)){
	if(mysql_num_rows($getresult) == 1){
		//is al eerder online geweest vandaag, alleen tijd aanpassen
		$statsql = "
		UPDATE 
			visitors 
		SET 
			online = NOW() 
		WHERE 
			ip = '".$_SERVER['REMOTE_ADDR']."' 
		AND 
			DATE(online) = DATE(NOW())";
			
		}
	else{
		//nog niet eerder online geweest, maak een nieuwe regel aan
		$statsql = "
		INSERT INTO 
			visitors 
				(ip, online) 
			VALUES 
				('".$_SERVER['REMOTE_ADDR']."',NOW())";
		}
	if(!mysql_query($statsql)){
		echo 'Gegevens niet bijgwerkt wegens een fout in de SQL code.';
		}
	}


//---------- HIER IS ALLEEN VOOR WEERGAVE VAN STATISTIEKEN ------
// hier worden het aantal bezoekers geteld die op je site zijn geweest. Een IP telt maar 1 keer per dag
$sql_unique = "
	SELECT 
		COUNT(id) AS number 
	FROM 
		visitors";
// deze query haalt het aantal bezoekers op dat in de afgelopen 5 minuten online was		
$sql_now_online = "
	SELECT 
		COUNT(id) AS now_online 
	FROM 
		visitors 
	WHERE 
		TIMEDIFF(NOW(),online) < '00:10:00'";
// deze query haalt het maximum aantal bezoekers op een dag op + de bijbehorende datum. -> Stel dat er 2 dagen zijn dat het maximum is bereikt, hier geeft die de laatste datum weer. (meest recente)		
$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";
// Deze query bepaald het aantal dagen dat de teller actief is.
$sql_count_avg = "
	SELECT 
		DATEDIFF( CURDATE( ) , MIN( DATE( online ) ) ) AS days
	FROM 
		visitors";
if($result_unique = mysql_query($sql_unique)){
	if(mysql_num_rows($result_unique) >= 1){
		$row_unique = mysql_fetch_assoc($result_unique);
		}
	else{
		$row_unique['number'] = 0;
		}
	}
if($result_now_online = mysql_query($sql_now_online)){
	if(mysql_num_rows($result_now_online) >= 1){
		$row_now_online = mysql_fetch_assoc($result_now_online);
		}
	else{
		$row_now_online['now_online'] = 0;
		}
	}
if($result_max_day = mysql_query($sql_max_day)){
	if(mysql_num_rows($result_max_day) >= 1){
		$row_max_day = mysql_fetch_assoc($result_max_day);
		}
	else{
		$row_max_day['unique_day'] = 0;
		}
	if($row_max_day['date'] == 0){
		$row_max_day['date'] = 'Vandaag';
		}
	elseif($row_max_day['date'] == 1){
		$row_max_day['date'] = $row_max_day['date'].' dag geleden';
		}
	else{
		$row_max_day['date'] = $row_max_day['date'].' dagen geleden';
		}
	}
if($result_count_avg = mysql_query($sql_count_avg)){
	if(mysql_num_rows($result_count_avg) >= 1){
		$row_count_avg = mysql_fetch_assoc($result_count_avg);
		}
	else{
		$row_count_avg['days'] = 0;
		}
	}
?>
<strong>Datum:</strong> <?php echo date('Y-m-d') ?><br />
<strong>Nu online:</strong> <?php echo $row_now_online['now_online']; ?><br />
<strong>Totaal bezoekers:</strong> <?php echo $row_unique['number']; ?><br />
<strong>Max per dag:</strong> <?php echo $row_max_day['unique_day']; ?><br />
<strong>Wanneer:</strong> <?php echo $row_max_day['date']; ?><br />
<strong>Gemiddeld:</strong> <?php 
// dit was overigens ook prima via SQL te berekenen, maar deze gegevens had ik reeds verkregen, vandaar via de PHP manier
echo round($row_unique['number']/$row_count_avg['days']); ?><br />
<strong>Dagen online:</strong> <?php echo $row_count_avg['days']; ?>
[/code]

Reacties

0
Nog geen reacties.