403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/statistic/classes/general/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/statistic/classes/general/keepstatistic.php
<?php

class CKeepStatistics
{
	static $HIT_ID = 0;

	public static function GetCuurentHitID()
	{
		return self::$HIT_ID;
	}

	protected static function checkGroups()
	{
		global $USER;

		$arUserGroups = is_object($USER) ? $USER->GetUserGroupArray() : [2];
		$arSkipGroups = explode(",", COption::GetOptionString("statistic", "SKIP_STATISTIC_GROUPS"));
		foreach ($arSkipGroups as $key => $value)
		{
			if (in_array(intval($value), $arUserGroups))
			{
				return false;
			}
		}

		return true;
	}

	protected static function checkRanges()
	{
		if (preg_match("/^.*?(\d+)\.(\d+)\.(\d+)\.(\d+)[\s-]*/", $_SERVER["REMOTE_ADDR"], $arIPAdress))
		{
			$arSkipIPRanges = explode("\n", COption::GetOptionString("statistic", "SKIP_STATISTIC_IP_RANGES"));
			foreach ($arSkipIPRanges as $key => $value)
			{
				if (preg_match("/^.*?(\d+)\.(\d+)\.(\d+)\.(\d+)[\s-]*(\d+)\.(\d+)\.(\d+)\.(\d+)/", $value, $arIPRange))
				{
					if (
						intval($arIPAdress[1]) >= intval($arIPRange[1]) && intval($arIPAdress[1]) <= intval($arIPRange[5]) &&
						intval($arIPAdress[2]) >= intval($arIPRange[2]) && intval($arIPAdress[2]) <= intval($arIPRange[6]) &&
						intval($arIPAdress[3]) >= intval($arIPRange[3]) && intval($arIPAdress[3]) <= intval($arIPRange[7]) &&
						intval($arIPAdress[4]) >= intval($arIPRange[4]) && intval($arIPAdress[4]) <= intval($arIPRange[8])
					)
					{
						return false;
					}
				}
			}
		}

		return true;
	}

	public static function CheckSkip()
	{
		$skipMode = COption::GetOptionString("statistic", "SKIP_STATISTIC_WHAT");
		switch ($skipMode)
		{
			case "groups":
				$GO = static::checkGroups();
				break;
			case "ranges":
				$GO = static::checkRanges();
				break;
			case "both":
				$GO = static::checkGroups() && static::checkRanges();
				break;
			default:
				$GO = true;
		}

		return $GO;
	}
	/////////////////////////////
	// Main statistics function
	/////////////////////////////
	public static function Keep($HANDLE_CALL=false)
	{
		__SetNoKeepStatistics();
		__GoogleAd();

		$GO = true;
		if (defined("STOP_STATISTICS"))
		{
			$GO = false;
		}
		if ($HANDLE_CALL)
		{
			$GO = true;
		}

		if(
			$GO
			&& (!isset($_SESSION["SESS_NO_KEEP_STATISTIC"]) || $_SESSION["SESS_NO_KEEP_STATISTIC"]!="Y")
			&& !defined("NO_KEEP_STATISTIC")
		)
		{
			static $wasCalled = false;
			if ($wasCalled)
			{
				return;
			}
			$wasCalled = true;

			$GLOBALS["DB"]->StartUsingMasterOnly();
			if(CStatistics::CheckSkip())
				CStatistics::ReallyKeep();
			$GLOBALS["DB"]->StopUsingMasterOnly();
		}
	}

