예제 #1
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"]);
		}
	}