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!
[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