	public static function ReallyKeep()
	{
		global $USER, $APPLICATION, $STOP_SAVE_STATISTIC, $STOP_MESSAGE, $STOP_REDIRECT_URL, $STOP, $STOP_LIST_ID, $STOP_MESSAGE_LID;
		$DB = CDatabase::GetModuleConnection('statistic');

		$SITE_ID = "";
		if (defined("ADMIN_SECTION") && ADMIN_SECTION===true) $sql_site = "null";
		elseif (defined("SITE_ID"))
		{
			$sql_site = "'".$DB->ForSql(SITE_ID,2)."'";
			$SITE_ID = SITE_ID;
		}
		else $sql_site = "null";

		$ADV_NA = COption::GetOptionString("statistic", "ADV_NA");
		__SetReferer("referer1", "REFERER1_SYN");
		__SetReferer("referer2", "REFERER2_SYN");
		__SetReferer("referer3", "REFERER3_SYN");

		$SAVE_HITS	= (COption::GetOptionString("statistic", "SAVE_HITS")=="N") ? "N" : "Y";
		$SAVE_VISITS	= (COption::GetOptionString("statistic", "SAVE_VISITS")=="N") ? "N" : "Y";
		$SAVE_REFERERS	= (COption::GetOptionString("statistic", "SAVE_REFERERS")=="N") ? "N" : "Y";
		$SAVE_PATH_DATA	= (COption::GetOptionString("statistic", "SAVE_PATH_DATA")=="N") ? "N" : "Y";

		$stmp = time();
		$hour = date("G", $stmp); // 0..23
		$weekday = date("w", $stmp); // 0..6
		if ($weekday==0) $weekday = 7;
		$month = date("n", $stmp); // 1..12

		if ($STOP_SAVE_STATISTIC!="N" or $STOP!="Y")
		{
			if (isset($_SESSION["SESS_ADD_TO_FAVORITES"]) && $_SESSION["SESS_ADD_TO_FAVORITES"]=="Y")
			{
				$FAVORITES="Y";
				$_SESSION["SESS_ADD_TO_FAVORITES"]="";
			}
			else
			{
				$FAVORITES = "N";
			}

			$ERROR_404 = (defined("ERROR_404") && ERROR_404=="Y") ? "Y" : "N";
			$DB_now = $DB->GetNowFunction(); // save function for use in sql
			$DB_now_date = $DB->GetNowDate(); // save function for use in sql
			$STOP_LIST_ID = intval($STOP_LIST_ID);
			if ($ERROR_404=="Y") init_get_params($APPLICATION->GetCurUri());

			$IS_USER_AUTHORIZED = (isset($_SESSION["SESS_LAST_USER_ID"]) && intval($_SESSION["SESS_LAST_USER_ID"])>0 && is_object($USER) && $USER->IsAuthorized()) ? "Y" : "N";

			stat_session_register("SESS_SEARCHER_ID");
			stat_session_register("SESS_SEARCHER_NAME");
			stat_session_register("SESS_SEARCHER_CHECK_ACTIVITY");
			stat_session_register("SESS_SEARCHER_SAVE_STATISTIC");
			stat_session_register("SESS_SEARCHER_HIT_KEEP_DAYS");
			stat_session_register("SESS_LAST_PROTOCOL");
			stat_session_register("SESS_LAST_URI");
			stat_session_register("SESS_LAST_HOST");
			stat_session_register("SESS_LAST_PAGE");
			stat_session_register("SESS_LAST_DIR");
			stat_session_register("SESS_HTTP_REFERER");
			stat_session_register("SESS_COUNTRY_ID");
			stat_session_register("SESS_CITY_ID");
			stat_session_register("SESS_SESSION_ID");
			stat_session_register("SESS_REFERER_ID");
			stat_session_register("FROM_SEARCHER_ID");
			stat_session_register("SESS_FROM_SEARCHERS");
			stat_session_register("SESS_REQUEST_URI_CHANGE");
			stat_session_register("SESS_LAST_DIR_ID");
			stat_session_register("SESS_LAST_PAGE_ID");
			stat_session_register("SESS_GRABBER_STOP_TIME");
			stat_session_register("SESS_GRABBER_DEFENCE_STACK");
			stat_session_register("ACTIVITY_EXCEEDING_NOTIFIED");

			// SESSION_DATA_ID will be false when there is no sessions stored
			// true when session was not found in database
			// and an integer when was found and populated to $SESSION array
			$SESSION_DATA_ID = CKeepStatistics::RestoreSession();

			// Let's check activity limit
			$BLOCK_ACTIVITY = CStatistics::BlockVisitorActivity();

			// Activity under the limit
			if (!$BLOCK_ACTIVITY)
			{
				//Check if searcher was not deleted from searchers list
				if (isset($_SESSION["SESS_SEARCHER_ID"]) && intval($_SESSION["SESS_SEARCHER_ID"]) > 0)
				{
					$strSql = "
						SELECT ID
						FROM b_stat_searcher
						WHERE ID = '".intval($_SESSION["SESS_SEARCHER_ID"])."'
					";
					$z = $DB->Query($strSql);
					if(!$z->Fetch())
						unset($_SESSION["SESS_SEARCHER_ID"]);
				}

				// We did not check for searcher
				if(!isset($_SESSION["SESS_SEARCHER_ID"]) || $_SESSION["SESS_SEARCHER_ID"] == '')
				{
					// is it searcher hit?
					$strSql = "
						SELECT
							ID, NAME, SAVE_STATISTIC, HIT_KEEP_DAYS, CHECK_ACTIVITY
						FROM
							b_stat_searcher
						WHERE
							ACTIVE = 'Y'
						and ".$DB->Length("USER_AGENT").">0
						and upper('".$DB->ForSql($_SERVER["HTTP_USER_AGENT"] ?? '', 500)."') like ".$DB->Concat("'%'", "upper(USER_AGENT)", "'%'")."
						ORDER BY ".$DB->Length("USER_AGENT")." desc, ID
						";

					$z = $DB->Query($strSql);
					if ($zr = $z->Fetch())
					{
						$_SESSION["SESS_SEARCHER_ID"] = intval($zr["ID"]);
						$_SESSION["SESS_SEARCHER_NAME"] = $zr["NAME"];
						$_SESSION["SESS_SEARCHER_CHECK_ACTIVITY"] = $zr["CHECK_ACTIVITY"];
						$_SESSION["SESS_SEARCHER_SAVE_STATISTIC"] = $zr["SAVE_STATISTIC"];
						$_SESSION["SESS_SEARCHER_HIT_KEEP_DAYS"] = $zr["HIT_KEEP_DAYS"];
						//Here was warning "A session is active. You cannot change the session module's ini settings at this time."
						//@ini_set("url_rewriter.tags", "");
					}
					$_SESSION["SESS_SEARCHER_ID"] = intval($_SESSION["SESS_SEARCHER_ID"] ?? 0);
				}

				/************************************************
						Searcher section
				************************************************/

				// searcher detected
				if (intval($_SESSION["SESS_SEARCHER_ID"])>0)
				{
					$_SESSION["SESS_SEARCHER_ID"] = intval($_SESSION["SESS_SEARCHER_ID"]);

					// let's update day counter
					$arFields = Array(
							"DATE_LAST"	=> $DB_now,
							"TOTAL_HITS"	=> "TOTAL_HITS + 1"
							);
					$rows = $DB->Update("b_stat_searcher_day",$arFields,"WHERE SEARCHER_ID='".$_SESSION["SESS_SEARCHER_ID"]."' and DATE_STAT=".$DB_now_date,"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
					// there is no stat for the day yet
					if (intval($rows)<=0)
					{
						// add it
						$arFields_i = Array(
							"DATE_STAT"	=> $DB_now_date,
							"DATE_LAST"	=> $DB_now,
							"SEARCHER_ID"	=> $_SESSION["SESS_SEARCHER_ID"],
							"TOTAL_HITS"	=> 1
							);
						$DB->Insert("b_stat_searcher_day",$arFields_i, "File: ".__FILE__."<br>Line: ".__LINE__);
					}
					elseif (intval($rows)>1) // have to cleanup duplicates
					{
						$strSql = "SELECT ID FROM b_stat_searcher_day WHERE SEARCHER_ID='".$_SESSION["SESS_SEARCHER_ID"]."' and DATE_STAT=".$DB_now_date." ORDER BY ID";
						$i=0;
						$rs = $DB->Query($strSql);
						while ($ar = $rs->Fetch())
						{
							$i++;
							if ($i>1)
							{
								$strSql = "DELETE FROM b_stat_searcher_day WHERE ID = ".$ar["ID"];
								$DB->Query($strSql);
							}
						}
					}

					// save indexed page if neccessary
					if ($_SESSION["SESS_SEARCHER_SAVE_STATISTIC"]=="Y")
					{
						$sql_HIT_KEEP_DAYS = ($_SESSION["SESS_SEARCHER_HIT_KEEP_DAYS"] <> '') ? intval($_SESSION["SESS_SEARCHER_HIT_KEEP_DAYS"]) : "null";
						$arFields = Array(
							"DATE_HIT" => $DB_now,
							"SEARCHER_ID" => intval($_SESSION["SESS_SEARCHER_ID"]),
							"URL" => "'".$DB->ForSql(__GetFullRequestUri(),2000)."'",
							"URL_404" => "'".$ERROR_404."'",
							"IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
							"USER_AGENT" => "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"],500)."'",
							"HIT_KEEP_DAYS" => $sql_HIT_KEEP_DAYS,
							"SITE_ID" => $sql_site
							);
						$id = $DB->Insert("b_stat_searcher_hit",$arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
						if ($ERROR_404=="N")
						{
							CStatistics::Set404("b_stat_searcher_hit", "ID = ".intval($id), array("URL_404" => "Y"));
						}
					}
				}
				else // it is not searcher
				{

					/************************************************
							Visitor section
					************************************************/

					/************************************************
						Variables which describe current page
					************************************************/

					$CURRENT_DIR = __GetCurrentDir();
					$CURRENT_PAGE = __GetCurrentPage();

					$CURRENT_PROTOCOL	= (CMain::IsHTTPS()) ? "https://" : "http://"; // protocol
					$CURRENT_PORT		= $_SERVER["SERVER_PORT"]; // port
					$CURRENT_HOST		= $_SERVER["HTTP_HOST"]; // domain
					$CURRENT_PAGE		= __GetFullRequestUri($CURRENT_PAGE);// w/o parameters
					$CURRENT_URI		= __GetFullRequestUri(); // with params
					$CURRENT_DIR		= __GetFullRequestUri($CURRENT_DIR); // catalog

					/************************************************
							Country detection
					************************************************/

					if(!isset($_SESSION["SESS_COUNTRY_ID"]) || $_SESSION["SESS_COUNTRY_ID"] == '')
					{
						$obCity = new CCity;
						$_SESSION["SESS_COUNTRY_ID"] = $obCity->GetCountryCode();
						$_SESSION["SESS_CITY_ID"] = $obCity->GetCityID();
					}

					/************************************************
							IP => number
					************************************************/

					$REMOTE_ADDR_NUMBER = ip2number($_SERVER["REMOTE_ADDR"]);

					/************************************************
							Advertising campaign
					************************************************/

					CStatistics::Set_Adv();

					/************************************************
							Guest ID detection
					************************************************/

					$arGuest = CStatistics::Set_Guest();

					// Setup default advertising campaign
					if ($ADV_NA=="Y" && intval($_SESSION["SESS_ADV_ID"])<=0 && intval($_SESSION["SESS_LAST_ADV_ID"])<=0)
					{
						$_SESSION["referer1"] = COption::GetOptionString("statistic", "AVD_NA_REFERER1");
						$_SESSION["referer2"] = COption::GetOptionString("statistic", "AVD_NA_REFERER2");
						CStatistics::Set_Adv();
						$arGuest = CStatistics::Set_Guest();
					}

					/************************************************
							Session section
					************************************************/

					$_SESSION["SESS_SESSION_ID"] = intval($_SESSION["SESS_SESSION_ID"] ?? 0);

					//session already exists
					if($_SESSION["SESS_SESSION_ID"] > 0)
					{
						$SESSION_NEW = "N";
						// update
						$arFields = Array(
							"USER_ID"		=> intval($_SESSION["SESS_LAST_USER_ID"]),
							"USER_AUTH"		=> "'".$IS_USER_AUTHORIZED."'",
							"USER_AGENT"		=> "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"] ?? '', 500)."'",
							"DATE_LAST"		=> $DB_now,
							"IP_LAST"		=> "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
							"IP_LAST_NUMBER"	=> $REMOTE_ADDR_NUMBER,
							"HITS"			=> "HITS + 1",
							);
						$rows = $DB->Update("b_stat_session", $arFields, "WHERE ID='".$_SESSION["SESS_SESSION_ID"]."'", "File: ".__FILE__."<br>Line: ".__LINE__);
						// was cleaned up
						if (intval($rows)<=0)
						{
							// store as new
							$_SESSION["SESS_SESSION_ID"] = 0;
							if ($ADV_NA=="Y" && intval($_SESSION["SESS_ADV_ID"])<=0 && intval($_SESSION["SESS_LAST_ADV_ID"])<=0)
							{
								$_SESSION["referer1"] = COption::GetOptionString("statistic", "AVD_NA_REFERER1");
								$_SESSION["referer2"] = COption::GetOptionString("statistic", "AVD_NA_REFERER2");
							}
							CStatistics::Set_Adv();
							$arGuest = CStatistics::Set_Guest();
						}
					}

					// it is new session
					if($_SESSION["SESS_SESSION_ID"] <= 0)
					{
						$SESSION_NEW = "Y";
						$sessionId = \Bitrix\Main\Application::getInstance()->getKernelSession()->getId();
						// save session data
						$arFields = Array(
							"GUEST_ID"		=> intval($_SESSION["SESS_GUEST_ID"]),
							"NEW_GUEST"		=> "'".$DB->ForSql($_SESSION["SESS_GUEST_NEW"])."'",
							"USER_ID"		=> intval($_SESSION["SESS_LAST_USER_ID"]),
							"USER_AUTH"		=> "'".$DB->ForSql($IS_USER_AUTHORIZED)."'",
							"URL_FROM"		=> "'".$DB->ForSql($_SERVER["HTTP_REFERER"] ?? '', 2000)."'",
							"URL_TO"		=> "'".$DB->ForSql($CURRENT_URI,2000)."'",
							"URL_TO_404"		=> "'".$DB->ForSql($ERROR_404)."'",
							"URL_LAST"		=> "'".$DB->ForSql($CURRENT_URI,2000)."'",
							"URL_LAST_404"		=> "'".$DB->ForSql($ERROR_404)."'",
							"USER_AGENT"		=> "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"] ?? '', 500)."'",
							"DATE_STAT"		=> $DB_now_date,
							"DATE_FIRST"		=> $DB_now,
							"DATE_LAST"		=> $DB_now,
							"IP_FIRST"		=> "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
							"IP_FIRST_NUMBER"	=> "'".$DB->ForSql($REMOTE_ADDR_NUMBER)."'",
							"IP_LAST"		=> "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
							"IP_LAST_NUMBER"	=> "'".$DB->ForSql($REMOTE_ADDR_NUMBER)."'",
							"PHPSESSID"		=> "'".$DB->ForSql($sessionId,255)."'",
							"STOP_LIST_ID"		=> "'".$DB->ForSql($STOP_LIST_ID)."'",
							"COUNTRY_ID"		=> "'".$DB->ForSql($_SESSION["SESS_COUNTRY_ID"],2)."'",
							"CITY_ID"		=> $_SESSION["SESS_CITY_ID"] > 0? intval($_SESSION["SESS_CITY_ID"]): "null",
							"ADV_BACK"		=> "null",
							"FIRST_SITE_ID"		=> $sql_site,
							"LAST_SITE_ID"		=> $sql_site,
							"HITS"			=> 1,
							);

						// campaign?
						if (intval($_SESSION["SESS_ADV_ID"])>0)
						{
							$arFields["ADV_ID"] = intval($_SESSION["SESS_ADV_ID"]);
							$arFields["ADV_BACK"] = "'N'";
							$arFields["REFERER1"] = "'".$DB->ForSql($_SESSION["referer1"],255)."'";
							$arFields["REFERER2"] = "'".$DB->ForSql($_SESSION["referer2"],255)."'";
							$arFields["REFERER3"] = "'".$DB->ForSql($_SESSION["referer3"],255)."'";
						}
						elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0) // comeback?
						{
							$arFields["ADV_ID"] = intval($_SESSION["SESS_LAST_ADV_ID"]);
							$arFields["ADV_BACK"] = "'Y'";
							$arFields["REFERER1"] = "'".$DB->ForSql($arGuest["last_referer1"],255)."'";
							$arFields["REFERER2"] = "'".$DB->ForSql($arGuest["last_referer2"],255)."'";
						}

