'isUnsignedId', 'id_page' => 'isUnsignedId', 'ip_address' => 'isInt', 'http_referer' => 'isAbsoluteUrl'); /* MySQL does not allow 'connection' for a table name */ protected $table = 'connections'; protected $identifier = 'id_connections'; public function getFields() { parent::validateFields(); $fields['id_guest'] = intval($this->id_guest); $fields['id_page'] = intval($this->id_page); $fields['ip_address'] = intval($this->ip_address); if (Validate::isAbsoluteUrl($this->http_referer)) $fields['http_referer'] = pSQL($this->http_referer); $fields['date_add'] = pSQL($this->date_add); return $fields; } public static function setPageConnection($cookie) { // The connection is created if it does not exist yet and we get the current page id if (!isset($cookie->id_connections) OR !strstr(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', Tools::getHttpHost(false, false))) $id_page = Connection::setNewConnection($cookie); if (!isset($id_page) OR !$id_page) $id_page = Page::getCurrentId(); // The ending time will be updated by an ajax request when the guest will close the page $time_start = date('Y-m-d H:i:s'); Db::getInstance()->AutoExecute(_DB_PREFIX_.'connections_page', array('id_connections' => intval($cookie->id_connections), 'id_page' => intval($id_page), 'time_start' => $time_start), 'INSERT'); // This array is serialized and used by the ajax request to identify the page return array( 'id_connections' => intval($cookie->id_connections), 'id_page' => intval($id_page), 'time_start' => $time_start); } public static function setNewConnection($cookie) { // The old connections details are removed from the database in order to spare some memory Connection::cleanConnectionsPages(); // A new connection is created if the guest made no actions during 30 minutes $result = Db::getInstance()->getRow(' SELECT c.`id_guest` FROM `'._DB_PREFIX_.'connections` c LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.`id_connections` = cp.`id_connections` WHERE c.`id_guest` = '.intval($cookie->id_guest).' AND DATE_ADD(cp.`time_start`, INTERVAL 30 MINUTE) > \''.pSQL(date('Y-m-d H:i:s')).'\' ORDER BY cp.`time_start` DESC'); if (!$result['id_guest'] AND intval($cookie->id_guest)) { $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $arrayUrl = parse_url($referer); if (!isset($arrayUrl['host']) OR preg_replace('/^www./', '', $arrayUrl['host']) == preg_replace('/^www./', '', Tools::getHttpHost(false, false))) $referer = ''; $connection = new Connection(); $connection->id_guest = intval($cookie->id_guest); $connection->id_page = Page::getCurrentId(); $connection->ip_address = isset($_SERVER['REMOTE_ADDR']) ? ip2long($_SERVER['REMOTE_ADDR']) : ''; if (Validate::isAbsoluteUrl($referer)) $connection->http_referer = $referer; $connection->add(); $cookie->id_connections = $connection->id; return $connection->id_page; } } public static function setPageTime($id_connections, $id_page, $time_start, $time) { if (!Validate::isUnsignedId($id_connections) OR !Validate::isUnsignedId($id_page) OR !Validate::isDate($time_start)) return; // Limited to 5 minutes because more than 5 minutes is considered as an error if ($time > 300000) $time = 300000; Db::getInstance()->Execute(' UPDATE `'._DB_PREFIX_.'connections_page` SET `time_end` = `time_start` + INTERVAL '.intval($time / 1000).' SECOND WHERE `id_connections` = '.intval($id_connections).' AND `id_page` = '.intval($id_page).' AND `time_start` = \''.pSQL($time_start).'\''); } public static function cleanConnectionsPages() { $period = Configuration::get('PS_STATS_OLD_CONNECT_AUTO_CLEAN'); if ($period === 'week') $interval = '1 WEEK'; else if ($period === 'month') $interval = '1 MONTH'; else if ($period === 'year') $interval = '1 YEAR'; else return; if ($interval != null) { // Records of connections details older than the beginning of the specified interval are deleted Db::getInstance()->Execute(' DELETE FROM `'._DB_PREFIX_.'connections_page` WHERE id_connections IN ( SELECT `id_connections` FROM `'._DB_PREFIX_.'connections` WHERE date_add < LAST_DAY(DATE_SUB(NOW(), INTERVAL '.$interval.')) )'); } } } ?>