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; }
/** * <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] => ID * типа события [EID] => ID добавленного события )</pre> <p></p> * * <h4>Example</h4> * <pre> * <? * // зафиксируем событие типа "Просмотр спец. страницы" (view/special_page) * <b>CStatEvent::AddCurrent</b>("softkey", "out", $GLOBALS["APPLICATION"]->GetCurPage()); * ?> * * <? * // зафиксируем событие типа "Уход на оплату заказа на Софткее" (softkey/out) * // если такого типа не существует, то он будет автоматически создан * // событие будет фиксироваться по параметрам текущего посетителя сайта * * // в данной переменной может быть задана страница на которую осуществляется переход * $goto = "http://www.softkey.ru/catalog/basket.php?prodid=902&quantity=1&referer1=ritlabs_site&referer2=BITRIX_SM.OTk1LjgyLk4wLjI1Lk4ucnU%3D"; * * <b>CStatEvent::AddCurrent</b>("softkey", "out", "", "", "", $goto); * ?> * * <? * // зафиксируем событие типа "Скачивание файла manual.chm" (download/manual) * // если такого типа не существует, то он будет автоматически создан * // событие будет фиксироваться по параметрам текущего посетителя сайта * * // сначала проверим не скачивал ли уже текущий посетитель этот файл * // в течение последнего часа * * // получим ID типа события * $rs = CStatEventType::GetByEvents($event1, $event2); * if ($ar = $rs->Fetch()) * { * // теперь получим все события данного типа для текущего посетителя сайта * // произошедшие за последний час (3600 секунд) * $rs = CStatEvent::GetListByGuest($_SESSION["SESS_GUEST_ID"], $ar["TYPE_ID"], "", 3600); * * // если таких событий не было то * if (!($ar=$rs->Fetch())) * { * // добавляем данное событие * <b>CStatEvent::AddCurrent</b>("download", "manual"); * } * } * ?> * </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)); }
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); } } }