						// look for the same IP?
						$day_host_counter = 1;
						$day_host_counter_site = $SITE_ID <> ''? 1: 0;
						$strSql = "
							SELECT S.FIRST_SITE_ID
							FROM b_stat_session S
							WHERE S.IP_FIRST_NUMBER = ".$REMOTE_ADDR_NUMBER."
								AND S.DATE_STAT=".$DB_now_date."
						";
						$e = $DB->Query($strSql);
						while($er = $e->Fetch())
						{
							$day_host_counter = 0;
							if ($SITE_ID==$er["FIRST_SITE_ID"])
							{
								$day_host_counter_site = 0;
								break;
							}
						}

						$_SESSION["SESS_SESSION_ID"] = intval($DB->Insert("b_stat_session",$arFields, "File: ".__FILE__."<br>Line: ".__LINE__));

						if ($ERROR_404=="N")
						{
							CStatistics::Set404("b_stat_session", "ID = ".$_SESSION["SESS_SESSION_ID"], array("URL_TO_404" => "Y", "URL_LAST_404" => "Y"));
						}

						$day_guest_counter = 0;
						$new_guest_counter = 0;
						// new guest
						if ($_SESSION["SESS_GUEST_NEW"]=="Y")
						{
							// update day statistic
							$day_guest_counter = 1;
							$new_guest_counter = 1;
						}
						else // guest was here
						{
							// first hit for today
							if (!isset($_SESSION["SESS_LAST"]) || $_SESSION["SESS_LAST"] != "Y")
							{
								// update day statistic
								$day_guest_counter = 1;
								$_SESSION["SESS_LAST"] = "Y";
							}
						}

						// update day counter
						$arFields = Array(
							"SESSIONS"	=> 1,
							"C_HOSTS"	=> intval($day_host_counter),
							"GUESTS"	=> intval($day_guest_counter),
							"NEW_GUESTS"	=> intval($new_guest_counter),
							"SESSION"	=> 1,
							"HOST"		=> intval($day_host_counter),
							"GUEST"		=> intval($day_guest_counter),
							"NEW_GUEST"	=> intval($new_guest_counter),
						);
						// when current day is already exists
						// we have to update it
						$rows = CTraffic::IncParam($arFields);
						if ($rows!==false && $rows<=0)
						// otherwise
						{
							// add new one
							CStatistics::SetNewDay(
								1,				// HOSTS
								0,				// TOTAL_HOSTS (now ignored)
								1,				// SESSIONS
								0,				// HITS
								intval($new_guest_counter),	// NEW_GUESTS
								1				// GUESTS
							);

							// and update it
							CTraffic::IncParam(
								array(
									"SESSION"	=> 1,
									"HOST"		=> 1,
									"GUEST"		=> 1,
									"NEW_GUEST"	=> intval($new_guest_counter),
									)
								);
						}

						// site is not defined
						if ($SITE_ID <> '')
						{
							// обновляем счетчик "по дням" для текущего сайта
							$arFields = Array(
								"SESSIONS"	=> 1,
								"C_HOSTS"	=> intval($day_host_counter_site),
								"SESSION"	=> 1,
								"HOST"		=> intval($day_host_counter_site),
							);
							// обновим счетчики траффика для текущего дня
							$rows = CTraffic::IncParam(array(), $arFields, $SITE_ID);
							// если текущего дня для сайта в базе еще нет то
							if ($rows!==false && intval($rows)<=0)
							{
								// добавляем его
								CStatistics::SetNewDayForSite(
									$SITE_ID,
									1,	// HOSTS
									0,	// TOTAL_HOSTS  (now ignored)
									1	// SESSIONS
									);

								// обновим счетчики траффика для текущего дня
								CTraffic::IncParam(
									array(),
									array(
										"SESSION"	=> 1,
										"HOST"		=> 1,
										),
									$SITE_ID
									);
							}
						}

						// если страна определена то
						if ($_SESSION["SESS_COUNTRY_ID"] <> '')
						{
							$arFields = Array(
								"SESSIONS"	=> 1,
								"NEW_GUESTS"	=> $new_guest_counter,
							);
							CStatistics::UpdateCountry($_SESSION["SESS_COUNTRY_ID"], $arFields);
						}

						if($_SESSION["SESS_CITY_ID"] > 0)
						{
							$arFields = Array(
								"SESSIONS"	=> 1,
								"NEW_GUESTS"	=> $new_guest_counter,
							);
							CStatistics::UpdateCity($_SESSION["SESS_CITY_ID"], $arFields);
						}

