Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/helpers/stats.helper.php
<?php
/**
* @version        $Id: stats.helper.php 1644 2014-12-30 17:19:38Z sannosi $
* @package        Elxis
* @subpackage    Helpers/Simple stats
* @copyright    Copyright (c) 2006-2015 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
elxisStatsHelper {

    private
$statdate = '0000-00-00';
    private
$hash = '';
    private
$newdate = false;
    private
$lang = 'en';


   
/***************/
    /* CONSTRUCTOR */
    /***************/
   
public function __construct() {
       
$this->statdate = gmdate('Y-m-d');
       
$this->lang = eFactory::getLang()->currentLang();
    }


   
/*****************/
    /* TRACK VISITOR */
    /*****************/
   
public function track() {
        if (
defined('ELXIS_ADMIN')) { return false; }
        if (
'ELXIS_INNER' == 1) { return false; }
        if (
defined('ELXIS_STATS_TRACKED')) { return false; }
       
$this->hash = $this->makeUniqueHash();
        if (
$this->hash == '') { return false; }
       
$row = $this->getDateDate();
        if (
$this->newdate == true) {
           
$this->emptyTracker();
           
$this->trackVisit();
           
$lngarr = array();
           
$lngarr[ $this->lang ] = 1;
           
$row->clicks++;
           
$row->visits++;
           
$row->langs = serialize($lngarr);
           
$tracked = $this->insertStats($row);
        } else {
           
$row->clicks++;
           
$row->langs = $this->trackCompressLangs($row->langs);
            if (
$this->firstVisit() == true) {
               
$this->trackVisit();
               
$row->visits++;
            }

           
$tracked = $this->updateStats($row);
        }

       
define('ELXIS_STATS_TRACKED', 1);

        return
$tracked;
    }


   
/********************/
    /* INSERT A NEW ROW */
    /********************/
   
private function insertStats($row) {
       
$db = eFactory::getDB();

       
$sql = "INSERT INTO ".$db->quoteId('#__statistics')
        .
"\n (".$db->quoteId('id').", ".$db->quoteId('statdate').", ".$db->quoteId('clicks').", ".$db->quoteId('visits').", ".$db->quoteId('langs').")"
       
."\n VALUES (NULL, :xdat, :xcli, :xvis, :xlan)";
       
$stmt = $db->prepare($sql);
       
$stmt->bindParam(':xdat', $this->statdate, PDO::PARAM_STR);
       
$stmt->bindParam(':xcli', $row->clicks, PDO::PARAM_INT);
       
$stmt->bindParam(':xvis', $row->visits, PDO::PARAM_INT);
       
$stmt->bindParam(':xlan', $row->langs, PDO::PARAM_STR);
        try {
           
$stmt->execute();
        } catch (
PDOException $e) {
            return
false;
        }
        return
true;
    }


   
/**************************/
    /* UPDATE AN EXISTING ROW */
    /**************************/
   
private function updateStats($row) {
       
$db = eFactory::getDB();

       
$sql = "UPDATE ".$db->quoteId('#__statistics')
        .
"\n SET ".$db->quoteId('clicks')." = :xcli, ".$db->quoteId('visits')." = :xvis, ".$db->quoteId('langs')." = :xlan"
       
."\n WHERE  ".$db->quoteId('id')." = :xid";
       
$stmt = $db->prepare($sql);
       
$stmt->bindParam(':xcli', $row->clicks, PDO::PARAM_INT);
       
$stmt->bindParam(':xvis', $row->visits, PDO::PARAM_INT);
       
$stmt->bindParam(':xlan', $row->langs, PDO::PARAM_STR);
       
$stmt->bindParam(':xid', $row->id, PDO::PARAM_INT);
        try {
           
$stmt->execute();
        } catch (
PDOException $e) {
            return
false;
        }
        return
true;
    }


   
/*****************************/
    /* UPDATE AND COMPRESS LANGS */
    /*****************************/
   
