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 ($_SESSION["SESS_LAST_PAGE"] == $CURRENT_PAGE) { return; } $COUNTER_ABNORMAL = 0; // счетчик показывающий сколько раз прошли по данному пути без поддержки HTTP_REFERER // получим ссылающуюся страницу if (strlen($_SERVER["HTTP_REFERER"]) <= 0) { if (strlen($_SESSION["SESS_LAST_PAGE"]) > 0) { $COUNTER_ABNORMAL = 1; } $PATH_REFERER = __GetFullReferer($_SESSION["SESS_LAST_PAGE"]); } else { $PATH_REFERER = __GetFullReferer(); } if ($PATH_REFERER == $CURRENT_PAGE) { return; } // получим из кэша данные по предыдущему пути: ID пути, набор страниц и т.д. if (strlen($PATH_REFERER) > 0) { $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("\n\t\t\tSELECT /*TOP*/\n\t\t\t\tC.ID as CACHE_ID,\n\t\t\t\tC.PATH_ID,\n\t\t\t\tC.PATH_PAGES,\n\t\t\t\tC.PATH_FIRST_PAGE,\n\t\t\t\tC.PATH_FIRST_PAGE_SITE_ID,\n\t\t\t\tC.PATH_FIRST_PAGE_404,\n\t\t\t\tC.PATH_STEPS,\n\t\t\t\tC.PATH_LAST_PAGE,\n\t\t\t\tC.IS_LAST_PAGE\n\t\t\tFROM\n\t\t\t\tb_stat_path_cache C\n\t\t\tWHERE\n\t\t\t\tC.SESSION_ID = " . intval($_SESSION['SESS_SESSION_ID']) . "\n\t\t\t{$where1}\n\t\t\tORDER BY\n\t\t\t\tC.ID desc\n\t\t\t", 1); $rsPREV_PATH = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $arPREV_PATH = $rsPREV_PATH->Fetch(); $arrUpdate404_1 = array(); $arrUpdate404_2 = array(); // сформируем переменные описывающие текущий путь $CURRENT_PATH_ID = GetStatPathID($CURRENT_PAGE, $arPREV_PATH["PATH_ID"]); $tmp_SITE_ID = strlen($SITE_ID) > 0 ? "[" . $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 (strtolower($DB->type) == "oracle") { $arrUpdate404_1["PATH_PAGES"] = substr($CURRENT_PATH_PAGES_404, 0, 2000); } elseif (strtolower($DB->type) == "mssql") { $arrUpdate404_1["PATH_PAGES"] = 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 (strlen($arPREV_PATH["PATH_FIRST_PAGE"]) > 0) { $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"; } } if (strtolower($DB->type) == "oracle") { $sql_CURRENT_PATH_PAGES = $DB->ForSql($CURRENT_PATH_PAGES, 2000); } elseif (strtolower($DB->type) == "mssql") { $sql_CURRENT_PATH_PAGES = $DB->ForSql($CURRENT_PATH_PAGES, 7000); } else { $sql_CURRENT_PATH_PAGES = $DB->ForSql($CURRENT_PATH_PAGES); } $sql_FIRST_PAGE_SITE_ID = strlen($FIRST_PAGE_SITE_ID) > 0 ? "'" . $DB->ForSql($FIRST_PAGE_SITE_ID, 2) . "'" : "null"; $sql_LAST_PAGE_SITE_ID = strlen($SITE_ID) > 0 ? "'" . $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 = strlen($arPREV_PATH["PATH_ID"]) > 0 ? $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); } } }
$path_id = ""; foreach ($arrPAGES as $page) { if (strlen($page) > 0) { $arr = array(); $site_url = ""; preg_match("#\\[(.+?)\\]#", $page, $arr); if (strlen($arr[1]) > 0) { $page = str_replace("[" . $arr[1] . "] ", "", $page); $site_url = $arSites[$arr[1]]; } $err_404 = "N"; if (substr($page, 0, strlen($str_err_404)) == $str_err_404) { $err_404 = "Y"; $page = substr($page, strlen($str_err_404), strlen($page)); } $path_id = GetStatPathID($page, $path_id); $action_url = "path_list.php?lang=" . LANGUAGE_ID . "&find_diagram_type=COUNTER&parent_id=" . urlencode($path_id) . "&context=" . urlencode($context); $action_js = ($table_id == "" ? $sTableID : $table_id) . ".GetAdminList('" . CUtil::JSEscape($action_url) . "');"; $str .= '<a title="' . GetMessage("STAT_GO") . '" href="' . $page . '">»</a> <a title="' . GetMessage("STAT_NEXT_PAGES") . '" href="#" onclick="' . htmlspecialcharsbx($action_js) . '">'; if ($err_404 == "Y") { $str .= '<span class="stat_attention">' . TruncateText($page, 65) . '</span>'; } else { $str .= TruncateText($page, 80); } $str .= '<br>'; } } } $row->AddViewField("URL", $str); $row->AddViewField("NUMBER", $number); $row->AddViewField("PERCENT", $q . "%");