1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
statistic.php
См. документацию.
1<?php
2
3require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/statistic/classes/general/keepstatistic.php");
4
6
7class CAllStatistics extends CKeepStatistics
8{
9 public static function GetAdvGuestHost($ADV_ID, $GUEST_ID, $IP_NUMBER, $BACK="")
10 {
12 $ADV_ID = intval($ADV_ID);
13 $GID = intval($GUEST_ID);
14
15 $strSql = "
16 SELECT
17 count(1) ADV_HOSTS,
18 ".$DB->DateToCharFunction("max(DATE_HOST_HIT)","SHORT")." MAX_DATE_HOST_HIT
19 FROM b_stat_adv_guest
20 WHERE ADV_ID=$ADV_ID and IP_NUMBER='".$DB->ForSQL($IP_NUMBER)."'
21 $BACK
22 ";
23 $rsResult=$DB->Query($strSql);
24 if(!($arHost = $rsResult->Fetch()))
25 $arHost = array("ADV_HOSTS"=>0,"MAX_DATE_HOST_HIT"=>false);
26
27 $strSql = "
28 SELECT
29 count(1) ADV_GUESTS,
30 ".$DB->DateToCharFunction("max(DATE_GUEST_HIT)","SHORT")." MAX_DATE_GUEST_HIT
31 FROM b_stat_adv_guest
32 WHERE ADV_ID=$ADV_ID and GUEST_ID=$GID
33 $BACK
34 ";
35 $rsResult=$DB->Query($strSql);
36 if(!($arGuest = $rsResult->Fetch()))
37 $arGuest = array("ADV_GUESTS"=>0,"MAX_DATE_GUEST_HIT"=>false);
38
39 $rsResult = new CDBResult;
40 $rsResult->InitFromArray(array(array_merge($arGuest,$arHost)));
41 return $rsResult;
42 }
43
44 public static function StartBuffer()
45 {
48 global $APPLICATION, $USER;
49
50 if (defined("ADMIN_SECTION") && (ADMIN_SECTION === true))
51 {
52 return;
53 }
54
55 if(!(($USER->IsAuthorized() || $APPLICATION->ShowPanel===true) && $APPLICATION->ShowPanel!==false))
56 {
57 return;
58 }
59
60 if (isset($_GET["show_link_stat"]))
61 {
62 if ($_GET["show_link_stat"]=="Y")
63 {
64 $_SESSION["SHOW_LINK_STAT"] = "Y";
65 }
66 elseif ($_GET["show_link_stat"]=="N")
67 {
68 $_SESSION["SHOW_LINK_STAT"] = "N";
69 }
70 }
71
72 $STAT_RIGHT = $APPLICATION->GetGroupRight("statistic");
73 if ($STAT_RIGHT < "R")
74 {
75 return;
76 }
77
78 $width = 650;
79 $height = 650;
80 $CURRENT_PAGE = __GetFullRequestUri(__GetFullCurPage());
81 $arButtons = array();
82
83 $arButtons[] = array(
84 "TEXT" => GetMessage("STAT_PAGE_GRAPH_PANEL_BUTTON"),
85 "TITLE" => GetMessage("STAT_PAGE_GRAPH_PANEL_BUTTON"),
86 "IMAGE" => "/bitrix/images/statistic/page_traffic.gif",
87 "ACTION" => "javascript:window.open('/bitrix/admin/section_graph_list.php?lang=". LANGUAGE_ID."&public=Y&width=".$width."&height=".$height."&section=".urlencode($CURRENT_PAGE)."&set_default=Y','','target=_blank,scrollbars=yes,resizable=yes,width=".$width. ",height=".$height.",left='+Math.floor((screen.width - ".$width.")/2)+',top='+Math.floor((screen.height- ".$height.")/2))",
88 );
89
90 $APPLICATION->AddPanelButton(array(
91 "ICON" => "bx-panel-statistics-icon",
92 "ALT" => GetMessage("STAT_PANEL_BUTTON"),
93 "TEXT" => GetMessage("STAT_PANEL_BUTTON"),
94 "MAIN_SORT" => 1000,
95 "MENU" => $arButtons,
96 "MODE" => "view",
97 "HINT" => array(
98 "TITLE" => GetMessage("STAT_PANEL_BUTTON"),
99 "TEXT" => GetMessage("STAT_PANEL_BUTTON_HINT"),
100 )
101 ));
102 }
103
104 public static function EndBuffer(&$content)
105 {
106 global $APPLICATION, $arHashLink;
107
108 $DB = CDatabase::GetModuleConnection('statistic');
109 if (defined("ADMIN_SECTION") && ADMIN_SECTION===true) return;
110 if (defined("BX_STATISTIC_BUFFER_USED") && BX_STATISTIC_BUFFER_USED===true)
111 {
112 // this JS will open new windows with statistics data
113 ob_start();
114 ?>
115 <script>
116 function ShowStatLinkPage()
117 {
118 try
119 {
120 ShowStatLinkPageEx();
121 }
122 catch (e)
123 {
124 alert('<?echo GetMessage("STAT_LINK_STAT_PANEL_BUTTON_ALERT")?>');
125 }
126 }
127 </script>
128 <?
129 $content .= ob_get_contents();
130 ob_end_clean();
131
132 $arUniqLink = array();
133 $arHashLink = array();
134
135 // parse the content in order to get links
136 if(preg_match_all("#<a[^>]+?href\\s*=\\s*([\"'])(.*?)\\1#is", $content, $arr))
137 {
138 foreach($arr[2] as $link)
139 {
140 if (!__IsHiddenLink($link))
141 {
142 // relative URL found
144 if (mb_strpos($link, $_SERVER["HTTP_HOST"]) !== false)
145 {
146 $arUniqLink[crc32ex($link)] = $link;
147 }
148 }
149 }
150 }
151
152 $js = '';
153 // we found some links
154 if (count($arUniqLink)>0)
155 {
156 // read database to get their data
157 $SUM = 0;
158 $MAX = false;
159 $CURRENT_PAGE = __GetFullRequestUri(__GetFullCurPage());
160 $CURRENT_PAGE_CRC32 = crc32ex($CURRENT_PAGE);
161 foreach($arUniqLink as $link_crc => $link)
162 {
163 if ($CURRENT_PAGE != $link)
164 {
165 $strSql = "
166 SELECT
167 LAST_PAGE_HASH,
168 sum(COUNTER) CNT
169 FROM
170 b_stat_path
171 WHERE
172 PREV_PAGE_HASH = '".$CURRENT_PAGE_CRC32."'
173 and LAST_PAGE_HASH = '".$link_crc."'
174 GROUP BY
175 LAST_PAGE_HASH
176 ";
177 $rs = $DB->Query($strSql);
178 $ar = $rs->Fetch();
179 $CNT = intval($ar["CNT"]);
180 if($CNT > 0)
181 {
182 $arHashLink[$link_crc] = array(
183 "LINK" => $link,
184 "CNT" => $CNT,
185 );
186 $SUM += $CNT;
187 if($MAX === false || ($CNT > $MAX))
188 $MAX = $CNT;
189 }
190 }
191 }
192
193 // если имеем массив количеств переходов по ссылкам то
194 if((count($arHashLink) > 0) && ($SUM > 0))
195 {
196 // отсортируем ссылки в порядке убывания количества переходов и
197 // 1) присвоим каждой ссылке порядковый номер
198 // 2) посчитаем процент переходов по каждой ссылке
199 uasort($arHashLink, "__SortLinkStat");
200 $i=0;
201 foreach($arHashLink as $link_crc => $arLink)
202 {
203 $i++;
204 $arHashLink[$link_crc]["ID"] = $i;
205 $arHashLink[$link_crc]["PERCENT"] = round((100*$arLink["CNT"])/$SUM, 1);
206 }
207
208 // парсим контент и добавляем к тэгам <a> желтую табличку с процентом переходов
209 $pcre_backtrack_limit = intval(ini_get("pcre.backtrack_limit"));
210 $content_len = strlen($content);
211 $content_len++;
212 if($pcre_backtrack_limit < $content_len)
213 @ini_set("pcre.backtrack_limit", $content_len);
214
215 $content = preg_replace_callback("#(<a[^>]+?href\\s*=\\s*)([\"'])(.*?)(\\2.*?>)(.*?)(</.+?>)#is", "__ModifyATags", $content);
216
217 // сформируем диаграмму переходов для данной страницы
218 ob_start();
219 ?>
220 <style>
221 div.stat_pages h2 { background-color:#EEEEEE; font-family:Verdana,Arial,sans-serif; font-size:82%; padding:4px 10px; }
222 div.stat_pages p { font-family:Verdana,Arial,sans-serif; font-size:82%; }
223 div.stat_pages td { font-family:Verdana,Arial,sans-serif; font-size:70%; border: 1px solid #BDC6E0; padding:3px; background-color: white; }
224 div.stat_pages table { border-collapse:collapse; }
225 div.stat_pages td.head { background-color:#E6E9F4; }
226 div.stat_pages td.tail { background-color:#EAEDF7; }
227 </style>
228 <div class="stat_pages">
229 <h2><?=GetMessage("STAT_LINK_STAT")?></h2>
230 <p><?=htmlspecialcharsEx($CURRENT_PAGE)?></p>
231 <table border="0" cellspacing="0" cellpadding="0" width="100%">
232 <tr>
233 <td class="head" align="center">#</td>
234 <td class="head"><?=GetMessage("STAT_LINK")?></td>
235 <td colspan="2" class="head"><?=GetMessage("STAT_CLICKS")?></td>
236 <td class="head">&nbsp;</td>
237 </tr>
238 <?
239 $max_relation = ($MAX*100)/90;
240 foreach($arHashLink as $ar):
241 $w = round(($ar["CNT"]*100)/$max_relation);
242 ?>
243 <tr>
244 <td valign="top" align="right" width="0%" nowrap><?=$ar["ID"]?>.</td>
245 <td valign="top" width="50%"><?=InsertSpaces($ar["LINK"], 60, "<wbr>")?></td>
246 <td valign="top" align="right" width="5%" nowrap><?=$ar["PERCENT"]."%"?></td>
247 <td valign="top" align="right" width="5%" nowrap><?=$ar["CNT"]?></td>
248 <td valign="top" nowrap width="40%"><img src="/bitrix/images/statistic/votebar.gif" width="<?echo ($w==0) ? "0" : $w."%"?>" height="10" border=0 alt=""></td>
249 </tr>
250 <?endforeach?>
251 <tr>
252 <td width="0%" colspan="3" nowrap align="right" class="tail"><?echo GetMessage("STAT_TOTAL")?></td>
253 <td width="0%" nowrap align="right" class="tail"><?=$SUM?></td>
254 <td width="100%" class="tail">&nbsp;</td>
255 </tr>
256 </table>
257 <p><form><input type="button" onClick="window.close()" value="<?echo GetMessage("STAT_CLOSE")?>"></form></p>
258 </div>
259 <?
260 $stat_table = trim(ob_get_contents());
261 $js_table = "wnd.document.write('".CUtil::JSEscape($stat_table)."');";
262 ob_end_clean();
263
264 // сформируем JS открывающий отдельное окно со статистикой переходов
265 ob_start();
266 ?>
267 <script>
268 function ShowStatLinkPageEx()
269 {
270 var top=0, left=0;
271 var width=800, height=600;
272 if(height < screen.height-28)
273 top = Math.floor((screen.height - height)/2-14);
274 if(width < screen.width-10)
275 left = Math.floor((screen.width - width)/2-5);
276 width = Math.min(width, screen.width-10);
277 height = Math.min(height, screen.height-28);
278 var wnd = window.open("","","scrollbars=yes,resizable=yes,width="+width+",height="+height+",left="+left+",top="+top);
279 wnd.document.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n");
280 wnd.document.write("<html><head>\n");
281 wnd.document.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=<?echo LANG_CHARSET?>\">\n");
282 wnd.document.write("<"+"script>\n");
283 wnd.document.write("<!--\n");
284 wnd.document.write("function KeyPress()\n");
285 wnd.document.write("{\n");
286 wnd.document.write(" if(window.event.keyCode == 27)\n");
287 wnd.document.write(" window.close();\n");
288 wnd.document.write("}\n");
289 wnd.document.write("//-->\n");
290 wnd.document.write("</"+"script>\n");
291 wnd.document.write("<title><?=GetMessage("STAT_LINK_STAT_TITLE")?></title></head>\n");
292 wnd.document.write("<body style=\"padding:10px;\" topmargin=\"0\" leftmargin=\"0\" marginwidth=\"0\" marginheight=\"0\" onKeyPress=\"KeyPress()\">\n");
293 <?=$js_table?>
294 wnd.document.write("</body>");
295 wnd.document.write("</html>");
296 wnd.document.close();
297 }
298 </script>
299 <?
300 $js = ob_get_contents();
301 ob_end_clean();
302
303 }
304 }
305 $content .= $js;
306 }
307
308 }
309
310 public static function DBDateCompare($FIELD_NAME, $DATE=false, $DATE_FORMAT="SHORT")
311 {
312 $DB = CDatabase::GetModuleConnection('statistic');
313 if($DATE === false)
314 {
315 $date = $DB->CurrentDateFunction();
316 }
317 elseif(($DATE_FORMAT == "SHORT") && ($DB->type == "MYSQL"))
318 {
319 $date = "cast(".$DB->CharToDateFunction($DATE, $DATE_FORMAT)." as date)";
320 }
321 else
322 {
323 $date = $DB->CharToDateFunction($DATE, $DATE_FORMAT);
324 }
325 return " $FIELD_NAME = $date ";
326 }
327
328 public static function CleanUpStatistics_1()
329 {
331 if ((!isset($_SESSION["SESS_NO_AGENT_STATISTIC"]) || $_SESSION["SESS_NO_AGENT_STATISTIC"] != "Y") && !defined("NO_AGENT_STATISTIC"))
332 {
348 }
349 return "CStatistics::CleanUpStatistics_1();";
350 }
351
352 public static function CleanUpStatistics_2()
353 {
355 if ((!isset($_SESSION["SESS_NO_AGENT_STATISTIC"]) || $_SESSION["SESS_NO_AGENT_STATISTIC"] != "Y") && !defined("NO_AGENT_STATISTIC"))
356 {
359 }
360 return "CStatistics::CleanUpStatistics_2();";
361 }
362
364 // This is deprecated and unused method to handle internal search
366 public static function OnSearch($search_phrase)
367 {
368 $DB = CDatabase::GetModuleConnection('statistic');
369 if(intval($_SESSION["SESS_SEARCHER_ID"]) > 0)
370 return "";
371
372 if(COption::GetOptionString("statistic", "SAVE_REFERERS") != "N")
373 {
374 if(!array_key_exists("SESS_PHRASE_ID", $_SESSION))
375 $_SESSION["SESS_PHRASE_ID"] = array();
376 $search_phrase = mb_substr(trim($search_phrase), 0, 255);
377 if($search_phrase <> '')
378 {
379 // check if search of this phrase already occured in this session
380 if(array_key_exists($search_phrase, $_SESSION["SESS_PHRASE_ID"]))
381 {
382 // return it's ID
383 return "phrase_id=".$_SESSION["SESS_PHRASE_ID"][$search_phrase];
384 }
385 else
386 {
387 if(defined("ADMIN_SECTION") && ADMIN_SECTION === true)
388 {
389 $sql_site = "'ad'";
390 }
391 elseif(defined("SITE_ID"))
392 {
393 $sql_site = "'".$DB->ForSql(SITE_ID, 2)."'";
394 }
395 else
396 {
397 $sql_site = "null";
398 }
399
400 // otherwise add it
401 $arFields = Array(
402 "DATE_HIT" => $DB->GetNowFunction(),
403 "SEARCHER_ID" => '1',
404 "PHRASE" => "'".$DB->ForSql($search_phrase)."'",
405 "SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
406 "SITE_ID" => $sql_site,
407 );
408 $_SESSION["SESS_PHRASE_ID"][$search_phrase] = $phrase_id = $DB->Insert("b_stat_phrase_list", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__);
409 // let's use lru to control session data volume
410 while(count($_SESSION["SESS_PHRASE_ID"]) > 10)
411 {
412 array_shift($_SESSION["SESS_PHRASE_ID"]);
413 }
414
415 stat_session_register("SESS_FROM_SEARCHERS");
416
417 // update search engine statistic
418 $arFields = Array(
419 "PHRASES" => "PHRASES + 1",
420 );
421 $DB->Update("b_stat_searcher", $arFields, "WHERE ID=1", "File: ".__FILE__."<br>Line: ".__LINE__);
422 $_SESSION["SESS_FROM_SEARCHERS"][] = 1;
423
424 return "phrase_id=".$phrase_id;
425 }
426 }
427 }
428 return "";
429 }
430
432 // Обновляем счетчик по рекламной кампании
434 public static function Update_Adv()
435 {
436 $DB = CDatabase::GetModuleConnection('statistic');
437
438 $REMOTE_ADDR_NUMBER = ip2number($_SERVER["REMOTE_ADDR"]);
439
440 // если это прямой вход по рекламной кампании
441 if (intval($_SESSION["SESS_ADV_ID"])>0)
442 {
443 // проверяем был ли уже прямой заход либо возврат у данного посетителя и с данного хоста
444 $t = CStatistics::GetAdvGuestHost(
445 $_SESSION["SESS_ADV_ID"],
446 $_SESSION["SESS_GUEST_ID"],
447 $REMOTE_ADDR_NUMBER);
448 $MAX_DATE_GUEST_HIT = "";
449 $MAX_DATE_HOST_HIT = "";
450 $guest_counter = 0;
451 $host_counter = 0;
452 while ($tr = $t->Fetch())
453 {
454 if ($guest_counter != 1)
455 $guest_counter = (intval($tr["ADV_GUESTS"])>0) ? 0 : 1;
456 if ($host_counter != 1)
457 $host_counter = (intval($tr["ADV_HOSTS"])>0) ? 0 : 1;
458
459 // дата прямого захода посетителя
460 $MAX_DATE_GUEST_HIT = $tr["MAX_DATE_GUEST_HIT"];
461
462 // дата прямого захода с хоста
463 $MAX_DATE_HOST_HIT = $tr["MAX_DATE_HOST_HIT"];
464 }
465
466 // если посетитель новый, то нужно увеличить счетчик новых посетителей
467 $new_guest_counter = ($_SESSION["SESS_GUEST_NEW"] == "Y") ? 1 : 0;
468
469 $arFields = Array(
470 "GUESTS" => "GUESTS + ".$guest_counter,
471 "NEW_GUESTS" => "NEW_GUESTS + ".$new_guest_counter,
472 "C_HOSTS" => "C_HOSTS + ".$host_counter,
473 "SESSIONS" => "SESSIONS + 1"
474 );
475 $arFields_temp = $arFields;
476
477 // обновляем основной обсчет рекламной кампании
478 $arFields["DATE_LAST"] = $DB->GetNowFunction();
479
480 $DB->Update("b_stat_adv", $arFields, "WHERE ID=".intval($_SESSION["SESS_ADV_ID"]), '',false,false,false);
481
482 $DB->Update("b_stat_adv", array("DATE_FIRST"=>$DB->GetNowFunction()), "WHERE ID=".intval($_SESSION["SESS_ADV_ID"])." and DATE_FIRST is null", '',false,false,false);
483
484 $arFields = $arFields_temp;
485
486 // определяем возвращался ли уже сегодня данный посетитель и с данного хоста
487 $now_date = GetTime(time());
488 $guest_day_counter = ($MAX_DATE_GUEST_HIT!=$now_date) ? 1 : 0;
489 $host_day_counter = ($MAX_DATE_HOST_HIT!=$now_date) ? 1 : 0;
490
491 $arFields["GUESTS_DAY"] = "GUESTS_DAY + ".$guest_day_counter;
492 $arFields["C_HOSTS_DAY"] = "C_HOSTS_DAY + ".$host_day_counter;
493
494 // обновляем обсчет рекламной кампании по дням
495 $rows = $DB->Update("b_stat_adv_day", $arFields, "WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and ".CStatistics::DBDateCompare("DATE_STAT"), '',false,false,false);
496 // если обсчета по дням нет то
497 if (intval($rows)<=0)
498 {
499 // добавляем его
500 $arFields_i = Array(
501 "ADV_ID" => intval($_SESSION["SESS_ADV_ID"]),
502 "DATE_STAT" => $DB->GetNowDate(),
503 "GUESTS" => $guest_counter,
504 "GUESTS_DAY" => 1,
505 "NEW_GUESTS" => $new_guest_counter,
506 "C_HOSTS" => $host_counter,
507 "C_HOSTS_DAY" => 1,
508 "SESSIONS" => 1
509 );
510 $DB->Insert("b_stat_adv_day",$arFields_i);
511 }
512 elseif ($rows>1) // если обновили более одного дня то
513 {
514 // удалим лишние
515 $i=0;
516 $strSql = "SELECT ID FROM b_stat_adv_day WHERE ADV_ID=".intval($_SESSION["SESS_ADV_ID"])." and ".CStatistics::DBDateCompare("DATE_STAT")." ORDER BY ID";
517 $rs = $DB->Query($strSql);
518 while ($ar = $rs->Fetch())
519 {
520 $i++;
521 if ($i>1)
522 {
523 $strSql = "DELETE FROM b_stat_adv_day WHERE ID = ".$ar["ID"];
524 $DB->Query($strSql);
525 }
526 }
527 }
528
529 // если данный гость, либо с данного хоста еще не заходили по данной рекламной кампании то
530 if (intval($guest_counter)==1 || intval($host_counter)==1)
531 {
532 // добавляем их в базу
533 $arFields = Array(
534 "ADV_ID" => intval($_SESSION["SESS_ADV_ID"]),
535 "GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]),
536 "DATE_GUEST_HIT" => $DB->GetNowFunction(),
537 "DATE_HOST_HIT" => $DB->GetNowFunction(),
538 "SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
539 "IP_NUMBER" => "'".$DB->ForSql($REMOTE_ADDR_NUMBER)."'",
540 "IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
541 "BACK" => "'N'"
542 );
543 $DB->Insert("b_stat_adv_guest",$arFields);
544 }
545 else // иначе
546 {
547 // обновляем дату прямого захода посетителя
548 $arFields = Array("DATE_GUEST_HIT" => $DB->GetNowFunction());
549 $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'");
550
551 // обновляем дату прямого захода с хоста
552 $arFields = Array("DATE_HOST_HIT" => $DB->GetNowFunction());
553 $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'");
554 }
555 // записываем прямую рекламную кампанию в cookie
556 $GLOBALS["APPLICATION"]->set_cookie("LAST_ADV", $_SESSION["SESS_ADV_ID"]."_Y");
557 }
558 // если это возврат по рекламной кампании
559 elseif (intval($_SESSION["SESS_LAST_ADV_ID"])>0)
560 {
561 // проверяем был ли уже возврат у данного посетителя, либо с данного хоста
562 $t = CStatistics::GetAdvGuestHost(
563 $_SESSION["SESS_LAST_ADV_ID"],
564 $_SESSION["SESS_GUEST_ID"],
565 $REMOTE_ADDR_NUMBER,
566 "and BACK='Y'");
567 $MAX_DATE_GUEST_HIT = "";
568 $MAX_DATE_HOST_HIT = "";
569 $guest_back_counter = 0;
570 $host_back_counter = 0;
571 while ($tr = $t->Fetch())
572 {
573 // счетчик для уникальных вернувшихся посетителей
574 if ($guest_back_counter!=1) $guest_back_counter = (intval($tr["ADV_GUESTS"])>0) ? 0 : 1;
575
576 // счетчик для уникальных вернувшихся хостов
577 if ($host_back_counter!=1) $host_back_counter = (intval($tr["ADV_HOSTS"])>0) ? 0 : 1;
578
579 // дата последнего возврата посетителя
580 $MAX_DATE_GUEST_HIT = $tr["MAX_DATE_GUEST_HIT"];
581
582 // дата последнего возврата с хоста
583 $MAX_DATE_HOST_HIT = $tr["MAX_DATE_HOST_HIT"];
584 }
585
586 // обновляем обсчет рекламной кампании
587 $arFields = Array(
588 "GUESTS_BACK" => "GUESTS_BACK + ".$guest_back_counter,
589 "HOSTS_BACK" => "HOSTS_BACK + ".$host_back_counter,
590 "SESSIONS_BACK" => "SESSIONS_BACK + 1"
591 );
592 // если происходит восстановление профайла посетителя то
593 if($_SESSION["SESS_LAST_ADV_ID"] > 0)
594 {
595 // оставляем значение счетчиков посетителей и хостов без изменений
596 $arFields["GUESTS_BACK"] = "GUESTS_BACK";
597 $arFields["HOSTS_BACK"] = "HOSTS_BACK";
598 $guest_back_counter = 0;
599 $host_back_counter = 0;
600 }
601 $DB->Update("b_stat_adv", $arFields, "WHERE ID=".intval($_SESSION["SESS_LAST_ADV_ID"]), '',false,false,false);
602
603 // определяем возвращался ли уже сегодня данный посетитель и с данного хоста
604 $now_date = GetTime(time());
605 $guest_day_back_counter = ($MAX_DATE_GUEST_HIT!=$now_date) ? 1 : 0;
606 $host_day_back_counter = ($MAX_DATE_HOST_HIT!=$now_date) ? 1 : 0;
607
608 $arFields["GUESTS_DAY_BACK"] = "GUESTS_DAY_BACK + ".$guest_day_back_counter;
609 $arFields["HOSTS_DAY_BACK"] = "HOSTS_DAY_BACK + ".$host_day_back_counter;
610
611 // обновляем обсчет рекламной кампании по дням
612 $rows = $DB->Update("b_stat_adv_day", $arFields, "WHERE ADV_ID=".intval($_SESSION["SESS_LAST_ADV_ID"])." and ".CStatistics::DBDateCompare("DATE_STAT"), '',false,false,false);
613 // если обсчета по дням нет то
614 if (intval($rows)<=0)
615 {
616 // добавляем его
617 $arFields = Array(
618 "ADV_ID" => intval($_SESSION["SESS_LAST_ADV_ID"]),
619 "DATE_STAT" => $DB->GetNowDate(),
620 "GUESTS_BACK" => $guest_back_counter,
621 "GUESTS_DAY_BACK" => 1,
622 "HOSTS_BACK" => $host_back_counter,
623 "HOSTS_DAY_BACK" => 1,
624 "SESSIONS_BACK" => 1
625 );
626 $DB->Insert("b_stat_adv_day", $arFields);
627 }
628 elseif ($rows>1) // если обновили более одного дня то
629 {
630 // удалим лишние
631 $i=0;
632 $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";
633 $rs = $DB->Query($strSql);
634 while ($ar = $rs->Fetch())
635 {
636 $i++;
637 if ($i>1)
638 {
639 $strSql = "DELETE FROM b_stat_adv_day WHERE ID = ".$ar["ID"];
640 $DB->Query($strSql);
641 }
642 }
643 }
644
645 // если данный гость либо с данного хоста
646 // еще не возвращались по данной рекламной кампании то
647 if (intval($guest_back_counter)==1 || intval($host_back_counter)==1)
648 {
649 // добавляем их в базу
650 $arFields = Array(
651 "ADV_ID" => intval($_SESSION["SESS_LAST_ADV_ID"]),
652 "GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]),
653 "DATE_GUEST_HIT" => $DB->GetNowFunction(),
654 "DATE_HOST_HIT" => $DB->GetNowFunction(),
655 "SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]),
656 "IP_NUMBER" => "'".$DB->ForSql($REMOTE_ADDR_NUMBER)."'",
657 "IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
658 "BACK" => "'Y'"
659 );
660 $DB->Insert("b_stat_adv_guest",$arFields);
661 }
662 else // иначе
663 {
664 // обновляем дату последнего возврата посетителя
665 $arFields = Array("DATE_GUEST_HIT" => $DB->GetNowFunction());
666 $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'");
667
668 // обновляем дату последнего возврата с хоста
669 $arFields = Array("DATE_HOST_HIT" => $DB->GetNowFunction());
670 $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'");
671 }
672 // записываем возврат по рекламной кампании в cookie
673 $GLOBALS["APPLICATION"]->set_cookie("LAST_ADV", $_SESSION["SESS_LAST_ADV_ID"]);
674 }
675 }
676
678 // Устанавливаем рекламную кампанию
680 public static function Set_Adv()
681 {
682 stat_session_register("SESS_ADV_ID"); // ID рекламной кампании
683 $DB = CDatabase::GetModuleConnection('statistic');
684
685 // если это начало сессии
686 if (
687 (!isset($_SESSION["SESS_SESSION_ID"]) || intval($_SESSION["SESS_SESSION_ID"])<=0)
688 && (!isset($_SESSION["SESS_ADV_ID"]) || intval($_SESSION["SESS_ADV_ID"])<=0)
689 )
690 {
691 $arrADV = array(); // массив рекламных кампаний
692
693 // проверяем страницу на которую пришел посетитель
694 $page_to = __GetFullRequestUri();
695 CAdv::SetByPage($page_to, $arrADV, $ref1, $ref2, "TO");
696
697 // если посетитель пришел с ссылающегося сайта то
698 if (__GetReferringSite($PROT, $SN, $SN_WithoutPort, $PAGE_FROM))
699 {
700 $site_name = $PROT.$SN;
701 // проверяем поисковики
702 $strSql = "
703 SELECT
704 A.REFERER1,
705 A.REFERER2,
706 S.ADV_ID
707 FROM
708 b_stat_adv A,
709 b_stat_adv_searcher S,
710 b_stat_searcher_params P
711 WHERE
712 S.ADV_ID = A.ID
713 and P.SEARCHER_ID = S.SEARCHER_ID
714 and upper('".$DB->ForSql(trim($site_name),2000)."')
715 like ".$DB->Concat("'%'", "upper(P.DOMAIN)", "'%'")."
716 ";
717 $w = $DB->Query($strSql);
718 while ($wr=$w->Fetch())
719 {
720 $ref1 = $wr["REFERER1"];
721 $ref2 = $wr["REFERER2"];
722 $arrADV[] = intval($wr["ADV_ID"]);
723 }
724
725 // проверяем ссылающиеся страницы
726 $site_name = $PROT.$SN.$PAGE_FROM;
727 CAdv::SetByPage($site_name, $arrADV, $ref1, $ref2, "FROM");
728 }
729
730 // если гость пришел с referer1, либо referer2 то
731 if ($_SESSION["referer1"] <> '' || $_SESSION["referer2"] <> '')
732 {
733 CAdv::SetByReferer(trim($_SESSION["referer1"]), trim($_SESSION["referer2"]), $arrADV, $ref1, $ref2);
734 }
735 //Handle Openstat if enabled
736 if(COption::GetOptionString("statistic", "OPENSTAT_ACTIVE") === "Y" && $_REQUEST["_openstat"] <> '')
737 {
738 $openstat = $_REQUEST["_openstat"];
739 if(mb_strpos($openstat, ";") === false)
740 $openstat = base64_decode($openstat);
741 $openstat = explode(";", $openstat);
743 trim(str_replace(
744 array("#service-name#", "#campaign-id#", "#ad-id#", "#source-id#"),
745 $openstat,
746 COption::GetOptionString("statistic", "OPENSTAT_R1_TEMPLATE")
747 )),
748 trim(str_replace(
749 array("#service-name#", "#campaign-id#", "#ad-id#", "#source-id#"),
750 $openstat,
751 COption::GetOptionString("statistic", "OPENSTAT_R2_TEMPLATE")
752 )),
753 $arrADV, $ref1, $ref2
754 );
755 }
756 $arrADV = array_unique($arrADV);
757
758 // если было выявлено более одной рекламной кампании подходящей под условия то
759 if (count($arrADV)>1)
760 {
761 // выберем рекламную кампанию по наивысшему приоритету (либо по наивысшему ID)
762 $str = implode(",",$arrADV);
763 $strSql = "SELECT ID, REFERER1, REFERER2 FROM b_stat_adv WHERE ID in ($str) ORDER BY PRIORITY desc, ID desc";
764 $z = $DB->Query($strSql);
765 $zr = $z->Fetch();
766 $_SESSION["SESS_ADV_ID"] = intval($zr["ID"]);
767 $_SESSION["referer1"] = $zr["REFERER1"];
768 $_SESSION["referer2"] = $zr["REFERER2"];
769 }
770 else
771 {
772 $value = reset($arrADV);
773 $_SESSION["SESS_ADV_ID"] = intval($value);
774 $_SESSION["referer1"] = $ref1;
775 $_SESSION["referer2"] = $ref2;
776 }
777 }
778 if (intval($_SESSION["SESS_ADV_ID"])>0) $_SESSION["SESS_LAST_ADV_ID"] = $_SESSION["SESS_ADV_ID"];
779 $_SESSION["SESS_LAST_ADV_ID"] = intval($_SESSION["SESS_LAST_ADV_ID"] ?? 0);
780 }
781
783 // Устанавливаем ID гостя
785 public static function Set_Guest()
786 {
787 stat_session_register("SESS_GUEST_ID"); // ID гостя
788 stat_session_register("SESS_GUEST_NEW"); // флаг "новый гость"
789 stat_session_register("SESS_LAST_USER_ID"); // под кем гость был авторизован в последний раз
790 stat_session_register("SESS_LAST_ADV_ID"); // по какой рекламной кампании был в последний раз
791 stat_session_register("SESS_GUEST_FAVORITES"); // флаг добавлял ли гость сайт в фавориты
792 stat_session_register("SESS_LAST"); // Y - гость сегодня уже заходил; N - еще не заходил
793
794 global $USER, $APPLICATION;
795 $DB = CDatabase::GetModuleConnection('statistic');
796 $last_referer1 = "";
797 $last_referer2 = "";
798
799 if (defined("ADMIN_SECTION") && ADMIN_SECTION===true) $sql_site = "null";
800 elseif (defined("SITE_ID")) $sql_site = "'".$DB->ForSql(SITE_ID,2)."'";
801 else $sql_site = "null";
802
803 $ERROR_404 = (defined("ERROR_404") && ERROR_404=="Y") ? "Y" : "N";
804 $REPAIR_COOKIE_GUEST = "N";
805 if (!isset($_SESSION["SESS_GUEST_NEW"])) $_SESSION["SESS_GUEST_NEW"] = "N";
806 $_SESSION["SESS_GUEST_ID"] = intval($_SESSION["SESS_GUEST_ID"] ?? 0);
807
808 $COOKIE_ADV = "";
809 $COOKIE_GUEST_ID = intval($APPLICATION->get_cookie("GUEST_ID"));
810 if($COOKIE_GUEST_ID==0) $COOKIE_GUEST_ID = intval($_SESSION["SESS_GUEST_ID"]);
811
812 // если сессия только открылась
813 if (!isset($_SESSION["SESS_SESSION_ID"]) || intval($_SESSION["SESS_SESSION_ID"])<=0)
814 {
815 // выбираем из базы параметры гостя
816 $q = CGuest::GetLastByID($COOKIE_GUEST_ID);
817 // если ничего не выбрали то
818 if (!($qr=$q->Fetch()))
819 {
820 // считаем гостя новым
821 $_SESSION["SESS_GUEST_ID"] = 0;
822 $_SESSION["SESS_GUEST_NEW"] = "Y";
823 $_SESSION["SESS_GUEST_FAVORITES"] = "N";
824 // если у него в cookie хранится GUEST_ID то
825 if ($COOKIE_GUEST_ID>0)
826 {
827 $_SESSION["SESS_GUEST_NEW"] = "N";
828 // получаем дату последнего посещения сайта данным гостем
829 // если формат корректный то
830 if ($LAST_VISIT = MkDateTime($GLOBALS["APPLICATION"]->get_cookie("LAST_VISIT"),"d.m.Y H:i:s"))
831 {
832 // получаем дату последней инсталляции таблиц модуля
833 $DATE_INSTALL = COption::GetOptionString("main", "INSTALL_STATISTIC_TABLES", "NOT_FOUND");
834 if ($DATE_INSTALL=="NOT_FOUND")
835 {
836 $DATE_INSTALL = date("d.m.Y H:i:s",time());
837 COption::SetOptionString("main", "INSTALL_STATISTIC_TABLES", $DATE_INSTALL, "Installation date of Statistics module tables");
838 }
839 if ($DATE_INSTALL = MkDateTime($DATE_INSTALL,"d.m.Y H:i:s"))
840 {
841 // если таблицы были инсталлированы после последнего посещения сайта то
842 if ($DATE_INSTALL>$LAST_VISIT)
843 {
844 // посетитель считается новым т.к. он нигде не был учтен
845 $_SESSION["SESS_GUEST_NEW"] = "Y";
846 }
847 }
848 }
849 // устанавливаем флаг того что мы восстанавливаем гостя
850 $REPAIR_COOKIE_GUEST = "Y";
851 // получаем идентификатор его последней рекламной кампании
852 $COOKIE_ADV = $GLOBALS["APPLICATION"]->get_cookie("LAST_ADV");
853 }
854 }
855 else // иначе если выбрали параметры гостя то
856 {
857 // то запоминаем их в сессии
858 $_SESSION["SESS_GUEST_FAVORITES"] = $qr["FAVORITES"];
859 $_SESSION["SESS_GUEST_FAVORITES"] = ($_SESSION["SESS_GUEST_FAVORITES"]=="Y") ? "Y" : "N";
860 if (!isset($_SESSION["SESS_GUEST_NEW"])) $_SESSION["SESS_GUEST_NEW"] = "N";
861 $_SESSION["SESS_GUEST_ID"] = intval($qr["ID"]);
862 $_SESSION["SESS_LAST_ADV_ID"]=intval($qr["LAST_ADV_ID"]);
863 $_SESSION["SESS_LAST_USER_ID"] = intval($qr["LAST_USER_ID"]);
864 $_SESSION["SESS_LAST"] = $qr["LAST"];
865 if ($_SESSION["SESS_LAST_ADV_ID"]>0)
866 {
867 $strSql = "SELECT REFERER1, REFERER2 FROM b_stat_adv WHERE ID=".$_SESSION["SESS_LAST_ADV_ID"];
868 $w = $DB->Query($strSql);
869 if ($wr = $w->Fetch())
870 {
871 $last_referer1 = $wr["REFERER1"];
872 $last_referer2 = $wr["REFERER2"];
873 }
874 }
875 }
876
877 }
878 // если есть необходимость то
879 if ($_SESSION["SESS_GUEST_ID"]<=0)
880 {
881 // вставляем гостя в базу
882 $arFields = Array(
883 "FIRST_DATE" => $DB->GetNowFunction(),
884 "FIRST_URL_FROM" => "'".$DB->ForSql($_SERVER["HTTP_REFERER"] ?? '', 2000)."'",
885 "FIRST_URL_TO" => "'".$DB->ForSql(__GetFullRequestUri(),2000)."'",
886 "FIRST_URL_TO_404" => "'".$DB->ForSql($ERROR_404)."'",
887 "FIRST_SITE_ID" => $sql_site,
888 "FIRST_ADV_ID" => intval($_SESSION["SESS_ADV_ID"]) ,
889 "FIRST_REFERER1" => "'".$DB->ForSql($_SESSION["referer1"],255)."'",
890 "FIRST_REFERER2" => "'".$DB->ForSql($_SESSION["referer2"],255)."'",
891 "FIRST_REFERER3" => "'".$DB->ForSql($_SESSION["referer3"],255)."'"
892 );
893 // если мы восстанавливаем гостя по данным записаным в его cookie то
894 if ($REPAIR_COOKIE_GUEST=="Y")
895 {
896 // если гость не считается новым то добавим ему одну сессию
897 if ($_SESSION["SESS_GUEST_NEW"]=="N") $arFields["SESSIONS"] = 1;
898 // если у него в cookie была рекламная кампания то
899 $COOKIE_ADV = intval($COOKIE_ADV);
900 if ($COOKIE_ADV>0)
901 {
902 // проверяем есть ли такая кампания в базе
903 $strSql = "SELECT REFERER1, REFERER2 FROM b_stat_adv WHERE ID='".$COOKIE_ADV."'";
904 $w = $DB->Query($strSql);
905 // если в базе есть такая рекламная кампания то
906 if ($wr = $w->Fetch())
907 {
908 // считаем что гость вернулся по данной рекламной кампании
909 $_SESSION["SESS_LAST_ADV_ID"] = $COOKIE_ADV;
910 // если последний вход записанный в cookie
911 // не был прямым входом по рекламной кампании то
912 $arFields["FIRST_ADV_ID"] = $COOKIE_ADV;
913 $arFields["FIRST_REFERER1"] = "'".$DB->ForSql($wr["REFERER1"],255)."'";
914 $arFields["FIRST_REFERER2"] = "'".$DB->ForSql($wr["REFERER2"],255)."'";
915 $arFields["LAST_ADV_ID"] = $COOKIE_ADV;
916 $arFields["LAST_ADV_BACK"] = "'Y'";
917 $arFields["LAST_REFERER1"] = "'".$DB->ForSql($wr["REFERER1"],255)."'";
918 $arFields["LAST_REFERER2"] = "'".$DB->ForSql($wr["REFERER2"],255)."'";
919 $last_referer1 = $wr["REFERER1"];
920 $last_referer2 = $wr["REFERER2"];
921 }
922 }
923 }
924 $_SESSION["SESS_GUEST_ID"] = $DB->Insert("b_stat_guest",$arFields);
925 if ($ERROR_404=="N")
926 {
927 CStatistics::Set404("b_stat_guest", "ID = ".intval($_SESSION["SESS_GUEST_ID"]), array("FIRST_URL_TO_404" => "Y"));
928 }
929 }
930
931 // если гость авторизовался то
932 if (is_object($USER) && intval($USER->GetID())>0)
933 {
934 // запоминаем кто он
935 $_SESSION["SESS_LAST_USER_ID"] = intval($USER->GetID());
936 }
937 if (intval($_SESSION["SESS_LAST_USER_ID"] ?? 0) <= 0)
938 {
939 $_SESSION["SESS_LAST_USER_ID"] = "";
940 }
941
942 if ($_SESSION["SESS_GUEST_ID"]>0)
943 {
944 // сохраним ID посетителя в куках
945 $GLOBALS["APPLICATION"]->set_cookie("GUEST_ID", $_SESSION["SESS_GUEST_ID"]);
946 }
947 // сохраним в cookie дату последнего посещения данным гостем сайта
948 $GLOBALS["APPLICATION"]->set_cookie("LAST_VISIT", date("d.m.Y H:i:s",time()));
949
950 return array(
951 "last_referer1" => $last_referer1,
952 "last_referer2" => $last_referer2,
953 );
954 }
955
957 // функция блокировки посетителя по превышению лимита активности,
958 // возвращает true если посетителя пора блокировать
960 public static function BlockVisitorActivity()
961 {
962 global $USER;
963 if(is_object($USER) && $USER->IsAdmin())
964 return false;
965 if(defined("STATISTIC_SKIP_ACTIVITY_CHECK"))
966 return false;
967 if(COption::GetOptionString("statistic", "DEFENCE_ON")=="Y")
968 {
969 $_SESSION["SESS_SEARCHER_CHECK_ACTIVITY"] = (isset($_SESSION["SESS_SEARCHER_CHECK_ACTIVITY"]) && $_SESSION["SESS_SEARCHER_CHECK_ACTIVITY"]=="N") ? "N" : "Y";
970 // если это не поисковик или поисковик, но с установленным флагом "проверять лимит активности"
971 if (
972 !isset($_SESSION["SESS_SEARCHER_ID"])
973 || intval($_SESSION["SESS_SEARCHER_ID"]) <= 0
974 || $_SESSION["SESS_SEARCHER_CHECK_ACTIVITY"] == "Y"
975 )
976 {
977 // если установлен максимальный интервал времени для стэка защиты то
978 $STACK_TIME = COption::GetOptionInt("statistic", "DEFENCE_STACK_TIME");
979 if ($STACK_TIME > 0)
980 {
981 $stmp = time();
982 $DEFENCE_DELAY = COption::GetOptionInt("statistic", "DEFENCE_DELAY");
983
984 // если лимит активности уже превышался то
985 if (!empty($_SESSION["SESS_GRABBER_STOP_TIME"]))
986 {
987 // если время задержки еще не истекло то
988 if (($stmp - $_SESSION["SESS_GRABBER_STOP_TIME"]) <= $DEFENCE_DELAY)
989 {
990 // держим дальше
991 $_SESSION["SESS_GRABBER_DEFENCE_STACK"] = [];
992 return true;
993 }
994 else // иначе
995 {
996 // обнуляем время блокирования
997 $_SESSION["SESS_GRABBER_STOP_TIME"] = "";
998 }
999 }
1000
1001 // запомним время текущего хита в стэке
1002 if (
1003 !isset($_SESSION["SESS_GRABBER_DEFENCE_STACK"])
1004 || !is_array($_SESSION["SESS_GRABBER_DEFENCE_STACK"])
1005 )
1006 {
1007 $_SESSION["SESS_GRABBER_DEFENCE_STACK"] = [];
1008 }
1009 $_SESSION["SESS_GRABBER_DEFENCE_STACK"][] = $stmp;
1010
1011 // почистим стэк до заданного максимального интервала времени
1012 $first_element = reset($_SESSION["SESS_GRABBER_DEFENCE_STACK"]);
1013 $current_stack_length = $stmp - $first_element;
1014 while ($current_stack_length > $STACK_TIME && count($_SESSION["SESS_GRABBER_DEFENCE_STACK"]) > 0)
1015 {
1016 $first_element = array_shift($_SESSION["SESS_GRABBER_DEFENCE_STACK"]);
1017 $current_stack_length = $stmp - $first_element;
1018 }
1019
1020 // проверим стэк на превышение максимального кол-ва хитов
1021 $STACK_HITS = count($_SESSION["SESS_GRABBER_DEFENCE_STACK"]);
1022 $MAX_STACK_HITS = COption::GetOptionInt("statistic", "DEFENCE_MAX_STACK_HITS");
1023 if ($STACK_HITS > $MAX_STACK_HITS)
1024 {
1025 // инициализируем превышение активности
1026 $_SESSION["SESS_GRABBER_STOP_TIME"] = $stmp;
1027
1028 if (COption::GetOptionString("statistic", "DEFENCE_LOG") === "Y")
1029 CEventLog::Log("WARNING", "STAT_ACTIVITY_LIMIT", "statistic", "", GetMessage("STAT_DEFENCE_LOG_MESSAGE", array(
1030 "#ACTIVITY_TIME_LIMIT#" => $STACK_TIME,
1031 "#ACTIVITY_HITS#" => $STACK_HITS,
1032 "#ACTIVITY_EXCEEDING#" => $STACK_HITS - $MAX_STACK_HITS,
1033 )));
1034
1035 // если в этой сессии письмо еще не отсылали то
1036 if ($_SESSION["ACTIVITY_EXCEEDING_NOTIFIED"] != "Y")
1037 {
1038 if (defined("SITE_ID") && SITE_ID <> '')
1039 {
1040 $rsSite = CSite::GetByID(SITE_ID);
1041 $arSite = $rsSite->Fetch();
1042 $site_id = SITE_ID;
1043 }
1044 else
1045 {
1046 $rsSite = CSite::GetDefList();
1047 $arSite = $rsSite->Fetch();
1048 $site_id = $arSite["ID"];
1049 }
1050
1051 $SESSION_LINK = intval($_SESSION["SESS_SESSION_ID"]) > 0 ? "/bitrix/admin/session_list.php?lang=". $arSite["LANGUAGE_ID"]."&find_id=".$_SESSION["SESS_SESSION_ID"]."&find_id_exact_match=Y&set_filter=Y" : "";
1052 $VISITOR_LINK = intval($_SESSION["SESS_GUEST_ID"]) > 0 ? "/bitrix/admin/guest_list.php?lang=". $arSite["LANGUAGE_ID"]."&find_id=".$_SESSION["SESS_GUEST_ID"]."&find_id_exact_match=Y&set_filter=Y" : "";
1053
1054 $arr = explode(".", $_SERVER["REMOTE_ADDR"]);
1055 $STOPLIST_LINK = "/bitrix/admin/stoplist_edit.php?lang=". $arSite["LANGUAGE_ID"]."&net1=".intval($arr[0])."&net2=".intval($arr[1])."&net3=". intval($arr[2])."&net4=".intval($arr[3])."&user_agent=".urlencode($_SERVER["HTTP_USER_AGENT"]);
1056
1057 $SEARCHER_LINK = intval($_SESSION["SESS_SEARCHER_ID"]) > 0 ? "/bitrix/admin/hit_searcher_list.php?lang=". $arSite["LANGUAGE_ID"]."&find_searcher_id=".$_SESSION["SESS_SEARCHER_ID"]."&set_filter=Y" : "";
1058
1059 $arEventFields = array(
1060 "ACTIVITY_TIME_LIMIT" => $STACK_TIME,
1061 "ACTIVITY_HITS" => $STACK_HITS,
1062 "ACTIVITY_HITS_LIMIT" => $MAX_STACK_HITS,
1063 "ACTIVITY_EXCEEDING" => $STACK_HITS - $MAX_STACK_HITS,
1064 "CURRENT_TIME" => GetTime($stmp, "FULL", $arSite["ID"]),
1065 "DELAY_TIME" => $DEFENCE_DELAY,
1066 "USER_AGENT" => $_SERVER["HTTP_USER_AGENT"],
1067 "SESSION_ID" => $_SESSION["SESS_SESSION_ID"],
1068 "SESSION_LINK" => $SESSION_LINK,
1069 "SERACHER_ID" => $_SESSION["SESS_SEARCHER_ID"],
1070 "SEARCHER_NAME" => $_SESSION["SESS_SEARCHER_NAME"],
1071 "SEARCHER_LINK" => $SEARCHER_LINK,
1072 "VISITOR_ID" => $_SESSION["SESS_GUEST_ID"],
1073 "VISITOR_LINK" => $VISITOR_LINK,
1074 "STOPLIST_LINK" => $STOPLIST_LINK,
1075 "EMAIL_TO" => COption::GetOptionString("main", "email_from", ""),
1076 );
1077
1078 CEvent::Send("STATISTIC_ACTIVITY_EXCEEDING", $site_id, $arEventFields);
1079
1080 $_SESSION["ACTIVITY_EXCEEDING_NOTIFIED"] = "Y";
1081 }
1082 }
1083 }
1084 }
1085 }
1086 return false;
1087 }
1088
1089 public static function GetAuditTypes()
1090 {
1091 return array(
1092 "STAT_ACTIVITY_LIMIT" => "[STAT_ACTIVITY_LIMIT] ".GetMessage("STAT_DEFENCE_LOG_EVENT"),
1093 );
1094 }
1095
1096 public static function Set404($table = false, $where = false, $arrUpdate = false)
1097 {
1098 $DB = CDatabase::GetModuleConnection('statistic');
1099 static $STAT_DB_404 = array();
1100
1101 if($table !== false)
1102 {
1103 if($table <> '' && $where <> '' && is_array($arrUpdate))
1104 {
1105 foreach($arrUpdate as $field => $value)
1106 {
1107 $STAT_DB_404[$table][$where][$field] = "'".$DB->ForSql($value)."'";
1108 }
1109 }
1110 }
1111 else
1112 {
1113 if(defined("ERROR_404") && ERROR_404=="Y")
1114 {
1115 foreach($STAT_DB_404 as $table => $arrWhere)
1116 {
1117 foreach($arrWhere as $where => $arFields)
1118 {
1119 $DB->Update($table, $arFields, "WHERE ".$where, "File: ".__FILE__."<br>Line: ".__LINE__);
1120 unset($STAT_DB_404[$table][$where]);
1121 }
1122 unset($STAT_DB_404[$table]);
1123 }
1124 $STAT_DB_404 = array();
1125 }
1126 }
1127 }
1128
1130 // очистка статистики до определенной даты
1132 public static function CleanUp($cleanup_date="", &$arErrors)
1133 {
1134 $err_mess = "File: ".__FILE__."<br>Line: ";
1135 $DB = CDatabase::GetModuleConnection('statistic');
1136 if ($cleanup_date == '')
1137 {
1138 $fname = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/statistic/install/db/".mb_strtolower($DB->type)."/clean_up.sql";
1139 if (file_exists($fname))
1140 {
1141 $arErrors = $DB->RunSQLBatch($fname);
1142 if (!$arErrors)
1143 {
1144 $fname = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/statistic/install/db/".mb_strtolower($DB->type)."/adv.sql";
1145 $arErrors2 = $DB->RunSQLBatch($fname);
1146 if (!$arErrors2) return true; else
1147 {
1148 $arErrors = array_merge($arErrors, $arErrors2);
1149 return false;
1150 }
1151 }
1152 else return false;
1153 }
1154 }
1155 else
1156 {
1157 $stmp = MkDateTime(ConvertDateTime($cleanup_date,"D.M.Y"),"d.m.Y");
1158 if ($stmp)
1159 {
1160 $arrTables = array(
1161 "b_stat_adv_guest" => "DATE_HOST_HIT",
1162 "b_stat_adv_day" => "DATE_STAT",
1163 "b_stat_adv_event_day" => "DATE_STAT",
1164 "b_stat_day" => "DATE_STAT",
1165 "b_stat_day_site" => "DATE_STAT",
1166 "b_stat_event_day" => "DATE_STAT",
1167 "b_stat_event_list" => "DATE_ENTER",
1168 "b_stat_guest" => "LAST_DATE",
1169 "b_stat_hit" => "DATE_HIT",
1170 "b_stat_searcher_hit" => "DATE_HIT",
1171 "b_stat_phrase_list" => "DATE_HIT",
1172 "b_stat_referer" => "DATE_LAST",
1173 "b_stat_referer_list" => "DATE_HIT",
1174 "b_stat_searcher_day" => "DATE_STAT",
1175 "b_stat_session" => "DATE_LAST",
1176 "b_stat_page" => "DATE_STAT",
1177 "b_stat_country_day" => "DATE_STAT",
1178 "b_stat_path" => "DATE_STAT"
1179 );
1180
1181 foreach ($arrTables as $table_name => $date_name)
1182 {
1183 CStatistics::CleanUpTableByDate($cleanup_date, $table_name, $date_name);
1184 }
1185 }
1186 }
1187 return true;
1188 }
1189
1191 // пересчет финансовых показателей при смене базовой валюты
1193 public static function RecountBaseCurrency($new_base_currency)
1194 {
1195 $DB = CDatabase::GetModuleConnection('statistic');
1197 if ($base_currency!="xxx" && $base_currency <> '')
1198 {
1199 if (CModule::IncludeModule("currency"))
1200 {
1202 {
1203 $rate = CCurrencyRates::GetConvertFactor($base_currency, $new_base_currency);
1204 if ($rate!=1 && $rate>0)
1205 {
1206 $arUpdate = array(
1207 array("TABLE" => "b_stat_adv", "FIELDS" => array("COST", "REVENUE")),
1208 array("TABLE" => "b_stat_event", "FIELDS" => array("MONEY")),
1209 array("TABLE" => "b_stat_event_day", "FIELDS" => array("MONEY")),
1210 array("TABLE" => "b_stat_event_list", "FIELDS" => array("MONEY"))
1211 );
1212 set_time_limit(0);
1213 ignore_user_abort(true);
1214 $DB->StartTransaction();
1215 foreach ($arUpdate as $arr)
1216 {
1217 $arFields = $arr["FIELDS"];
1218 $strSql = "UPDATE ".$arr["TABLE"]." SET ";
1219 $i = 0;
1220 $str = "";
1221 foreach ($arFields as $field)
1222 {
1223 if ($i>0) $str .= ", ";
1224 $str .= $field." = round(".$field."*".$rate.",2)";
1225 $i++;
1226 }
1227 $DB->Query($strSql.$str);
1228 }
1229 $DB->Commit();
1230 }
1231 }
1232 }
1233 }
1234 }
1235
1236 // функции для совместимости
1237 public static function GetEventParam($site_id = false)
1238 {
1240 }
1241
1242 public static function Set_Event($event1, $event2 = "", $event3 = "", $goto = "", $money = "", $currency = "", $chargeback = "N", $site_id = false)
1243 {
1244 return CStatEvent::AddCurrent($event1, $event2, $event3, $money, $currency, $goto, $chargeback, $site_id);
1245 }
1246
1247 public static function CheckForDDL()
1248 {
1249 $DB = CDatabase::GetModuleConnection('statistic');
1250 $rs=$DB->Query("select count(*) CNT from b_stat_ddl", true);
1251 if($rs)
1252 {
1253 $ar=$rs->Fetch();
1254 if($ar && intval($ar["CNT"])>0)
1255 {
1256 return true;
1257 }
1258 }
1259 return false;
1260 }
1261
1262 public static function GetDDL()
1263 {
1264 $DB = CDatabase::GetModuleConnection('statistic');
1265 $result = array();
1266 $rs=$DB->Query("select * from b_stat_ddl order by ID", true);
1267 if($rs)
1268 {
1269 while($ar=$rs->Fetch())
1270 $result[]=$ar;
1271 }
1272 return $result;
1273 }
1274
1275 public static function ExecuteDDL($ID)
1276 {
1277 $ID = intval($ID);
1278 $DB = CDatabase::GetModuleConnection('statistic');
1279 $rs=$DB->Query("select * from b_stat_ddl where ID=".$ID, true);
1280 if($rs)
1281 {
1282 $bSuccess = false;
1283 if($ar=$rs->Fetch())
1284 {
1285 if($DB->Query($ar["SQL_TEXT"], true))
1286 {
1287 $bSuccess = true;
1288 }
1289 else
1290 {
1291 if(mb_strpos($DB->db_Error, "Duplicate key name") === 0) $bSuccess=true;
1292 if(mb_strpos($DB->db_Error, "Can't DROP") === 0) $bSuccess=true;
1293
1294 if(mb_strpos($DB->db_Error, "ORA-00955") === 0) $bSuccess=true;
1295 if(mb_strpos($DB->db_Error, "ORA-01418") === 0) $bSuccess=true;
1296
1297 if(mb_strpos($DB->db_Error, "#S0011") === 0) $bSuccess=true;
1298 if(mb_strpos($DB->db_Error, "#S0002") === 0) $bSuccess=true;
1299 }
1300 }
1301 if($bSuccess)
1302 {
1303 $DB->Query("delete from b_stat_ddl where ID=".$ID, true);
1304 return true;
1305 }
1306
1307 }
1308 return false;
1309 }
1310}
global $APPLICATION
Определения include.php:80
static SetByPage($page, &$arrADV, &$ref1, &$ref2, $type="TO")
Определения adv.php:79
static SetByReferer($referer1, $referer2, &$arrADV, &$ref1, &$ref2)
Определения adv.php:5
static GetByID($currency)
Определения currency.php:453
static GetConvertFactor($curFrom, $curTo, $valDate="")
Определения currency_rate.php:407
static GetModuleConnection($module_id, $bModuleInclude=false)
Определения database.php:180
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
Определения option.php:8
static GetOptionInt($module_id, $name, $def="", $site=false)
Определения option.php:49
static SetOptionString($module_id, $name, $value="", $desc=false, $site="")
Определения option.php:29
static GetByID($ID)
Определения site.php:749
static GetDefList()
Определения site.php:549
static AddCurrent($event1, $event2="", $event3="", $money="", $currency="", $goto="", $chargeback="N", $site_id=false)
Определения statevent.php:38
static GetGID($site_id=false)
Определения statevent.php:8
static Send($event, $lid, $arFields, $Duplicate="Y", $message_id="", $files=[], $languageId='')
Определения event.php:51
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
Определения event_log.php:32
static GetLastByID($ID)
Определения guest.php:6
Определения keepstatistic.php:4
static CleanUpCountries()
Определения statistic.php:366
static CleanUpSessions()
Определения statistic.php:408
static CleanUpPathDynamic()
Определения statistic.php:39
static CleanUpAdvDynamic()
Определения statistic.php:216
static CleanUpSearcherHits()
Определения statistic.php:451
static CleanUpCities()
Определения statistic.php:346
static CleanUpEvents()
Определения statistic.php:512
static CleanUpRefererList()
Определения statistic.php:265
static CleanUpPathCache()
Определения statistic.php:68
static CleanUpEventDynamic()
Определения statistic.php:160
static CleanUpPhrases()
Определения statistic.php:244
static CleanUpReferer()
Определения statistic.php:286
static CleanUpAdvGuests()
Определения statistic.php:481
static CleanUpVisits()
Определения statistic.php:315
static CleanUpTableByDate($cleanup_date, $table_name, $date_name)
Определения statistic.php:6
static CleanUpHits()
Определения statistic.php:430
static CleanUpGuests()
Определения statistic.php:387
static CleanUpSearcherDynamic()
Определения statistic.php:106
$str
Определения commerceml2.php:63
$content
Определения commerceml.php:144
$base_currency
Определения commerceml_g_run_cur.php:2
$arFields
Определения dblapprove.php:5
collapse(node)
Определения ebay_mip_setup.php:316
& nbsp
Определения epilog_main_admin.php:38
hidden PROPERTY[<?=$propertyIndex?>][CODE]<?=htmlspecialcharsEx( $propertyCode)?> height
Определения file_new.php:759
bx popup label bx width30 PAGE_NEW_MENU_NAME text width
Определения file_new.php:677
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
background color
Определения file_new.php:745
bx_acc_lim_group_list limitGroupList[] multiple<?=$group[ 'ID']?> ID selected margin top
Определения file_new.php:657
hidden mSiteList<?=htmlspecialcharsbx(serialize( $siteList))?><?=htmlspecialcharsbx( $siteList[ $j]["ID"])?> _Propery<? if(((COption::GetOptionString( $module_id, "different_set", "N")=="Y") &&( $j !=0))||(COption::GetOptionString( $module_id, "different_set", "N")=="N")) echo "display: none;"?> top adm detail content cell l top adm detail content cell r heading center center ID left
Определения options.php:768
$zr
Определения options.php:5
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
ip2number($dotted)
Определения ip_tools.php:240
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
if(preg_match('/^ else[a-z0-9_]{2}$/i', $siteID)===1)
Определения cron_frame.php:23
global $USER
Определения csv_new_run.php:40
if( $adminSidePanelHelper->isSidePanel())
Определения csv_new_setup.php:231
$z
Определения options.php:31
ConvertDateTime($datetime, $to_format=false, $from_site=false, $bSearchInSitesOnly=false)
Определения tools.php:724
InsertSpaces($sText, $iMaxChar=80, $symbol=" ", $bHTML=false)
Определения tools.php:2197
htmlspecialcharsEx($str)
Определения tools.php:2685
GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
Определения tools.php:1890
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
MkDateTime($strDT, $format="d.m.Y H:i:s")
Определения tools.php:1977
$value
Определения Param.php:39
$table
Определения mysql_to_pgsql.php:36
$STAT_RIGHT
Определения plimus.php:4
global_menu_<?echo $menu["menu_id"]?> adm main menu item icon adm main menu item text text adm main menu hover adm submenu menucontainer menu_id menu_id items_id items_id desktop menu_id block none adm global submenu<?=($subMenuDisplay=="block" ? " adm-global-submenu-active" :"")?> global_submenu_<?echo $menu["menu_id"]?> text MAIN_PR_ADMIN_FAV items adm submenu items wrap adm submenu items stretch wrap BX adminMenu itemsStretchScroll()"> <table class if (!empty( $menu["items"])) elseif ( $menu[ 'menu_id']=='desktop') if ( $menu[ 'menu_id']=='desktop') endforeach
Определения prolog_main_admin.php:255
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
const ADMIN_SECTION
Определения rss.php:2
$i
Определения factura.php:643
font style
Определения invoice.php:442
font size
Определения invoice.php:442
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$width
Определения html.php:68
$currency
Определения template.php:266
text align
Определения template.php:556
$site_id
Определения sonet_set_content_view.php:9
const SITE_ID
Определения sonet_set_content_view.php:12
const BX_STATISTIC_BUFFER_USED
Определения sonet_set_content_view.php:3
crc32ex($s)
Определения stat_tools.php:948
GetStatisticBaseCurrency()
Определения stat_tools.php:368
stat_session_register($var_name)
Определения stat_tools.php:509
__GetFullCurPage($page=false, $with_imp_params=true)
Определения stat_tools.php:327
__SetNoKeepStatistics()
Определения stat_tools.php:127
__IsHiddenLink($link)
Определения stat_tools.php:155
__GetFullRequestUri($url=false, $host=false, $port=false, $protocol=false)
Определения stat_tools.php:339
__GetReferringSite(&$protocol, &$server_name, &$server_name_wo_port, &$PAGE_FROM, $URL_FROM=false)
Определения stat_tools.php:46
$DEFENCE_DELAY
Определения options.php:260
$rows
Определения options.php:264
$rs
Определения action.php:82
$GLOBALS['_____370096793']
Определения update_client.php:1