function IncParam($arParam, $arParamSite = false, $SITE_ID = false, $DATE = false, $DATE_FORMAT = "FULL", $SIGN = "+")
 {
     $DB = CDatabase::GetModuleConnection('statistic');
     if ($DATE == false) {
         $strWhere = "WHERE " . CStatistics::DBDateCompare("DATE_STAT");
         $stmp = time();
     } else {
         $stmp = MakeTimeStamp($DATE, $DATE_FORMAT == "SHORT" ? FORMAT_DATE : FORMAT_DATETIME);
         $strWhere = "WHERE " . CStatistics::DBDateCompare("DATE_STAT", ConvertTimeStamp($stmp));
     }
     $HOUR = date("G", $stmp);
     // 0..23
     $WEEKDAY = date("w", $stmp);
     // 0..6
     $MONTH = date("n", $stmp);
     // 1..12
     static $arKeys = array("HOUR", "WEEKDAY", "MONTH");
     static $arPreKeys = array("HITS" => 0, "FAVORITES" => 0, "SESSIONS" => 0, "C_HOSTS" => 0, "GUESTS" => 0, "NEW_GUESTS" => 0);
     $rows = false;
     if (is_array($arParam) && count($arParam) > 0) {
         if (array_key_exists("TOTAL_HOSTS", $arParam)) {
             unset($arParam["TOTAL_HOSTS"]);
         }
         $arFields = array();
         foreach ($arParam as $name => $value) {
             if (array_key_exists($name, $arPreKeys)) {
                 $arFields[$name] = $name . " + " . intval($value);
             } else {
                 foreach ($arKeys as $key) {
                     $k = $key . "_" . $name . "_" . ${$key};
                     $arFields[$k] = "{$k} " . ($SIGN === "-" ? "-" : "+") . " " . intval($value);
                 }
             }
         }
         if (count($arFields) > 0) {
             $rows = $DB->Update("b_stat_day", $arFields, $strWhere);
         }
     }
     if ($SITE_ID === false) {
         $SITE_ID = "";
         if (defined("ADMIN_SECTION") && ADMIN_SECTION === true) {
             $SITE_ID = "";
         } elseif (defined("SITE_ID")) {
             $SITE_ID = SITE_ID;
         }
     }
     if (strlen($SITE_ID) > 0 && is_array($arParamSite) && count($arParamSite) > 0) {
         $arFields = array();
         foreach ($arParamSite as $name => $value) {
             if (array_key_exists($name, $arPreKeys)) {
                 $arFields[$name] = $name . " + " . intval($value);
             } else {
                 foreach ($arKeys as $key) {
                     $k = $key . "_" . $name . "_" . ${$key};
                     $arFields[$k] = "{$k} " . ($SIGN === "-" ? "-" : "+") . " " . intval($value);
                 }
             }
         }
         if (count($arFields) > 0) {
             $rows = $DB->Update("b_stat_day_site", $arFields, $strWhere . " AND SITE_ID='" . $DB->ForSql($SITE_ID, 2) . "'");
         }
     }
     return $rows;
 }
Exemple #2
0
 /**
  * <p>Добавляет <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">событие</a> используя текущие параметры <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителя</a>. Если <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">типа события</a> с <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type_id">идентификаторами</a> <i>event1</i>, <i>event2</i> не существует, то он будет автоматически создан с указанными идентификаторами.</p>
  *
  *
  * @param string $event1  Идентификатор типа события event1.
  *
  * @param string $event2 = "" Идентификатор типа события event2.
  *
  * @param string $event3 = "" <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">Дополнительный параметр
  * event3</a> события.
  *
  * @param mixed $money = "" Денежная сумма.
  *
  * @param string $currency = "" Трехсимвольный идентификатор валюты. Идентификаторы валют
  * задаются в модуле "Валюты".
  *
  * @param string $goto = "" Адрес страницы куда перешел посетитель. Как правило используется
  * в скриптах вида /bitrix/redirect.php, перенаправляющих посетителей на
  * другие страницы с одновременной фиксацией события.
  *
  * @param string $chargeback = "N" Флаг отрицательной суммы. Используется когда необходимо
  * зафиксировать событие о возврате денег (chargeback). Возможные
  * значения: <ul> <li> <b>Y</b> - денежная сумма отрицательная; </li> <li> <b>N</b> -
  * денежная сумма положительная. </li> </ul>
  *
  * @param mixed $site_id = false ID сайта к которому будет привязано будущее событие.
  *
  * @return array <p>Метод возвращает массив вида: <br><br></p> <pre class="syntax">Array ( [TYPE_ID] =&gt; ID
  * типа события [EID] =&gt; ID добавленного события )</pre> <p></p>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // зафиксируем событие типа "Просмотр спец. страницы" (view/special_page)
  * <b>CStatEvent::AddCurrent</b>("softkey", "out", $GLOBALS["APPLICATION"]-&gt;GetCurPage());
  * ?&gt;
  * 
  * &lt;?
  * // зафиксируем событие типа "Уход на оплату заказа на Софткее" (softkey/out)
  * // если такого типа не существует, то он будет автоматически создан
  * // событие будет фиксироваться по параметрам текущего посетителя сайта
  * 
  * // в данной переменной может быть задана страница на которую осуществляется переход
  * $goto = "http://www.softkey.ru/catalog/basket.php?prodid=902&amp;quantity=1&amp;referer1=ritlabs_site&amp;referer2=BITRIX_SM.OTk1LjgyLk4wLjI1Lk4ucnU%3D";
  * 
  * <b>CStatEvent::AddCurrent</b>("softkey", "out", "", "", "", $goto);
  * ?&gt;
  * 
  * &lt;?
  * // зафиксируем событие типа "Скачивание файла manual.chm" (download/manual)
  * // если такого типа не существует, то он будет автоматически создан
  * // событие будет фиксироваться по параметрам текущего посетителя сайта
  * 
  * // сначала проверим не скачивал ли уже текущий посетитель этот файл
  * // в течение последнего часа
  * 
  * // получим ID типа события
  * $rs = CStatEventType::GetByEvents($event1, $event2);
  * if ($ar = $rs-&gt;Fetch())
  * {
  *     // теперь получим все события данного типа для текущего посетителя сайта
  *     // произошедшие за последний час (3600 секунд)
  *     $rs = CStatEvent::GetListByGuest($_SESSION["SESS_GUEST_ID"], $ar["TYPE_ID"], "", 3600);
  *     
  *     // если таких событий не было то
  *     if (!($ar=$rs-&gt;Fetch()))
  *     {
  *         // добавляем данное событие
  *         <b>CStatEvent::AddCurrent</b>("download", "manual");
  *     }
  * }
  * ?&gt;
  * </pre>
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/add.php">CStatEvent::Add</a> </li> <li>
  * <a href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/addbyevents.php">CStatEvent::AddByEvents</a>
  * </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">Термин "Событие"</a> </li>
  * <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">Термин "Дополнительный
  * параметр события (event3)"</a> </li> </ul> <a name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/addcurrent.php
  * @author Bitrix
  */
 public static function AddCurrent($event1, $event2 = "", $event3 = "", $money = "", $currency = "", $goto = "", $chargeback = "N", $site_id = false)
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     global $APPLICATION;
     $DB = CDatabase::GetModuleConnection('statistic');
     $event1 = trim($event1);
     $event2 = trim($event2);
     $event3 = trim($event3);
     if (strlen($event1) <= 0 && strlen($event2) <= 0) {
         return array("EVENT_ID" => 0, "TYPE_ID" => 0, "EID" => 0);
     }
     //Check if register event for searcher
     if (intval($_SESSION["SESS_SEARCHER_ID"]) > 0 && COption::GetOptionString("statistic", "SEARCHER_EVENTS") != "Y") {
         return array("EVENT_ID" => 0, "TYPE_ID" => 0, "EID" => 0);
     }
     // lookup event type ID
     $EVENT_ID = CStatEvent::SetEventType($event1, $event2, $arEventType);
     // return if it's unknown
     if ($EVENT_ID <= 0) {
         return array("EVENT_ID" => 0, "TYPE_ID" => 0, "EID" => 0);
     }
     if ($site_id === false) {
         if (defined("ADMIN_SECTION") && ADMIN_SECTION === true) {
             $sql_site = "null";
             $site_id = false;
         } elseif (defined("SITE_ID")) {
             $sql_site = "'" . $DB->ForSql(SITE_ID, 2) . "'";
             $site_id = SITE_ID;
         } else {
             $sql_site = "null";
             $site_id = false;
         }
     } else {
         if (strlen(trim($site_id)) > 0) {
             $sql_site = "'" . $DB->ForSql($site_id, 2) . "'";
         } else {
             $sql_site = "null";
             $site_id = false;
         }
     }
     $money = doubleval($money);
     // convert when currency specified
     if (strlen(trim($currency)) > 0) {
         $base_currency = GetStatisticBaseCurrency();
         if (strlen($base_currency) > 0) {
             if ($currency != $base_currency) {
                 if (CModule::IncludeModule("currency")) {
                     $rate = CCurrencyRates::GetConvertFactor($currency, $base_currency);
                     if ($rate > 0 && $rate != 1) {
                         $money = $money * $rate;
                     }
                 }
             }
         }
     }
     $money = round($money, 2);
     $chargeback = $chargeback == "Y" ? "Y" : "N";
     $goto = preg_replace("/#EVENT_GID#/i", CStatEvent::GetGID($site_id), $goto);
     $sql_KEEP_DAYS = intval($arEventType["KEEP_DAYS"]) > 0 ? intval($arEventType["KEEP_DAYS"]) : "null";
     $arr = false;
     $referer_url = strlen($_SERVER["HTTP_REFERER"]) <= 0 ? $_SESSION["SESS_HTTP_REFERER"] : $_SERVER["HTTP_REFERER"];
     if (strlen($referer_url) > 0) {
         if ($url = @parse_url($referer_url)) {
             $rs = CSite::GetList($v1 = "LENDIR", $v2 = "DESC", array("ACTIVE" => "Y", "DOMAIN" => "%" . $url["host"], "IN_DIR" => $url["path"]));
             $arr = $rs->Fetch();
         }
     }
     $sql_referer_site_id = is_array($arr) && strlen($arr["ID"]) > 0 ? "'" . $DB->ForSql($arr["ID"], 2) . "'" : "null";
     $HIT_ID = CKeepStatistics::GetCuurentHitID();
     $arFields = array("EVENT_ID" => "'" . $EVENT_ID . "'", "EVENT3" => "'" . $DB->ForSql($event3, 255) . "'", "MONEY" => $money, "DATE_ENTER" => $DB->GetNowFunction(), "REFERER_URL" => "'" . $DB->ForSql($referer_url, 2000) . "'", "URL" => "'" . $DB->ForSql(__GetFullRequestUri(), 2000) . "'", "REDIRECT_URL" => "'" . $DB->ForSql($goto, 2000) . "'", "SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]) > 0 ? intval($_SESSION["SESS_SESSION_ID"]) : "null", "GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]) > 0 ? intval($_SESSION["SESS_GUEST_ID"]) : "null", "ADV_ID" => $_SESSION["SESS_LAST_ADV_ID"] > 0 ? $_SESSION["SESS_LAST_ADV_ID"] : "null", "HIT_ID" => $HIT_ID > 0 ? $HIT_ID : "NULL", "COUNTRY_ID" => "'" . $DB->ForSql($_SESSION["SESS_COUNTRY_ID"], 2) . "'", "KEEP_DAYS" => $sql_KEEP_DAYS, "CHARGEBACK" => "'" . $chargeback . "'", "SITE_ID" => $sql_site, "REFERER_SITE_ID" => $sql_referer_site_id);
     if (intval($_SESSION["SESS_LAST_ADV_ID"]) > 0 && intval($_SESSION["SESS_ADV_ID"]) <= 0) {
         $arFields["ADV_BACK"] = "'Y'";
     }
     $eid = $DB->Insert("b_stat_event_list", $arFields, $err_mess . __LINE__);
     // in case of first occurence
     if (strlen($arEventType["DATE_ENTER"]) <= 0) {
         // set date of the first event
         $arFields = array("DATE_ENTER" => $DB->GetNowFunction());
         $DB->Update("b_stat_event", $arFields, "WHERE ID='" . $EVENT_ID . "'", $err_mess . __LINE__);
     }
     // day counter update
     $arFields = array("DATE_LAST" => $DB->GetNowFunction(), "COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $money);
     $rows = $DB->Update("b_stat_event_day", $arFields, "WHERE EVENT_ID='" . $EVENT_ID . "' and " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__);
     // there was no records updated
     if (intval($rows) <= 0) {
         // so add one
         $arFields_i = array("DATE_STAT" => $DB->GetNowDate(), "DATE_LAST" => $DB->GetNowFunction(), "EVENT_ID" => $EVENT_ID, "COUNTER" => 1, "MONEY" => $money);
         $DB->Insert("b_stat_event_day", $arFields_i, $err_mess . __LINE__);
     } elseif (intval($rows) > 1) {
         // delete
         $strSql = "SELECT ID FROM b_stat_event_day WHERE EVENT_ID='" . $EVENT_ID . "' and  " . CStatistics::DBDateCompare("DATE_STAT") . " ORDER BY ID";
         $i = 0;
         $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
         while ($ar = $rs->Fetch()) {
             $i++;
             if ($i > 1) {
                 $strSql = "DELETE FROM b_stat_event_day WHERE ID = " . $ar["ID"];
                 $DB->Query($strSql, false, $err_mess . __LINE__);
             }
         }
     }
     // guest counter
     $arFields = array("C_EVENTS" => "C_EVENTS+1");
     $DB->Update("b_stat_guest", $arFields, "WHERE ID=" . intval($_SESSION["SESS_GUEST_ID"]), $err_mess . __LINE__, false, false, false);
     // session counter
     $arFields = array("C_EVENTS" => "C_EVENTS+1");
     $DB->Update("b_stat_session", $arFields, "WHERE ID=" . intval($_SESSION["SESS_SESSION_ID"]), $err_mess . __LINE__, false, false, false);
     // events counter
     $arFields = array("C_EVENTS" => "C_EVENTS+1");
     $DB->Update("b_stat_day", $arFields, "WHERE " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__, false, false, false);
     // when site defined
     if (strlen($site_id) > 0) {
         // update site
         $arFields = array("C_EVENTS" => "C_EVENTS+1");
         $DB->Update("b_stat_day_site", $arFields, "WHERE SITE_ID='" . $DB->ForSql($site_id, 2) . "' and " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__);
     }
     // there is advertising compaign defined
     if (intval($_SESSION["SESS_ADV_ID"]) > 0 || intval($_SESSION["SESS_LAST_ADV_ID"]) > 0) {
         // increase revenue
         if ($money != 0) {
             $sign = $chargeback == "Y" ? "-" : "+";
             $arFields = array("REVENUE" => "REVENUE " . $sign . " " . $money);
             $DB->Update("b_stat_adv", $arFields, "WHERE ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "'", $err_mess . __LINE__, false, false, false);
         }
         if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
             $arFields = array("COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $money);
         } else {
             $arFields = array("COUNTER_BACK" => "COUNTER_BACK + 1", "MONEY_BACK" => "MONEY_BACK + " . $money);
         }
         $rows = $DB->Update("b_stat_adv_event", $arFields, "WHERE ADV_ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "' and EVENT_ID='" . $EVENT_ID . "'", $err_mess . __LINE__);
         if (intval($rows) <= 0) {
             $arFields = array("ADV_ID" => "'" . $_SESSION["SESS_LAST_ADV_ID"] . "'", "EVENT_ID" => "'" . $EVENT_ID . "'");
             if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
                 $arFields["COUNTER"] = "1";
                 $arFields["MONEY"] = $money;
             } else {
                 $arFields["COUNTER_BACK"] = "1";
                 $arFields["MONEY_BACK"] = $money;
             }
             $DB->Insert("b_stat_adv_event", $arFields, $err_mess . __LINE__);
         }
         if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
             $arFields = array("COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $money);
         } else {
             $arFields = array("COUNTER_BACK" => "COUNTER_BACK + 1", "MONEY_BACK" => "MONEY_BACK + " . $money);
         }
         $rows = $DB->Update("b_stat_adv_event_day", $arFields, "WHERE ADV_ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "' and EVENT_ID='" . $EVENT_ID . "' and " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__, false, false, false);
         if (intval($rows) <= 0) {
             $arFields = array("ADV_ID" => $_SESSION["SESS_LAST_ADV_ID"] > 0 ? $_SESSION["SESS_LAST_ADV_ID"] : "null", "EVENT_ID" => "'" . $EVENT_ID . "'", "DATE_STAT" => $DB->GetNowDate());
             if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
                 $arFields["COUNTER"] = "1";
                 $arFields["MONEY"] = $money;
             } else {
                 $arFields["COUNTER_BACK"] = "1";
                 $arFields["MONEY_BACK"] = $money;
             }
             $DB->Insert("b_stat_adv_event_day", $arFields, $err_mess . __LINE__);
         } elseif (intval($rows) > 1) {
             $strSql = "SELECT ID FROM b_stat_adv_event_day WHERE ADV_ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "' and EVENT_ID='" . $EVENT_ID . "' and " . CStatistics::DBDateCompare("DATE_STAT") . " ORDER BY ID";
             $i = 0;
             $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
             while ($ar = $rs->Fetch()) {
                 $i++;
                 if ($i > 1) {
                     $strSql = "DELETE FROM b_stat_adv_event_day WHERE ID = " . $ar["ID"];
                     $DB->Query($strSql, false, $err_mess . __LINE__);
                 }
             }
         }
     }
     // todays traffic counters
     CTraffic::IncParam(array("EVENT" => 1), array("EVENT" => 1));
     if (strlen($_SESSION["SESS_COUNTRY_ID"]) > 0) {
         CStatistics::UpdateCountry($_SESSION["SESS_COUNTRY_ID"], array("C_EVENTS" => 1));
     }
     if ($_SESSION["SESS_CITY_ID"] > 0) {
         CStatistics::UpdateCity($_SESSION["SESS_CITY_ID"], array("C_EVENTS" => 1));
     }
     return array("EVENT_ID" => intval($EVENT_ID), "TYPE_ID" => intval($EVENT_ID), "EID" => intval($eid));
 }
Exemple #3
0
	public static function Update_Adv()
	{
		$err_mess = "File: ".__FILE__."<br>Line: ";

		$DB = CDatabase::GetModuleConnection('statistic');

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

		// если это прямой вход по рекламной кампании
		if (intval($_SESSION["SESS_ADV_ID"])>0)
		{
			// проверяем был ли уже прямой заход либо возврат у данного посетителя и с данного хоста
			$t = CStatistics::GetAdvGuestHost(
				$_SESSION["SESS_ADV_ID"],
				$_SESSION["SESS_GUEST_ID"],
				$REMOTE_ADDR_NUMBER);
			$guest_counter = 0;
			$host_counter = 0;
			while ($tr = $t->Fetch())
			{
				if ($guest_counter!=1) $guest_counter = (intval($tr["ADV_GUESTS"])>0) ? 0 : 1;
				if ($host_counter!=1) $host_counter = (intval($tr["ADV_HOSTS"])>0) ? 0 : 1;

				// дата прямого захода посетителя
				$MAX_DATE_GUEST_HIT = $tr["MAX_DATE_GUEST_HIT"];

				// дата прямого захода с хоста
				$MAX_DATE_HOST_HIT = $tr["MAX_DATE_HOST_HIT"];
			}

			// если посетитель новый, то нужно увеличить счетчик новых посетителей
			$new_guest_counter = ($_SESSION["SESS_GUEST_NEW"] == "Y") ? 1 : 0;

			$arFields = Array(
				"GUESTS"		=> "GUESTS + ".$guest_counter,
				"NEW_GUESTS"	=> "NEW_GUESTS + ".$new_guest_counter,
				"C_HOSTS"		=> "C_HOSTS + ".$host_counter,
				"SESSIONS"		=> "SESSIONS + 1"
				);
			$arFields_temp = $arFields;

			// обновляем основной обсчет рекламной кампании
			$arFields["DATE_LAST"] = $DB->GetNowFunction();

			$DB->Update("b_stat_adv", $arFields, "WHERE ID=".intval($_SESSION["SESS_ADV_ID"]), $err_mess.__LINE__,false,false,false);

			$DB->Update("b_stat_adv", array("DATE_FIRST"=>$DB->GetNowFunction()), "WHERE ID=".intval($_SESSION["SESS_ADV_ID"])." and DATE_FIRST is null", $err_mess.__LINE__,false,false,false);

			$arFields = $arFields_temp;

			// определяем возвращался ли уже сегодня данный посетитель и с данного хоста
			$now_date = GetTime(time());
			$guest_day_counter = ($MAX_DATE_GUEST_HIT!=$now_date) ? 1 : 0;
			$host_day_counter = ($MAX_DATE_HOST_HIT!=$now_date) ? 1 : 0;

			$arFields["GUESTS_DAY"] = "GUESTS_DAY + ".$guest_day_counter;
			$arFields["C_HOSTS_DAY"] = "C_HOSTS_DAY + ".$host_day_counter;

			// обновляем обсчет рекламной кампании по дням
			$rows = $DB->Update("b_stat_adv_day", $arFields, "WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and  ".CStatistics::DBDateCompare("DATE_STAT"), $err_mess.__LINE__,false,false,false);
			// если обсчета по дням нет то
			if (intval($rows)<=0)
			{
				// добавляем его
				$arFields_i = Array(
					"ADV_ID" => intval($_SESSION["SESS_ADV_ID"]),
					"DATE_STAT" => $DB->GetNowDate(),
					"GUESTS" => $guest_counter,
					"GUESTS_DAY" => 1,
					"NEW_GUESTS" => $new_guest_counter,
					"C_HOSTS" => $host_counter,
					"C_HOSTS_DAY" => 1,
					"SESSIONS" => 1
					);
				$DB->Insert("b_stat_adv_day",$arFields_i, $err_mess.__LINE__, $DEBUG);
			}
			elseif ($rows>1) // если обновили более одного дня то
			{
				// удалим лишние
				$i=0;
				$strSql = "SELECT ID FROM b_stat_adv_day WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and  ".CStatistics::DBDateCompare("DATE_STAT")." ORDER BY ID";
				$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
				while ($ar = $rs->Fetch())
				{
					$i++;
					if ($i>1)
					{
						$strSql = "DELETE FROM b_stat_adv_day WHERE ID = ".$ar["ID"];
						$DB->Query($strSql, false, $err_mess.__LINE__);
					}
				}
			}

			// если данный гость, либо с данного хоста еще не заходили по данной рекламной кампании то
			if (intval($guest_counter)==1 || intval($host_counter)==1)
			{
				// добавляем их в базу
				$arFields = Array(
					"ADV_ID" => intval($_SESSION["SESS_ADV_ID"]),
					"GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]),
					"DATE_GUEST_HIT" => $DB->GetNowFunction(),
					"DATE_HOST_HIT" => $DB->GetNowFunction(),
					"SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
					"IP_NUMBER" => "'".$DB->ForSql($REMOTE_ADDR_NUMBER)."'",
					"IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
					"BACK" => "'N'"
					);
				$DB->Insert("b_stat_adv_guest",$arFields, $err_mess.__LINE__, $DEBUG);
			}
			else // иначе
			{
				// обновляем дату прямого захода посетителя
				$arFields = Array("DATE_GUEST_HIT" => $DB->GetNowFunction());
				$DB->Update("b_stat_adv_guest", $arFields, "WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and GUEST_ID=".intval($_SESSION["SESS_GUEST_ID"])." and BACK='N'", $err_mess.__LINE__, $DEBUG);

				// обновляем дату прямого захода с хоста
				$arFields = Array("DATE_HOST_HIT" => $DB->GetNowFunction());
				$DB->Update("b_stat_adv_guest", $arFields, "WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and IP_NUMBER='".$DB->ForSql($REMOTE_ADDR_NUMBER)."' and BACK='N'", $err_mess.__LINE__, $DEBUG);
			}
			// записываем прямую рекламную кампанию в cookie
			$GLOBALS["APPLICATION"]->set_cookie("LAST_ADV", $_SESSION["SESS_ADV_ID"]."_Y");
		}
		// если это возврат по рекламной кампании
		elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0)
		{
			// проверяем был ли уже возврат у данного посетителя, либо с данного хоста
			$t = CStatistics::GetAdvGuestHost(
				$_SESSION["SESS_LAST_ADV_ID"],
				$_SESSION["SESS_GUEST_ID"],
				$REMOTE_ADDR_NUMBER,
				"and BACK='Y'");
			$guest_back_counter = 0;
			$host_back_counter = 0;
			while ($tr = $t->Fetch())
			{
				// счетчик для уникальных вернувшихся посетителей
				if ($guest_back_counter!=1) $guest_back_counter = (intval($tr["ADV_GUESTS"])>0) ? 0 : 1;

				// счетчик для уникальных вернувшихся хостов
				if ($host_back_counter!=1) $host_back_counter = (intval($tr["ADV_HOSTS"])>0) ? 0 : 1;

				// дата последнего возврата посетителя
				$MAX_DATE_GUEST_HIT = $tr["MAX_DATE_GUEST_HIT"];

				// дата последнего возврата с хоста
				$MAX_DATE_HOST_HIT = $tr["MAX_DATE_HOST_HIT"];
			}

			// обновляем обсчет рекламной кампании
			$arFields = Array(
				"GUESTS_BACK"	=> "GUESTS_BACK + ".$guest_back_counter,
				"HOSTS_BACK"	=> "HOSTS_BACK + ".$host_back_counter,
				"SESSIONS_BACK"	=> "SESSIONS_BACK + 1"
			);
			// если происходит восстановление профайла посетителя то
			if($_SESSION["SESS_LAST_ADV_ID"] > 0)
			{
				// оставляем значение счетчиков посетителей и хостов без изменений
				$arFields["GUESTS_BACK"] = "GUESTS_BACK";
				$arFields["HOSTS_BACK"] = "HOSTS_BACK";
				$guest_back_counter = 0;
				$host_back_counter = 0;
			}
			$DB->Update("b_stat_adv", $arFields, "WHERE ID=".intval($_SESSION["SESS_LAST_ADV_ID"]), $err_mess.__LINE__,false,false,false);

			// определяем возвращался ли уже сегодня данный посетитель и с данного хоста
			$now_date = GetTime(time());
			$guest_day_back_counter = ($MAX_DATE_GUEST_HIT!=$now_date) ? 1 : 0;
			$host_day_back_counter = ($MAX_DATE_HOST_HIT!=$now_date) ? 1 : 0;

			$arFields["GUESTS_DAY_BACK"] = "GUESTS_DAY_BACK + ".$guest_day_back_counter;
			$arFields["HOSTS_DAY_BACK"] = "HOSTS_DAY_BACK + ".$host_day_back_counter;

			// обновляем обсчет рекламной кампании по дням
			$rows = $DB->Update("b_stat_adv_day", $arFields, "WHERE ADV_ID=".intval($_SESSION["SESS_LAST_ADV_ID"])." and  ".CStatistics::DBDateCompare("DATE_STAT"), $err_mess.__LINE__,false,false,false);
			// если обсчета по дням нет то
			if (intval($rows)<=0)
			{
				// добавляем его
				$arFields = Array(
					"ADV_ID" => intval($_SESSION["SESS_LAST_ADV_ID"]),
					"DATE_STAT" => $DB->GetNowDate(),
					"GUESTS_BACK" => $guest_back_counter,
					"GUESTS_DAY_BACK" => 1,
					"HOSTS_BACK" => $host_back_counter,
					"HOSTS_DAY_BACK" => 1,
					"SESSIONS_BACK" => 1
					);
				$DB->Insert("b_stat_adv_day", $arFields, $err_mess.__LINE__, $DEBUG);
			}
			elseif ($rows>1) // если обновили более одного дня то
			{
				// удалим лишние
				$i=0;
				$strSql = "SELECT ID FROM b_stat_adv_day WHERE ADV_ID=".intval($_SESSION["SESS_LAST_ADV_ID"])." and  ".CStatistics::DBDateCompare("DATE_STAT")." ORDER BY ID";
				$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
				while ($ar = $rs->Fetch())
				{
					$i++;
					if ($i>1)
					{
						$strSql = "DELETE FROM b_stat_adv_day WHERE ID = ".$ar["ID"];
						$DB->Query($strSql, false, $err_mess.__LINE__);
					}
				}
			}

			// если данный гость либо с данного хоста
			// еще не возвращались по данной рекламной кампании то
			if (intval($guest_back_counter)==1 || intval($host_back_counter)==1)
			{
				// добавляем их в базу
				$arFields = Array(
					"ADV_ID" => intval($_SESSION["SESS_LAST_ADV_ID"]),
					"GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]),
					"DATE_GUEST_HIT" => $DB->GetNowFunction(),
					"DATE_HOST_HIT" => $DB->GetNowFunction(),
					"SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
					"IP_NUMBER" => "'".$DB->ForSql($REMOTE_ADDR_NUMBER)."'",
					"IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
					"BACK" => "'Y'"
					);
				$DB->Insert("b_stat_adv_guest",$arFields, $err_mess.__LINE__, $DEBUG);
			}
			else // иначе
			{
				// обновляем дату последнего возврата посетителя
				$arFields = Array("DATE_GUEST_HIT" => $DB->GetNowFunction());
				$DB->Update("b_stat_adv_guest",$arFields,"WHERE ADV_ID=".intval($_SESSION["SESS_LAST_ADV_ID"])." and GUEST_ID=".intval($_SESSION["SESS_GUEST_ID"])." and BACK='Y'",$err_mess.__LINE__, $DEBUG);

				// обновляем дату последнего возврата с хоста
				$arFields = Array("DATE_HOST_HIT" => $DB->GetNowFunction());
				$DB->Update("b_stat_adv_guest",$arFields,"WHERE ADV_ID=".intval($_SESSION["SESS_LAST_ADV_ID"])." and IP_NUMBER='".$DB->ForSql($REMOTE_ADDR_NUMBER)."' and BACK='Y'",$err_mess.__LINE__, $DEBUG);
			}
			// записываем возврат по рекламной кампании в cookie
			$GLOBALS["APPLICATION"]->set_cookie("LAST_ADV", $_SESSION["SESS_LAST_ADV_ID"]);
		}
	}
 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);
         }
     }
 }