private function trackCompressLangs($serlangs) {
       
$clang = $this->lang;
        if (
$serlangs == '') {
           
$lngarr = array();
           
$lngarr[$clang] = 1;
            return
serialize($lngarr);
        }

       
$lngarr = unserialize($serlangs);
        if (!isset(
$lngarr[$clang])) {
           
$lngarr[$clang] = 1;
        } else {
           
$lngarr[$clang]++;
        }
        return
serialize($lngarr);
    }


   
/************************/
    /* EMPTY UNIQUE MARKERS */
    /************************/
   
private function emptyTracker() {
       
$db = eFactory::getDB();

       
$sql = "DELETE FROM ".$db->quoteId('#__statistics_temp');
       
$stmt = $db->prepare($sql);
       
$stmt->execute();
    }


   
/*********************************/
    /* FIRST TIME VISITOR FOR TODAY? */
    /*********************************/
   
private function firstVisit() {
       
$db = eFactory::getDB();

       
$sql = "SELECT ".$db->quoteId('id')." FROM ".$db->quoteId('#__statistics_temp')." WHERE ".$db->quoteId('uniqueid')." = :xhash";
       
$stmt = $db->prepareLimit($sql, 0, 1);
       
$stmt->bindParam(':xhash', $this->hash, PDO::PARAM_STR);
       
$stmt->execute();
       
$id = (int)$stmt->fetchResult();
        return (
$id > 0) ? false : true;
    }


   
/***********************/
    /* MARK UNIQUE VISITOR */
    /***********************/
   
private function trackVisit() {
       
$db = eFactory::getDB();
   
       
$sql = "INSERT IGNORE INTO ".$db->quoteId('#__statistics_temp')." VALUES (NULL, :xhash)";
       
$stmt = $db->prepare($sql);
       
$stmt->bindParam(':xhash', $this->hash, PDO::PARAM_STR);
       
$stmt->execute();
    }


   
/********************************************/
    /* GET CURRENT'S DATE DATA OR INITIATE THEM */
    /********************************************/
   
private function getDateDate() {
       
$db = eFactory::getDB();

       
$sql = "SELECT * FROM ".$db->quoteId('#__statistics')." WHERE ".$db->quoteId('statdate')." = :statd";
       
$stmt = $db->prepareLimit($sql, 0, 1);
       
$stmt->bindParam(':statd', $this->statdate, PDO::PARAM_STR);
       
$stmt->execute();
       
$row = $stmt->fetch(PDO::FETCH_OBJ);
        if (!
$row) {
           
$this->newdate = true;
            return
$this->createNewDate();
        }
        return
$row;
    }


   
/**************************/
    /* CREATE A NEW DATE ITEM */
    /**************************/
   
private function createNewDate() {
       
$row = new stdClass;
       
$row->id = null;
       
$row->statdate = $this->statdate;
       
$row->clicks = 0;
       
$row->visits = 0;
       
$row->langs = '';
       
        return
$row;
    }


   
/*************************************/
    /* (ALMOST) UNIQUE DETERMINE VISITOR */
    /*************************************/
   
private function makeUniqueHash() {
       
$hash = '';
        if (isset(
$_SERVER['HTTP_CLIENT_IP']) && ($_SERVER['HTTP_CLIENT_IP'] != '')) {
           
$hash = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset(
$_SERVER['HTTP_X_FORWARDED_FOR']) && ($_SERVER['HTTP_X_FORWARDED_FOR'] != '')) {
           
$n = strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',');//Required in case we have multiple IPs
           
if ($n === false) {
               
$hash = $_SERVER['HTTP_X_FORWARDED_FOR'];
            } else {
               
$hash = substr($_SERVER['HTTP_X_FORWARDED_FOR'], 0, $n);//get the first IP in the list
           
}
        } elseif (isset(
$_SERVER['REMOTE_ADDR']) && ($_SERVER['REMOTE_ADDR'] != '')) {
           
$hash = $_SERVER['REMOTE_ADDR'];
        } else {
           
$hash = '';
        }

       
$hash .= isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : '';
       
$hash .= isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
       
$hash .= isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';

        if (
$hash == '') { return ''; }
        return
md5($hash);
    }

}

?>