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"]); } }