I'm trying to develop a set of functions that can handle the statistics of a website. I want them to be as flexible as possible, and i want to be able to have several different "views" (day, week, month, year). For example if i wanted to know how many visitors, visits and page hits there was each month last year, i could call the function like this:

        $months = Statistics::getStats(STAT_VIEW_YEAR, 2004);

        foreach ($months as $month) {
                echo $month['visitors'];
                // ...
        }

I'm thinking of doing it like this:

        <?php

        class Statistics
        {
                public static function logPageView ()
                {
                        global $db; // $db is just a MySQL object interface

                        $ip = $_SERVER['REMOTE_ADDR'];
                        $ex = STATS_SESSION_EXPIRE;

$result = $db->query("UPDATE `statistics` SET `visit_end` = NOW() AND `hits` = `hits`+1 WHERE `ip` = '$ip' AND NOW()-`visit_end` < $ex ORDER BY `visit_start` DESC LIMIT 1");

if ($db->affectedRows() !== 1) {
$db->query("INSERT INTO `statistics` (ip, visit_start, visit_end) VALUES ('$ip', NOW(), NOW())");
}
}

public static function getStats ($view = STATS_VIEW_DAY, $date)
{
global $db;

switch ($view) {
case STATS_VIEW_YEAR:
$sql = "YEAR(visit_start) = $date GROUP BY MONTH(visit_start) ORDER BY MONTH(visit_start)";
break;
// More cases
default:
return FALSE;
}


return $db->query("SELECT COUNT(DISTINCT ip) AS visitors, COUNT(*) AS visits, SUM(hits) AS hits FROM `statistics` WHERE " . $sql)->fetchArray();
}
}


        ?>

Is there a simpler way of approaching this?

--
Daniel Schierbeck

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to