						// обновляем гостя
						$arFields = Array(
							"SESSIONS" => "SESSIONS + 1",
							"LAST_SESSION_ID" => $_SESSION["SESS_SESSION_ID"],
							"LAST_USER_AGENT" => "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"] ?? '', 500)."'",
							"LAST_COUNTRY_ID" => "'".$DB->ForSql($_SESSION["SESS_COUNTRY_ID"],2)."'",
							"LAST_CITY_ID" => $_SESSION["SESS_CITY_ID"] > 0? intval($_SESSION["SESS_CITY_ID"]): "null",
						);
						//
						if($obCity)
						{
							$arFields["LAST_CITY_INFO"] = "'".$obCity->ForSQL()."'";
						}
						// если это прямой заход по рекламной кампании то
						if (intval($_SESSION["SESS_ADV_ID"])>0)
						{
							// обновляем рекламную кампанию последнего захода гостя
							$arFields["LAST_ADV_ID"] = intval($_SESSION["SESS_ADV_ID"]);
							$arFields["LAST_ADV_BACK"] = "'N'";
							$arFields["LAST_REFERER1"] = "'".$DB->ForSql($_SESSION["referer1"],255)."'";
							$arFields["LAST_REFERER2"] = "'".$DB->ForSql($_SESSION["referer2"],255)."'";
							$arFields["LAST_REFERER3"] = "'".$DB->ForSql($_SESSION["referer3"],255)."'";
						}
						elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0) // иначе если это возврат то
						{
							// взводим флаг возврата на последнем заходе гостя
							$arFields["LAST_ADV_BACK"] = "'Y'";
							$arFields["LAST_REFERER1"] = "'".$DB->ForSql($arGuest["last_referer1"],255)."'";
							$arFields["LAST_REFERER2"] = "'".$DB->ForSql($arGuest["last_referer2"],255)."'";
						}

						if ($_SESSION["SESS_GUEST_NEW"]=="Y")
							$arFields["FIRST_SESSION_ID"] = $_SESSION["SESS_SESSION_ID"];
						$rows = $DB->Update("b_stat_guest",$arFields,"WHERE ID=".intval($_SESSION["SESS_GUEST_ID"]),"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);

						// обновляем рекламные кампании
						if (intval($_SESSION["SESS_ADV_ID"])>0 || intval($_SESSION["SESS_LAST_ADV_ID"])>0)
						{
							CStatistics::Update_Adv();
						}

						/************************************************
								Referring sites
						************************************************/
						if(
							$SAVE_REFERERS != "N"
							&& __GetReferringSite($PROT, $SN, $SN_WithoutPort, $PAGE_FROM)
							&& $SN <> ''
							&& $SN != $_SERVER["HTTP_HOST"]
						)
						{
							$REFERER_LIST_ID = CStatistics::GetRefererListID($PROT, $SN, $PAGE_FROM, $CURRENT_URI, $ERROR_404, $sql_site);

							/************************************************
									Search phrases
							************************************************/

							if (mb_substr($SN, 0, 4) == "www.")
								$sql = "('".$DB->ForSql(mb_substr($SN, 4), 255)."' like P.DOMAIN or '".$DB->ForSql($SN,255)."' like P.DOMAIN)";
							else
								$sql = "'".$DB->ForSql($SN,255)."' like P.DOMAIN";
							$strSql = "
								SELECT
									S.ID,
									S.NAME,
									P.DOMAIN,
									P.VARIABLE,
									P.CHAR_SET
								FROM
									b_stat_searcher S,
									b_stat_searcher_params P
								WHERE
									S.ACTIVE='Y'
								and	P.SEARCHER_ID = S.ID
								and	".$sql."
							";
							$q = $DB->Query($strSql);
							if ($qr = $q->Fetch())
							{
								$_SESSION["FROM_SEARCHER_ID"] = $qr["ID"];
								$FROM_SEARCHER_NAME = $qr["NAME"];
								$FROM_SEARCHER_PHRASE = "";
								if ($qr["VARIABLE"] <> '')
								{
									$page = mb_substr($PAGE_FROM, mb_strpos($PAGE_FROM, "?") + 1);
									$utf = \Bitrix\Main\Text\Encoding::detectUtf8($page);
									parse_str($page, $arr);
									$arrVar = explode(",",$qr["VARIABLE"]);
									foreach ($arrVar as $var)
									{
										$var = trim($var);
										$phrase = $arr[$var];

										if(!$utf && $qr["CHAR_SET"] <> '')
										{
											$phrase_temp = trim(\Bitrix\Main\Text\Encoding::convertEncoding($phrase, $qr["CHAR_SET"], "UTF-8"));
											if($phrase_temp <> '')
											{
												$phrase = $phrase_temp;
											}
										}

										$phrase = trim($phrase);
										if($phrase <> '')
										{
											$FROM_SEARCHER_PHRASE .= ($FROM_SEARCHER_PHRASE <> '')? " / ".$phrase : $phrase;
										}
									}
								}
								//echo "FROM_SEARCHER_PHRASE = ".$FROM_SEARCHER_PHRASE."<br>\n";
								// если извлекли поисковую фразу, то занесем ее в базу
								if ($FROM_SEARCHER_PHRASE <> '')
								{
									$arFields = Array(
										"DATE_HIT" => $DB_now,
										"SEARCHER_ID" => intval($_SESSION["FROM_SEARCHER_ID"]),
										"REFERER_ID" => $REFERER_LIST_ID,
										"PHRASE" => "'".$DB->ForSql($FROM_SEARCHER_PHRASE,255)."'",
										"URL_FROM" => "'".$DB->ForSql($PROT.$SN.$PAGE_FROM,2000)."'",
										"URL_TO" => "'".$DB->ForSql($CURRENT_URI,2000)."'",
										"URL_TO_404" => "'".$ERROR_404."'",
										"SESSION_ID" => $_SESSION["SESS_SESSION_ID"],
										"SITE_ID" => $sql_site,
									);
									$id = $DB->Insert("b_stat_phrase_list", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
									if ($ERROR_404=="N")
									{
										CStatistics::Set404("b_stat_phrase_list", "ID = ".intval($id), array("URL_TO_404" => "Y"));
									}

									// запомним поисковую фразу в сессии
									$_SESSION["SESS_SEARCH_PHRASE"] = $FROM_SEARCHER_PHRASE;

									// увеличим счетчик фраз у поисковой системы
									$_SESSION["SESS_FROM_SEARCHERS"][] = $_SESSION["FROM_SEARCHER_ID"];
									$arFields = Array("PHRASES" => "PHRASES + 1");
									$rows = $DB->Update("b_stat_searcher",$arFields,"WHERE ID=".intval($_SESSION["FROM_SEARCHER_ID"]), "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);

								}
							}
						}
					}

					/************************************************
								Hits
					************************************************/

					if($_SESSION["SESS_SESSION_ID"] > 0)
					{
						if ($SAVE_HITS!="N")
						{
							// добавляем хит
							$arFields = Array(
								"SESSION_ID" => $_SESSION["SESS_SESSION_ID"],
								"DATE_HIT" => $DB_now,
								"GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]),
								"NEW_GUEST" => "'".$DB->ForSql($_SESSION["SESS_GUEST_NEW"])."'",
								"USER_ID" => intval($_SESSION["SESS_LAST_USER_ID"]),
								"USER_AUTH" => "'".$IS_USER_AUTHORIZED."'",
								"URL" => "'".$DB->ForSql($CURRENT_URI,2000)."'",
								"URL_404" => "'".$ERROR_404."'",
								"URL_FROM" => "'".$DB->ForSql(isset($_SERVER["HTTP_REFERER"])? $_SERVER["HTTP_REFERER"]: "", 2000)."'",
								"IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
								"METHOD" => "'".$DB->ForSql($_SERVER["REQUEST_METHOD"],10)."'",
								"COOKIES" => "'".$DB->ForSql(GetCookieString(),2000)."'",
								"USER_AGENT" => "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"] ?? '', 500)."'",
								"STOP_LIST_ID" => "'".$STOP_LIST_ID."'",
								"COUNTRY_ID" => "'".$DB->ForSql($_SESSION["SESS_COUNTRY_ID"],2)."'",
								"CITY_ID" => $_SESSION["SESS_CITY_ID"] > 0? intval($_SESSION["SESS_CITY_ID"]): "null",
								"SITE_ID" => $sql_site,
							);
							self::$HIT_ID = intval($DB->Insert("b_stat_hit", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__));
							if($ERROR_404=="N")
							{
								CStatistics::Set404("b_stat_hit", "ID = ".self::$HIT_ID, array("URL_404" => "Y"));
							}
						}

						// если гость на данном хите добавил в фавориты и до этого еще не добавлял то
						$favorites_counter = 0;
						if ($FAVORITES=="Y" && $_SESSION["SESS_GUEST_FAVORITES"]=="N")
						{
							$ALLOW_ADV_FAVORITES = "Y";
							$_SESSION["SESS_GUEST_FAVORITES"] = "Y";
							$favorites_counter = 1;
						}
						// обновляем счетчик "по дням"
						$arFields = Array(
							"HITS"		=> 1,
							"FAVORITES"	=> $favorites_counter,
							"HIT"		=> 1,
							"FAVORITE"	=> $favorites_counter,
						);
						// если текущий день есть в базе то
						// обновим счетчики траффика для текущего дня
						$rows = CTraffic::IncParam($arFields);
						if($rows!==false && intval($rows)<=0)
						{
							// если текущий день не определен в базе то
							// добавляем его
							$new_guest_counter = ($_SESSION["SESS_GUEST_NEW"]=="Y") ? 1 : 0;
							CStatistics::SetNewDay(
								1,				// HOSTS
								0,				// TOTAL_HOSTS (now ignored)
								1,				// SESSIONS
								1,				// HITS
								$new_guest_counter,		// NEW_GUESTS
								1,				// GUESTS
								$favorites_counter		// FAVORITES
								);

							// обновим счетчики траффика для текущего дня
							CTraffic::IncParam(
								array(
									"SESSION"	=> 1,
									"HIT"		=> 1,
									"HOST"		=> 1,
									"GUEST"		=> 1,
									"NEW_GUEST"	=> $new_guest_counter,
									"FAVORITE"	=> $favorites_counter
									)
								);
						}

						// если сайт определен то
						if ($SITE_ID <> '')
						{
							// обновляем счетчик "по дням"
							$arFields = Array(
								"HITS" => 1,
								"HIT" => 1,
							);
							// если текущий день сайта определен в базе то
							// обновим счетчики траффика для текущего дня
							$rows = CTraffic::IncParam(array(), $arFields, $SITE_ID);
							if($rows!==false && intval($rows)<=0)
							{
								// если текущий день сайта не определен в базе то
								// добавляем его
								CStatistics::SetNewDayForSite(
									$SITE_ID,
									1,			// HOSTS
									0,			// TOTAL_HOSTS (now ignored)
									1,			// SESSIONS
									1			// HITS
									);

								// обновим счетчики траффика для текущего дня
								CTraffic::IncParam(
									array(),
									array(
										"SESSION"	=> 1,
										"HIT"		=> 1,
										"HOST"		=> 1,
										),
									$SITE_ID
									);
							}
						}

						/************************************************
										Пути по сайту
						************************************************/

						if ($SAVE_PATH_DATA!="N")
							CStatistics::SavePathData($SITE_ID, $CURRENT_PAGE, $ERROR_404);

						/************************************************
									Посещение разделов и страниц
						************************************************/

						if ($SAVE_VISITS!="N")
							CStatistics::SaveVisits($sql_site, $SESSION_NEW, $CURRENT_DIR, $CURRENT_PAGE, $ERROR_404);

						// обновляем сессию
						$arFields = Array(
							//"HITS"			=> "HITS + 1",
							"LAST_HIT_ID"	=> self::$HIT_ID,
							"URL_LAST"		=> "'".$DB->ForSql($CURRENT_URI,2000)."'",
							"URL_LAST_404"	=> "'".$ERROR_404."'",
							"DATE_LAST"		=> $DB_now,
							"LAST_SITE_ID"	=> $sql_site
							);
						if ($SESSION_NEW=="Y") $arFields["FIRST_HIT_ID"] = self::$HIT_ID;
						if ($FAVORITES=="Y") $arFields["FAVORITES"] = "'Y'";
						$DB->Update("b_stat_session",$arFields,"WHERE ID=".$_SESSION["SESS_SESSION_ID"], "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
						if ($ERROR_404=="N")
						{
							CStatistics::Set404("b_stat_session", "ID = ".$_SESSION["SESS_SESSION_ID"], array("URL_LAST_404" => "Y"));
						}

						// обновляем гостя
						$arFields = Array(
							"HITS"			=> "HITS + 1",
							"LAST_SESSION_ID"	=> $_SESSION["SESS_SESSION_ID"],
							"LAST_DATE"		=> $DB_now,
							"LAST_USER_ID"		=> intval($_SESSION["SESS_LAST_USER_ID"]),
							"LAST_USER_AUTH"	=> "'".$IS_USER_AUTHORIZED."'",
							"LAST_URL_LAST"		=> "'".$DB->ForSql($CURRENT_URI,2000)."'",
							"LAST_URL_LAST_404"	=> "'".$ERROR_404."'",
							"LAST_USER_AGENT"	=> "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"] ?? '', 500)."'",
							"LAST_IP"		=> "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
							"LAST_COOKIE"		=> "'".$DB->ForSql(GetCookieString(),2000)."'",
							"LAST_LANGUAGE"		=> "'".$DB->ForSql($_SERVER["HTTP_ACCEPT_LANGUAGE"] ?? '', 255)."'",
							"LAST_SITE_ID"		=> $sql_site
							);
						if ($FAVORITES=="Y") $arFields["FAVORITES"] = "'Y'";
						$DB->Update("b_stat_guest",$arFields,"WHERE ID=".intval($_SESSION["SESS_GUEST_ID"]),"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
						if ($ERROR_404=="N")
						{
							CStatistics::Set404("b_stat_guest", "ID = ".intval($_SESSION["SESS_GUEST_ID"]), array("LAST_URL_LAST_404" => "Y"));
						}

						// обновляем прямые рекламные кампании
						if (intval($_SESSION["SESS_ADV_ID"])>0)
						{
							// увеличиваем счетчик хитов на прямом заходе
							$arFields = Array(
								"DATE_LAST"	=> $DB_now,
								"HITS"		=> "HITS+1"
								);
							if ($FAVORITES=="Y" && $ALLOW_ADV_FAVORITES=="Y")
							{
								// увеличиваем счетчик посетителей добавивших в избранное на прямом заходе
								$arFields["FAVORITES"] = "FAVORITES + 1";
								$favorite = 1;
							}
							$DB->Update("b_stat_adv",$arFields,"WHERE ID=".intval($_SESSION["SESS_ADV_ID"]), "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);

							// обновляем счетчик хитов по дням
							$arFields = Array("HITS" => "HITS+1", "FAVORITES" => "FAVORITES + ".intval($favorite));
							$rows = $DB->Update("b_stat_adv_day",$arFields,"WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and DATE_STAT=".$DB_now_date,"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
							// если его нет то
							if (intval($rows)<=0)
							{
								// добавляем его
								$arFields = Array(
									"ADV_ID"		=> intval($_SESSION["SESS_ADV_ID"]),
									"DATE_STAT"		=> $DB_now_date,
									"HITS"			=> 1,
									"FAVORITES"		=> intval($favorite)
									);
								$DB->Insert("b_stat_adv_day",$arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
							}
						}
						// обновляем рекламные кампании по возврату
						elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0)
						{
							// увеличиваем счетчик хитов на возврате
							$arFields = Array(
								"DATE_LAST"		=> $DB_now,
								"HITS_BACK"		=> "HITS_BACK+1"
								);
							if ($FAVORITES=="Y" && $ALLOW_ADV_FAVORITES=="Y")
							{
								// увеличиваем счетчик посетителей добавивших в избранное на возврате
								$arFields["FAVORITES_BACK"] = "FAVORITES_BACK + 1";
								$favorite = 1;
							}
							$DB->Update("b_stat_adv",$arFields,"WHERE ID=".intval($_SESSION["SESS_LAST_ADV_ID"]), "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);

							$arFields = Array("HITS_BACK" => "HITS_BACK+1", "FAVORITES_BACK" => "FAVORITES_BACK + ".intval($favorite));
							// обновляем счетчик хитов по дням
							$rows = $DB->Update("b_stat_adv_day",$arFields,"WHERE ADV_ID=".intval($_SESSION["SESS_LAST_ADV_ID"])." and DATE_STAT=".$DB_now_date,"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
							// если его нет то
							if (intval($rows)<=0)
							{
								// добавляем его
								$arFields = Array(
									"ADV_ID" => intval($_SESSION["SESS_LAST_ADV_ID"]),
									"DATE_STAT" => $DB_now_date,
									"HITS_BACK" => 1,
									"FAVORITES_BACK" => intval($favorite),
								);
								$DB->Insert("b_stat_adv_day",$arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
							}
						}

						// обрабатываем событие
						if (defined("GENERATE_EVENT") && GENERATE_EVENT=="Y")
						{
							global $event1, $event2, $event3, $goto, $money, $currency, $site_id;
							if($site_id == '')
								$site_id = false;
							CStatistics::Set_Event($event1, $event2, $event3, $goto, $money, $currency, $site_id);
						}

						// увеличиваем счетчик хитов у страны
						if ($_SESSION["SESS_COUNTRY_ID"] <> '')
						{
							CStatistics::UpdateCountry($_SESSION["SESS_COUNTRY_ID"], Array("HITS" => 1));
						}

						if($_SESSION["SESS_CITY_ID"] > 0)
						{
							CStatistics::UpdateCity($_SESSION["SESS_CITY_ID"], Array("HITS" => 1));
						}

						if (
							isset($_SESSION["SESS_FROM_SEARCHERS"])
							&& is_array($_SESSION["SESS_FROM_SEARCHERS"])
							&& !empty($_SESSION["SESS_FROM_SEARCHERS"])
						)
						{
							// обновляем счетчик хитов у поисковых фраз для поисковиков
							$arFields = Array("PHRASES_HITS" => "PHRASES_HITS+1");
							$_SESSION["SESS_FROM_SEARCHERS"] = array_unique($_SESSION["SESS_FROM_SEARCHERS"]);
							if(count($_SESSION["SESS_FROM_SEARCHERS"]) > 0)
							{
								$str = "0";
								foreach($_SESSION["SESS_FROM_SEARCHERS"] as $value)
									$str .= ", ".intval($value);
								$DB->Update("b_stat_searcher",$arFields,"WHERE ID in ($str)", "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
							}
						}

						if (isset($_SESSION["SESS_REFERER_ID"]) && intval($_SESSION["SESS_REFERER_ID"])>0)
						{
							// обновляем ссылающиеся
							$arFields = Array("HITS"=>"HITS+1");
							$DB->Update("b_stat_referer", $arFields, "WHERE ID=".intval($_SESSION["SESS_REFERER_ID"]), "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
						}
					}

					/*******************************************************
						Переменные хранящие параметры предыдущей страницы
					*******************************************************/

					$_SESSION["SESS_HTTP_REFERER"] = $_SESSION["SESS_LAST_URI"] ?? '';
					$_SESSION["SESS_LAST_PROTOCOL"] = $CURRENT_PROTOCOL;
					$_SESSION["SESS_LAST_PORT"] = $CURRENT_PORT;
					$_SESSION["SESS_LAST_HOST"] = $CURRENT_HOST;
					$_SESSION["SESS_LAST_URI"] = $CURRENT_URI;
					$_SESSION["SESS_LAST_PAGE"] = $CURRENT_PAGE;
					$_SESSION["SESS_LAST_DIR"] = $CURRENT_DIR;
				}
			}
			else // if (!$BLOCK_ACTIVITY)
			{
				/************************************************
					Обработка превышения лимита активности
				*************************************************/

				$fname = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/activity_limit.php";
				if(file_exists($fname))
				{
					include($fname);
				}
				else
				{
					CHTTP::SetStatus("503 Service Unavailable");
					die();
				}
			}

			/************************************************************
				Обрабатываем ситуацию когда не поддерживаются
				сессии и/или не сохраняются куки
			*************************************************************/

			// если мы делали select из таблицы b_stat_session_data то
			if($SESSION_DATA_ID)
			{
				$arrSTAT_SESSION = stat_session_register(true);
				$sess_data_for_db = ($DB->type == "ORACLE") ? "'".$DB->ForSql(serialize($arrSTAT_SESSION), 2000)."'" :  "'".$DB->ForSql(serialize($arrSTAT_SESSION))."'";
				// если в результате этого select'а были выбраны данные то
				if((intval($SESSION_DATA_ID) > 0) && ($SESSION_DATA_ID !== true))
				{
					// обновляем их
					$arFields = array(
						"DATE_LAST" => $DB_now,
						"GUEST_MD5" => "'".get_guest_md5()."'",
						"SESS_SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
						"SESSION_DATA" => $sess_data_for_db
					);
					$DB->Update("b_stat_session_data", $arFields, "WHERE ID = ".intval($SESSION_DATA_ID), "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				}
				else
				{
					// иначе вставляем эти данные
					$arFields = array(
						"DATE_FIRST" => $DB_now,
						"DATE_LAST" => $DB_now,
						"GUEST_MD5" => "'".get_guest_md5()."'",
						"SESS_SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
						"SESSION_DATA" => $sess_data_for_db
						);
					$DB->Insert("b_stat_session_data", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
				}
			}
		} // if ($STOP_SAVE_STATISTIC!="N" or $STOP!="Y")

		if ($STOP=="Y")
		{
			$z = CLanguage::GetByID($STOP_MESSAGE_LID);
			$zr = $z->Fetch();
			$charset = ($zr["CHARSET"] <> '') ? $zr["CHARSET"] : "windows-1251";

			//We have URL with no MESSAGE
			if(($STOP_REDIRECT_URL <> '') && ($STOP_MESSAGE == ''))
			{//So just do redirect
				LocalRedirect($STOP_REDIRECT_URL, true);
			}
			//We have some to say
			elseif($STOP_MESSAGE <> '')
			{
				$STOP_MESSAGE .= " [".$STOP_LIST_ID."]";
echo '<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset='.$charset.'">
		'.($STOP_REDIRECT_URL <> ''? '<meta http-equiv="Refresh" content="3;URL='.htmlspecialcharsbx($STOP_REDIRECT_URL).'">': '').'
	</head>
	<body>
		<div align="center"><h3>'.$STOP_MESSAGE.'</h3></div>
	</body>
</html>';
			}
			die();
		}
	}

	public static function RestoreSession()
	{
		global $APPLICATION;
		// if there is no session ID
		if(!isset($_SESSION["SESS_SESSION_ID"]) || intval($_SESSION["SESS_SESSION_ID"]) <= 0)
		{
			if(COption::GetOptionString("statistic", "SAVE_SESSION_DATA") == "Y")
			{
				// try to use coockie
				$COOKIE_GUEST_ID = intval($APPLICATION->get_cookie("GUEST_ID"));
				if($COOKIE_GUEST_ID <= 0)
				{
					// restore session data from b_stat_session_data
					$z = CStatistics::GetSessionDataByMD5(get_guest_md5());
					if($zr = $z->Fetch())
					{
						$arrSESSION_DATA = unserialize($zr["SESSION_DATA"], ['allowed_classes' => false]);
						if(is_array($arrSESSION_DATA))
						{
							foreach($arrSESSION_DATA as $key => $value)
								$_SESSION[$key] = $value;
						}
						return intval($zr["ID"]); //Guest was found
					}
					return true; //Just tried to restore session data
				}
			}
		}
		return false; //We have no choice to restore guest session
	}

	// обновляем счетчики сессий и новых посетителей у страны
	public static function UpdateCountry($COUNTRY_ID, $arFields, $DATE=false, $DATE_FORMAT="SHORT", $SIGN="+")
	{
		$DB = CDatabase::GetModuleConnection('statistic');
		$COUNTRY_ID = $DB->ForSql($COUNTRY_ID, 2);

		$ar = array();
		foreach($arFields as $name=>$value)
		{
			$ar[$name] = $name.$SIGN.intval($value);
		}
		$DB->Update("b_stat_country", $ar, "WHERE ID='".$COUNTRY_ID."'","",false,false,false);

		$rows = $DB->Update("b_stat_country_day", $ar, "WHERE COUNTRY_ID='".$COUNTRY_ID."' and  ".CStatistics::DBDateCompare("DATE_STAT", $DATE, $DATE_FORMAT),"",false,false,false);
		if(intval($rows)<=0 && $SIGN=="+")
		{
			$ar = array();
			foreach($arFields as $name=>$value)
			{
				$ar[$name] = intval($value);
			}
			$ar["COUNTRY_ID"]="'".$COUNTRY_ID."'";
			$ar["DATE_STAT"]= $DB->GetNowDate();
			$DB->Insert("b_stat_country_day",$ar);
		}
		elseif(intval($rows)>1) // если обновили более одного дня то
		{
			// удалим лишние
			$rs = $DB->Query("SELECT ID FROM b_stat_country_day WHERE COUNTRY_ID='".$COUNTRY_ID."' and  ".CStatistics::DBDateCompare("DATE_STAT", $DATE, $DATE_FORMAT)." ORDER BY ID", false);
			$ar = $rs->Fetch();
			while($ar = $rs->Fetch())
			{
				$DB->Query("DELETE FROM b_stat_country_day WHERE ID = ".$ar["ID"], false);
			}
		}
	}

	public static function UpdateCity($CITY_ID, $arFields, $DATE=false, $DATE_FORMAT="SHORT", $SIGN="+")
	{
		$DB = CDatabase::GetModuleConnection('statistic');
		$CITY_ID = intval($CITY_ID);

		$ar = array();
		foreach($arFields as $name=>$value)
		{
			$ar[$name] = $name.$SIGN.intval($value);
		}
		$DB->Update("b_stat_city", $ar, "WHERE ID = ".$CITY_ID, "", false, false, false);

		$rows = $DB->Update("b_stat_city_day", $ar, "WHERE CITY_ID = ".$CITY_ID." and ".CStatistics::DBDateCompare("DATE_STAT", $DATE, $DATE_FORMAT),"",false,false,false);
		if(intval($rows)<=0 && $SIGN=="+")
		{
			$ar = array();
			foreach($arFields as $name=>$value)
			{
				$ar[$name] = intval($value);
			}
			$ar["CITY_ID"] = $CITY_ID;
			$ar["DATE_STAT"] = $DB->GetNowDate();
			$DB->Insert("b_stat_city_day", $ar);
		}
		elseif(intval($rows)>1) // если обновили более одного дня то
		{
			// удалим лишние
			$rs = $DB->Query("SELECT ID FROM b_stat_city_day WHERE CITY_ID = ".$CITY_ID." and ".CStatistics::DBDateCompare("DATE_STAT", $DATE, $DATE_FORMAT)." ORDER BY ID", false);
			$ar = $rs->Fetch();
			while($ar = $rs->Fetch())
			{
				$DB->Query("DELETE FROM b_stat_city_day WHERE ID = ".$ar["ID"], false);
			}
		}
	}

	public static function SavePathData($SITE_ID, $CURRENT_PAGE, $ERROR_404)
	{
		$DB = CDatabase::GetModuleConnection('statistic');
		$DB_now = $DB->GetNowFunction();
		$DB_now_date = $DB->GetNowDate();
		$STEPS = intval(COption::GetOptionString("statistic", "MAX_PATH_STEPS"));

		if(isset($_SESSION["SESS_LAST_PAGE"]) && $_SESSION["SESS_LAST_PAGE"] == $CURRENT_PAGE)
			return;

		$COUNTER_ABNORMAL = 0; // счетчик показывающий сколько раз прошли по данному пути без поддержки HTTP_REFERER

		// получим ссылающуюся страницу
		if (empty($_SERVER["HTTP_REFERER"]))
		{
			if (!empty($_SESSION["SESS_LAST_PAGE"]))
			{
				$COUNTER_ABNORMAL = 1;
			}
			$PATH_REFERER = __GetFullReferer($_SESSION["SESS_LAST_PAGE"] ?? '');
		}
		else
		{
			$PATH_REFERER = __GetFullReferer();
		}

		if($PATH_REFERER==$CURRENT_PAGE)
			return;

		// получим из кэша данные по предыдущему пути: ID пути, набор страниц и т.д.
		if($PATH_REFERER <> '')
		{
			$where1 = " and C.PATH_LAST_PAGE = '".$DB->ForSql($PATH_REFERER,255)."'";
		}
		else
		{
			$where1 = " and (C.PATH_LAST_PAGE is null or ".$DB->Length("C.PATH_LAST_PAGE")."<=0)";
		}
		$strSql = CStatistics::DBTopSql("
			SELECT /*TOP*/
				C.ID as CACHE_ID,
				C.PATH_ID,
				C.PATH_PAGES,
				C.PATH_FIRST_PAGE,
				C.PATH_FIRST_PAGE_SITE_ID,
				C.PATH_FIRST_PAGE_404,
				C.PATH_STEPS,
				C.PATH_LAST_PAGE,
				C.IS_LAST_PAGE
			FROM
				b_stat_path_cache C
			WHERE
				C.SESSION_ID = ".intval($_SESSION['SESS_SESSION_ID'])."
			$where1
			ORDER BY
				C.ID desc
			", 1);

		$rsPREV_PATH = $DB->Query($strSql);
		$arPREV_PATH = $rsPREV_PATH->Fetch();

		if (!$arPREV_PATH)
		{
			$arPREV_PATH = [
				"PATH_ID" => '',
				"PATH_PAGES" => '',
				"PATH_STEPS" => '',
				"PATH_FIRST_PAGE" => '',
				"PATH_LAST_PAGE" => '',
				"IS_LAST_PAGE" => '',
			];
		}

		$arrUpdate404_1 = array();
		$arrUpdate404_2 = array();

		// сформируем переменные описывающие текущий путь
		$CURRENT_PATH_ID = GetStatPathID($CURRENT_PAGE, $arPREV_PATH["PATH_ID"]);
		$tmp_SITE_ID = ($SITE_ID <> '') ? "[".$SITE_ID."] " : "";
		$CURRENT_PATH_PAGES_404 = $arPREV_PATH["PATH_PAGES"].$tmp_SITE_ID."ERROR_404: ".$CURRENT_PAGE."\n";

		if ($ERROR_404=="Y")
		{
			$CURRENT_PATH_PAGES = $CURRENT_PATH_PAGES_404;
		}
		else
		{
			$CURRENT_PATH_PAGES = $arPREV_PATH["PATH_PAGES"].$tmp_SITE_ID.$CURRENT_PAGE."\n";

			if($DB->type == "ORACLE")
				$arrUpdate404_1["PATH_PAGES"] = mb_substr($CURRENT_PATH_PAGES_404, 0, 2000);
			elseif($DB->type == "MSSQL")
				$arrUpdate404_1["PATH_PAGES"] = mb_substr($CURRENT_PATH_PAGES_404, 0, 7000);
			else
				$arrUpdate404_1["PATH_PAGES"] = $CURRENT_PATH_PAGES_404;

			$arrUpdate404_2["PAGES"] = $arrUpdate404_1["PATH_PAGES"];
		}

		$CURRENT_PATH_STEPS = intval($arPREV_PATH["PATH_STEPS"])+1;
		if ($arPREV_PATH["PATH_FIRST_PAGE"] <> '')
		{
			$FIRST_PAGE = $arPREV_PATH["PATH_FIRST_PAGE"];
			$FIRST_PAGE_SITE_ID = $arPREV_PATH["PATH_FIRST_PAGE_SITE_ID"];
			$FIRST_PAGE_404 = ($arPREV_PATH["PATH_FIRST_PAGE_404"]=="Y") ? "Y" : "N";
		}
		else
		{
			$FIRST_PAGE = $CURRENT_PAGE;
			$FIRST_PAGE_SITE_ID = $SITE_ID;
			$FIRST_PAGE_404 = $ERROR_404;

			if ($ERROR_404=="N")
			{
				$arrUpdate404_1["PATH_FIRST_PAGE_404"] = "Y";
				$arrUpdate404_2["FIRST_PAGE_404"] = "Y";
			}
		}

		$sql_CURRENT_PATH_PAGES = $DB->ForSql($CURRENT_PATH_PAGES);

		$sql_FIRST_PAGE_SITE_ID = $FIRST_PAGE_SITE_ID <> '' ? "'".$DB->ForSql($FIRST_PAGE_SITE_ID,2)."'" : "null";

		$sql_LAST_PAGE_SITE_ID = $SITE_ID <> '' ? "'".$DB->ForSql($SITE_ID,2)."'" : "null";

		// вставим данный путь в кэш
		$arFields = array(
			"SESSION_ID"			=> intval($_SESSION['SESS_SESSION_ID']),
			"PATH_ID"			=> intval($CURRENT_PATH_ID),
			"PATH_PAGES"			=> "'".$sql_CURRENT_PATH_PAGES."'",
			"PATH_FIRST_PAGE"		=> "'".$DB->ForSql($FIRST_PAGE, 255)."'",
			"PATH_FIRST_PAGE_404"		=> "'".$DB->ForSql($FIRST_PAGE_404)."'",
			"PATH_FIRST_PAGE_SITE_ID"	=> $sql_FIRST_PAGE_SITE_ID,
			"PATH_LAST_PAGE"		=> "'".$DB->ForSql($CURRENT_PAGE,255)."'",
			"PATH_LAST_PAGE_404"		=> "'".$DB->ForSql($ERROR_404)."'",
			"PATH_LAST_PAGE_SITE_ID"	=> $sql_LAST_PAGE_SITE_ID,
			"PATH_STEPS"			=> $CURRENT_PATH_STEPS,
			"DATE_HIT"			=> $DB_now,
			"IS_LAST_PAGE"			=> "'Y'"
			);
		$id = $DB->Insert("b_stat_path_cache",$arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
		if ($ERROR_404=="N")
		{
			$arrUpdate404_1["PATH_LAST_PAGE_404"] = "Y";
			$arrUpdate404_2["LAST_PAGE_404"] = "Y";
		}
		CStatistics::Set404("b_stat_path_cache", "ID = ".intval($id), $arrUpdate404_1);

		// увеличим счетчик динамики по текущему пути
		$arFields = array(
			"COUNTER"		=> "COUNTER + 1",
			"COUNTER_FULL_PATH"	=> "COUNTER_FULL_PATH + 1",
			"COUNTER_ABNORMAL"	=> "COUNTER_ABNORMAL + ".intval($COUNTER_ABNORMAL),
		);
		$rows = $DB->Update("b_stat_path",$arFields,"WHERE PATH_ID='".$CURRENT_PATH_ID."' and DATE_STAT=".$DB_now_date, "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);

		if (intval($rows)<=0)
		{
			$sql_PARENT_PATH_ID = ($arPREV_PATH["PATH_ID"] <> '') ? $arPREV_PATH["PATH_ID"] : "null";
			$arFields = array(
				"PATH_ID"		=> intval($CURRENT_PATH_ID),
				"PARENT_PATH_ID"	=> $sql_PARENT_PATH_ID,
				"DATE_STAT"		=> $DB_now_date,
				"COUNTER"		=> 1,
				"COUNTER_FULL_PATH"	=> 1,
				"COUNTER_ABNORMAL"	=> intval($COUNTER_ABNORMAL),
				"PAGES"			=> "'".$sql_CURRENT_PATH_PAGES."'",
				"FIRST_PAGE"		=> "'".$DB->ForSql($FIRST_PAGE,255)."'",
				"FIRST_PAGE_SITE_ID"	=> $sql_FIRST_PAGE_SITE_ID,
				"FIRST_PAGE_404"	=> "'".$DB->ForSql($FIRST_PAGE_404)."'",
				"PREV_PAGE"		=> "'".$DB->ForSql($arPREV_PATH["PATH_LAST_PAGE"])."'",
				"PREV_PAGE_HASH"	=> crc32ex($arPREV_PATH["PATH_LAST_PAGE"]),
				"LAST_PAGE"		=> "'".$DB->ForSql($CURRENT_PAGE,255)."'",
				"LAST_PAGE_404"		=> "'".$DB->ForSql($ERROR_404)."'",
				"LAST_PAGE_SITE_ID"	=> $sql_LAST_PAGE_SITE_ID,
				"LAST_PAGE_HASH"	=> crc32ex($CURRENT_PAGE),
				"STEPS"			=> $CURRENT_PATH_STEPS
				);
			if($CURRENT_PATH_STEPS<=$STEPS)
			{
				$id = $DB->Insert("b_stat_path",$arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
				CStatistics::Set404("b_stat_path", "ID = ".intval($id), $arrUpdate404_2);
			}
		}

		// если предыдущая страница считалась последней страницей в пути то
		if ($arPREV_PATH["IS_LAST_PAGE"]=="Y")
		{
			// сбросим счетчик конечных путей для предыдущей страницы
			$arFields = array("COUNTER_FULL_PATH" => "COUNTER_FULL_PATH - 1");
			$DB->Update("b_stat_path",$arFields,"WHERE PATH_ID='".$arPREV_PATH["PATH_ID"]."' and DATE_STAT=".$DB_now_date, "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);

			// сбросим флаг того что предудущая страница - последняя страница в пути
			$arFields = array("IS_LAST_PAGE" => "'N'");
			$DB->Update("b_stat_path_cache",$arFields,"WHERE ID='".$arPREV_PATH["CACHE_ID"]."'","File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
		}

		// зафиксируем счетчик пути в связке с рекламной кампанией
		if (intval($_SESSION["SESS_ADV_ID"])>0)
		{
			$ADV_ID = intval($_SESSION["SESS_ADV_ID"]);
			$arFields = array(
				"COUNTER"		=> "COUNTER + 1",
				"COUNTER_FULL_PATH"	=> "COUNTER_FULL_PATH + 1"
			);
			$sql_COUNTER = 1;
			$sql_COUNTER_FULL_PATH = 1;
			$sql_COUNTER_BACK = 0;
			$sql_COUNTER_FULL_PATH_BACK = 0;
			$ADV_BACK = "N";
		}
		elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0)
		{
			$ADV_ID = intval($_SESSION["SESS_LAST_ADV_ID"]);
			$arFields = array(
				"COUNTER_BACK"			=> "COUNTER_BACK + 1",
				"COUNTER_FULL_PATH_BACK"	=> "COUNTER_FULL_PATH_BACK + 1"
			);
			$sql_COUNTER = 0;
			$sql_COUNTER_FULL_PATH = 0;
			$sql_COUNTER_BACK = 1;
			$sql_COUNTER_FULL_PATH_BACK = 1;
			$ADV_BACK = "Y";
		}
		else
			return; //ADV_ID == 0

		$rows = $DB->Update("b_stat_path_adv",$arFields,"WHERE ADV_ID=".intval($ADV_ID)." and PATH_ID='".$CURRENT_PATH_ID."' and DATE_STAT=".$DB_now_date, "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
		if (intval($rows)<=0)
		{
			$arFields = array(
				"ADV_ID"			=> intval($ADV_ID),
				"PATH_ID"			=> intval($CURRENT_PATH_ID),
				"DATE_STAT"			=> $DB_now_date,
				"COUNTER"			=> $sql_COUNTER,
				"COUNTER_BACK"			=> $sql_COUNTER_BACK,
				"COUNTER_FULL_PATH"		=> $sql_COUNTER_FULL_PATH,
				"COUNTER_FULL_PATH_BACK"	=> $sql_COUNTER_FULL_PATH_BACK,
				"STEPS"				=> $CURRENT_PATH_STEPS,
			);
			if($CURRENT_PATH_STEPS<=$STEPS)
			{
				$DB->Insert("b_stat_path_adv", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
			}
		}
		if ($arPREV_PATH["IS_LAST_PAGE"]=="Y")
		{
			if ($ADV_BACK=="N")
			{
				$arFields = array("COUNTER_FULL_PATH" => "COUNTER_FULL_PATH - 1");
				$DB->Update("b_stat_path_adv", $arFields, "WHERE ADV_ID='".$ADV_ID."' and PATH_ID='".$arPREV_PATH["PATH_ID"]."' and DATE_STAT=".$DB_now_date, "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
			}
			elseif ($ADV_BACK=="Y")
			{
				$arFields = array("COUNTER_FULL_PATH_BACK" => "COUNTER_FULL_PATH_BACK - 1");
				$DB->Update("b_stat_path_adv", $arFields, "WHERE ADV_ID='".$ADV_ID."' and PATH_ID='".$arPREV_PATH["PATH_ID"]."' and DATE_STAT=".$DB_now_date, "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
			}
		}
	}

	public static function SaveVisits($sql_site, $SESSION_NEW, $CURRENT_DIR, $CURRENT_PAGE, $ERROR_404)
	{
		$DB = CDatabase::GetModuleConnection('statistic');
		$DB_now_date = $DB->GetNowDate();
		$enter_counter = ($SESSION_NEW=="Y") ? 1 : 0;
		if ($CURRENT_DIR <> '' && $CURRENT_PAGE <> '')
		{
			$LAST_DIR_ID = intval($_SESSION["SESS_LAST_DIR_ID"] ?? 0);
			$LAST_PAGE_ID = intval($_SESSION["SESS_LAST_PAGE_ID"] ?? 0);
			$CURRENT_DIR_ID = 0;
			$CURRENT_PAGE_ID = 0;
			$exit_dir_counter = 0; // счетчик точки выхода для раздела
			$exit_page_counter = 0; // счетчик точки выхода для страницы
			if (!isset($_SESSION["SESS_LAST_DIR"]) || $_SESSION["SESS_LAST_DIR"] != $CURRENT_DIR || !isset($_SESSION["SESS_LAST_PAGE"]) || $_SESSION["SESS_LAST_PAGE"] != $CURRENT_PAGE)
			{
				$strSql = "
					SELECT
						ID,
						DIR
					FROM
						b_stat_page
					WHERE
						DATE_STAT = ".$DB_now_date."
					and (
						(URL='".$DB->ForSql($CURRENT_DIR,2000)."' and DIR='Y') or
						(URL='".$DB->ForSql($CURRENT_PAGE,2000)."' and DIR='N')
						)
					";

				$rsID = $DB->Query($strSql);
				while ($arID = $rsID->Fetch())
				{
					if ($arID["DIR"]=="Y") $CURRENT_DIR_ID = $arID["ID"];
					elseif ($arID["DIR"]=="N") $CURRENT_PAGE_ID = $arID["ID"];
				}
				if ($CURRENT_DIR_ID!=$LAST_DIR_ID) $exit_dir_counter = 1;
				if ($CURRENT_PAGE_ID!=$LAST_PAGE_ID) $exit_page_counter = 1;
			}
			else
			{
				$CURRENT_DIR_ID = $LAST_DIR_ID;
				$CURRENT_PAGE_ID = $LAST_PAGE_ID;
			}

			// определим ID рекламной кампании
			if (intval($_SESSION["SESS_ADV_ID"])>0)
			{
				$ADV_ID = intval($_SESSION["SESS_ADV_ID"]);
				$bADV_BACK = false;
			}
			elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0)
			{
				$ADV_ID = intval($_SESSION["SESS_LAST_ADV_ID"]);
				$bADV_BACK = true;
			}
			else
				$ADV_ID = 0;

			// обновляем раздел
			if ($LAST_DIR_ID>0 && $exit_dir_counter>0)
			{
				$arFields = array("EXIT_COUNTER" => "EXIT_COUNTER - 1");
				$DB->Update("b_stat_page",$arFields,"WHERE ID = '".$LAST_DIR_ID."'","File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				if ($ADV_ID>0)
				{
					if ($bADV_BACK)
					{
						$arFields = array(
							"EXIT_COUNTER_BACK" => "EXIT_COUNTER_BACK - 1"
						);
					}
					$DB->Update("b_stat_page_adv",$arFields,"WHERE PAGE_ID = '".$LAST_DIR_ID."' and ADV_ID=".$ADV_ID,"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				}
			}

			$adv_rows_dir = 0;
			if ($CURRENT_DIR_ID>0)
			{
				$arFields = Array(
					"COUNTER"		=> "COUNTER + 1",
					"EXIT_COUNTER"		=> "EXIT_COUNTER + ".$exit_dir_counter,
					"ENTER_COUNTER"		=> "ENTER_COUNTER + ".$enter_counter
					);
				$DB->Update("b_stat_page",$arFields,"WHERE ID = '".$CURRENT_DIR_ID."'","File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				if ($ADV_ID>0)
				{
					if ($bADV_BACK)
					{
						$arFields = Array(
							"COUNTER_BACK"			=> "COUNTER_BACK + 1",
							"EXIT_COUNTER_BACK"		=> "EXIT_COUNTER_BACK + ".$exit_dir_counter,
							"ENTER_COUNTER_BACK"	=> "ENTER_COUNTER_BACK + ".$enter_counter
							);
					}
					$adv_rows_dir = $DB->Update("b_stat_page_adv",$arFields,"WHERE PAGE_ID = '".$CURRENT_DIR_ID."' and ADV_ID = ".$ADV_ID, "File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				}
			}
			else
			{
				$arFields = Array(
					"DATE_STAT"		=> $DB_now_date,
					"COUNTER"		=> 1,
					"EXIT_COUNTER"		=> 1,
					"ENTER_COUNTER"		=> $enter_counter,
					"DIR"			=> "'Y'",
					"URL"			=> "'".$DB->ForSql($CURRENT_DIR,2000)."'",
					"URL_HASH"		=> crc32ex($CURRENT_DIR),
					"SITE_ID"		=> $sql_site
					);
				$CURRENT_DIR_ID = $DB->Insert("b_stat_page",$arFields,"File: ".__FILE__."<br>Line: ".__LINE__);
			}
			$_SESSION["SESS_LAST_DIR_ID"] = $CURRENT_DIR_ID;

			if (intval($adv_rows_dir)<=0)
			{
				if ($ADV_ID>0)
				{
					$arFields = Array(
						"DATE_STAT"		=> $DB_now_date,
						"PAGE_ID"		=> $CURRENT_DIR_ID,
						"ADV_ID"		=> $ADV_ID,
						"COUNTER"		=> 1,
						"EXIT_COUNTER"		=> 1,
						"ENTER_COUNTER"		=> $enter_counter,
						"COUNTER_BACK"		=> 0,
						"EXIT_COUNTER_BACK"	=> 0,
						"ENTER_COUNTER_BACK"	=> 0
						);
					if ($bADV_BACK)
					{
						$arFields["COUNTER"] = 0;
						$arFields["EXIT_COUNTER"] = 0;
						$arFields["ENTER_COUNTER"] = 0;
						$arFields["COUNTER_BACK"] = 1;
						$arFields["EXIT_COUNTER_BACK"] = 1;
						$arFields["ENTER_COUNTER_BACK"] = $enter_counter;
					}
					$DB->Insert("b_stat_page_adv",$arFields,"File: ".__FILE__."<br>Line: ".__LINE__);
				}
			}

			// обновим страницу
			if ($LAST_PAGE_ID>0 && $exit_page_counter>0)
			{
				$arFields = array("EXIT_COUNTER" => "EXIT_COUNTER - 1");
				$DB->Update("b_stat_page",$arFields,"WHERE ID = '".$LAST_PAGE_ID."'","File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				if ($ADV_ID>0)
				{
					if ($bADV_BACK)
					{
						$arFields = array(
							"EXIT_COUNTER_BACK" => "EXIT_COUNTER_BACK - 1"
						);
					}
					$DB->Update("b_stat_page_adv",$arFields,"WHERE PAGE_ID = '".$LAST_PAGE_ID."' and ADV_ID=".$ADV_ID,"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				}
			}

			$adv_rows_page = 0;
			if ($CURRENT_PAGE_ID>0)
			{
				$arFields = Array(
					"COUNTER"		=> "COUNTER + 1",
					"EXIT_COUNTER"		=> "EXIT_COUNTER + ".$exit_page_counter,
					"ENTER_COUNTER"		=> "ENTER_COUNTER + ".$enter_counter,
					"URL_404"		=> "'".$ERROR_404."'"
				);
				$DB->Update("b_stat_page",$arFields,"WHERE ID = '".$CURRENT_PAGE_ID."'","File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				if ($ERROR_404=="N")
				{
					CStatistics::Set404("b_stat_page", "ID = ".intval($CURRENT_PAGE_ID), array("URL_404" => "Y"));
				}

				if ($ADV_ID>0)
				{
					if ($bADV_BACK)
					{
						$arFields = Array(
							"COUNTER_BACK"		=> "COUNTER_BACK + 1",
							"EXIT_COUNTER_BACK"	=> "EXIT_COUNTER_BACK + ".$exit_dir_counter,
							"ENTER_COUNTER_BACK"	=> "ENTER_COUNTER_BACK + ".$enter_counter
							);
					}
					unset($arFields["URL_404"]);
					$adv_rows_page = $DB->Update("b_stat_page_adv",$arFields,"WHERE PAGE_ID = '".$CURRENT_PAGE_ID."' and ADV_ID = ".$ADV_ID,"File: ".__FILE__."<br>Line: ".__LINE__,false,false,false);
				}
			}
			else
			{
				$arFields = Array(
					"DATE_STAT"		=> $DB_now_date,
					"COUNTER"		=> 1,
					"EXIT_COUNTER"		=> 1,
					"ENTER_COUNTER"		=> $enter_counter,
					"DIR"			=> "'N'",
					"URL"			=> "'".$DB->ForSql($CURRENT_PAGE,2000)."'",
					"URL_404"		=> "'".$ERROR_404."'",
					"URL_HASH"		=> crc32ex($CURRENT_PAGE),
					"SITE_ID"		=> $sql_site
					);
				$CURRENT_PAGE_ID = $DB->Insert("b_stat_page",$arFields,"File: ".__FILE__."<br>Line: ".__LINE__);
				if ($ERROR_404=="N")
				{
					CStatistics::Set404("b_stat_page", "ID = ".intval($CURRENT_PAGE_ID), array("URL_404" => "Y"));
				}
			}
			$_SESSION["SESS_LAST_PAGE_ID"] = $CURRENT_PAGE_ID;

			if (intval($adv_rows_page)<=0 && $ADV_ID>0)
			{
				$arFields = Array(
					"DATE_STAT"		=> $DB_now_date,
					"PAGE_ID"		=> $CURRENT_PAGE_ID,
					"ADV_ID"		=> $ADV_ID,
					"COUNTER"		=> $bADV_BACK?0:1,
					"EXIT_COUNTER"		=> $bADV_BACK?0:1,
					"ENTER_COUNTER"		=> $bADV_BACK?0:$enter_counter,
					"COUNTER_BACK"		=> $bADV_BACK?1:0,
					"EXIT_COUNTER_BACK"	=> $bADV_BACK?1:0,
					"ENTER_COUNTER_BACK"	=> $bADV_BACK?$enter_counter:0,
				);
				$DB->Insert("b_stat_page_adv",$arFields,"File: ".__FILE__."<br>Line: ".__LINE__);
			}
		}
	}

	public static function GetRefererListID($PROT, $SN, $PAGE_FROM, $CURRENT_URI, $ERROR_404, $sql_site)
	{
		$DB = CDatabase::GetModuleConnection('statistic');
		$DB_now = $DB->GetNowFunction();

		// ID of the referer
		$rsReferer = $DB->Query("
			SELECT ID
			FROM b_stat_referer
			WHERE SITE_NAME = '".$DB->ForSql($SN, 255)."'
		");
		$arReferer = $rsReferer->Fetch();

		if($arReferer)
		{
			// update session counter
			$DB->Update(
				"b_stat_referer",
				array("SESSIONS" => "SESSIONS + 1"),
				"WHERE ID=".$arReferer["ID"],
				"File: ".__FILE__."<br>Line: ".__LINE__, false, false, false
			);
			$_SESSION["SESS_REFERER_ID"] = intval($arReferer["ID"]);
		}
		else
		{
			// add new one
			$arFields = array(
				"DATE_FIRST" => $DB_now,
				"DATE_LAST" => $DB_now,
				"SITE_NAME" => "'".$DB->ForSql($SN, 255)."'",
				"SESSIONS" => 1,
			);
			$_SESSION["SESS_REFERER_ID"] = intval($DB->Insert("b_stat_referer", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__));
		}

		// save referring fact to database
		$arFields = array(
			"DATE_HIT" => $DB_now,
			"REFERER_ID" => $_SESSION["SESS_REFERER_ID"],
			"PROTOCOL" => "'".$DB->ForSql($PROT, 10)."'",
			"SITE_NAME" => "'".$DB->ForSql($SN, 255)."'",
			"URL_FROM" => "'".$DB->ForSql($PAGE_FROM, 2000)."'",
			"URL_TO" => "'".$DB->ForSql($CURRENT_URI, 2000)."'",
			"URL_TO_404" => "'".$ERROR_404."'",
			"SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
			"ADV_ID" => intval($_SESSION["SESS_ADV_ID"]),
			"SITE_ID" => $sql_site,
		);

		$REFERER_LIST_ID = intval($DB->Insert("b_stat_referer_list", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__));
		if($ERROR_404=="N")
		{
			CStatistics::Set404("b_stat_referer_list", "ID = ".$REFERER_LIST_ID, array("URL_TO_404" => "Y"));
		}

		return $REFERER_LIST_ID;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit