PageRenderTime 44ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/bitrix/modules/statistic/classes/general/guest.php

https://gitlab.com/neuser/bitrix-core
PHP | 365 lines | 354 code | 11 blank | 0 comment | 59 complexity | 69deb5efd2142c3c1504aea32067786e MD5 | raw file
  1. <?php
  2. class CAllGuest
  3. {
  4. public static function GetList($by = 's_last_date', $order = 'desc', $arFilter = [])
  5. {
  6. $err_mess = "File: ".__FILE__."<br>Line: ";
  7. $DB = CDatabase::GetModuleConnection('statistic');
  8. $arSqlSearch = Array();
  9. $bGroup = false;
  10. $arrGroup = array(
  11. "G.ID" => true,
  12. "G.C_EVENTS" => true,
  13. "G.FIRST_SITE_ID" => true,
  14. "G.LAST_SITE_ID" => true,
  15. "G.SESSIONS" => true,
  16. "G.HITS" => true,
  17. "G.FAVORITES" => true,
  18. "G.FIRST_URL_FROM" => true,
  19. "G.FIRST_URL_TO" => true,
  20. "G.FIRST_URL_TO_404" => true,
  21. "G.FIRST_ADV_ID" => true,
  22. "G.FIRST_REFERER1" => true,
  23. "G.FIRST_REFERER2" => true,
  24. "G.FIRST_REFERER3" => true,
  25. "G.LAST_ADV_ID" => true,
  26. "G.LAST_ADV_BACK" => true,
  27. "G.LAST_REFERER1" => true,
  28. "G.LAST_REFERER2" => true,
  29. "G.LAST_REFERER3" => true,
  30. "G.LAST_USER_ID" => true,
  31. "G.LAST_USER_AUTH" => true,
  32. "G.LAST_URL_LAST" => true,
  33. "G.LAST_URL_LAST_404" => true,
  34. "G.LAST_USER_AGENT" => true,
  35. "G.LAST_IP" => true,
  36. "G.LAST_LANGUAGE" => true,
  37. "G.LAST_COUNTRY_ID" => true,
  38. "G.LAST_CITY_ID" => true,
  39. "G.FIRST_DATE" => true,
  40. "G.LAST_DATE" => true,
  41. "G.FIRST_SESSION_ID" => true,
  42. "G.LAST_SESSION_ID" => true,
  43. "CITY.REGION" => true,
  44. "CITY.NAME" => true,
  45. );
  46. $from0 = $from1 = $from2 = "";
  47. $select0 = $select1 = "";
  48. if (is_array($arFilter))
  49. {
  50. foreach ($arFilter as $key => $val)
  51. {
  52. if(is_array($val))
  53. {
  54. if(count($val) <= 0)
  55. continue;
  56. }
  57. else
  58. {
  59. if( ((string)$val == '') || ($val === "NOT_REF") )
  60. continue;
  61. }
  62. $match_value_set = array_key_exists($key."_EXACT_MATCH", $arFilter);
  63. $key = strtoupper($key);
  64. switch($key)
  65. {
  66. case "ID":
  67. $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
  68. $arSqlSearch[] = GetFilterQuery("G.ID",$val,$match);
  69. break;
  70. case "REGISTERED":
  71. if ($val=="Y")
  72. $arSqlSearch[] = "G.LAST_USER_ID>0 and G.LAST_USER_ID is not null";
  73. elseif ($val=="N")
  74. $arSqlSearch[] = "G.LAST_USER_ID<=0 or G.LAST_USER_ID is null";
  75. break;
  76. case "FIRST_DATE1":
  77. if (CheckDateTime($val))
  78. $arSqlSearch[] = "G.FIRST_DATE >= ".$DB->CharToDateFunction($val, "SHORT");
  79. break;
  80. case "FIRST_DATE2":
  81. if (CheckDateTime($val))
  82. $arSqlSearch[] = "G.FIRST_DATE < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
  83. break;
  84. case "LAST_DATE1":
  85. if (CheckDateTime($val))
  86. $arSqlSearch[] = "G.LAST_DATE >= ".$DB->CharToDateFunction($val, "SHORT");
  87. break;
  88. case "LAST_DATE2":
  89. if (CheckDateTime($val))
  90. $arSqlSearch[] = "G.LAST_DATE < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
  91. break;
  92. case "PERIOD_DATE1":
  93. ResetFilterLogic();
  94. if (CheckDateTime($val))
  95. {
  96. $arSqlSearch[] = "S.DATE_FIRST >= ".$DB->CharToDateFunction($val, "SHORT");
  97. $from0 = " INNER JOIN b_stat_session S ON (S.GUEST_ID = G.ID) ";
  98. $select0 = "count(S.ID) as SESS,";
  99. $bGroup = true;
  100. }
  101. break;
  102. case "PERIOD_DATE2":
  103. ResetFilterLogic();
  104. if (CheckDateTime($val))
  105. {
  106. $arSqlSearch[] = "S.DATE_LAST < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
  107. $from0 = " INNER JOIN b_stat_session S ON (S.GUEST_ID = G.ID) ";
  108. $select0 = "count(S.ID) as SESS,";
  109. $bGroup = true;
  110. }
  111. break;
  112. case "SITE_ID":
  113. if (is_array($val)) $val = implode(" | ", $val);
  114. $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
  115. $arSqlSearch[] = GetFilterQuery("G.LAST_SITE_ID, G.FIRST_SITE_ID", $val, $match);
  116. break;
  117. case "LAST_SITE_ID":
  118. case "FIRST_SITE_ID":
  119. if (is_array($val)) $val = implode(" | ", $val);
  120. $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
  121. $arSqlSearch[] = GetFilterQuery("G.".$key, $val, $match);
  122. break;
  123. case "URL":
  124. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  125. $arSqlSearch[] = GetFilterQuery("G.FIRST_URL_FROM,G.FIRST_URL_TO,G.LAST_URL_LAST", $val, $match, array("/","\\",".","?","#",":"));
  126. break;
  127. case "URL_404":
  128. if ($val=="Y")
  129. $arSqlSearch[] = "G.FIRST_URL_TO_404='Y' or G.LAST_URL_LAST_404='Y'";
  130. elseif ($val=="N")
  131. $arSqlSearch[] = "G.FIRST_URL_TO_404='N' and G.LAST_URL_LAST_404='N'";
  132. break;
  133. case "USER_AGENT":
  134. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  135. $arSqlSearch[] = GetFilterQuery("G.LAST_USER_AGENT", $val, $match);
  136. break;
  137. case "ADV":
  138. if ($val=="Y")
  139. {
  140. $arSqlSearch[] = "(
  141. G.FIRST_ADV_ID>0 and
  142. G.FIRST_ADV_ID is not null and
  143. G.FIRST_REFERER1<>'NA' and G.FIRST_REFERER2<>'NA'
  144. or
  145. G.LAST_ADV_ID>0 and
  146. G.LAST_ADV_ID is not null and
  147. G.LAST_REFERER1<>'NA' and G.LAST_REFERER2<>'NA'
  148. )";
  149. }
  150. elseif ($val=="N")
  151. {
  152. $arSqlSearch[] = "((
  153. G.FIRST_ADV_ID<=0 or
  154. G.FIRST_ADV_ID is null or
  155. (G.FIRST_REFERER1='NA' and G.FIRST_REFERER2='NA')
  156. ) and (
  157. G.LAST_ADV_ID<=0 or
  158. G.LAST_ADV_ID is null or
  159. (G.LAST_REFERER1='NA' and G.LAST_REFERER2='NA')
  160. ))";
  161. }
  162. break;
  163. case "ADV_ID":
  164. $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
  165. $arSqlSearch[] = GetFilterQuery("G.FIRST_ADV_ID,G.LAST_ADV_ID", $val, $match);
  166. break;
  167. case "REFERER1":
  168. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  169. $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER1,G.LAST_REFERER1", $val, $match);
  170. break;
  171. case "REFERER2":
  172. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  173. $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER2,G.LAST_REFERER2", $val, $match);
  174. break;
  175. case "REFERER3":
  176. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  177. $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER3,G.LAST_REFERER3", $val, $match);
  178. break;
  179. case "EVENTS1":
  180. $arSqlSearch[] = "G.C_EVENTS>='".intval($val)."'";
  181. break;
  182. case "EVENTS2":
  183. $arSqlSearch[] = "G.C_EVENTS<='".intval($val)."'";
  184. break;
  185. case "SESS1":
  186. $arSqlSearch[] = "G.SESSIONS>='".intval($val)."'";
  187. break;
  188. case "SESS2":
  189. $arSqlSearch[] = "G.SESSIONS<='".intval($val)."'";
  190. break;
  191. case "HITS1":
  192. $arSqlSearch[] = "G.HITS>='".intval($val)."'";
  193. break;
  194. case "HITS2":
  195. $arSqlSearch[] = "G.HITS<='".intval($val)."'";
  196. break;
  197. case "FAVORITES":
  198. if ($val=="Y")
  199. $arSqlSearch[] = "G.FAVORITES='Y'";
  200. elseif ($val=="N")
  201. $arSqlSearch[] = "G.FAVORITES<>'Y'";
  202. break;
  203. case "IP":
  204. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  205. $arSqlSearch[] = GetFilterQuery("G.LAST_IP",$val,$match,array("."));
  206. break;
  207. case "LANG":
  208. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  209. $arSqlSearch[] = GetFilterQuery("G.LAST_LANGUAGE", $val, $match);
  210. break;
  211. case "COUNTRY_ID":
  212. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  213. $arSqlSearch[] = GetFilterQuery("G.LAST_COUNTRY_ID", $val, $match);
  214. break;
  215. case "COUNTRY":
  216. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  217. $arSqlSearch[] = GetFilterQuery("C.NAME", $val, $match);
  218. $select1 .= " , C.NAME LAST_COUNTRY_NAME ";
  219. $from2 = " LEFT JOIN b_stat_country C ON (C.ID = G.LAST_COUNTRY_ID) ";
  220. $arrGroup["C.NAME"] = true;
  221. $bGroup = true;
  222. break;
  223. case "REGION":
  224. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  225. $arSqlSearch[] = GetFilterQuery("CITY.REGION", $val, $match);
  226. break;
  227. case "CITY_ID":
  228. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  229. $arSqlSearch[] = GetFilterQuery("G.LAST_CITY_ID", $val, $match);
  230. break;
  231. case "CITY":
  232. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  233. $arSqlSearch[] = GetFilterQuery("CITY.NAME", $val, $match);
  234. break;
  235. case "USER":
  236. if(COption::GetOptionString("statistic", "dbnode_id") <= 0)
  237. {
  238. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  239. $arSqlSearch[] = $DB->IsNull("G.LAST_USER_ID","0").">0";
  240. $arSqlSearch[] = GetFilterQuery("G.LAST_USER_ID,A.LOGIN,A.LAST_NAME,A.NAME", $val, $match);
  241. $select1 .= ", ".$DB->Concat($DB->IsNull("A.NAME","''"), "' '", $DB->IsNull("A.LAST_NAME","''"))." USER_NAME, A.LOGIN";
  242. $from1 = "LEFT JOIN b_user A ON (A.ID = G.LAST_USER_ID) ";
  243. $arrGroup["A.NAME"] = true;
  244. $arrGroup["A.LAST_NAME"] = true;
  245. $arrGroup["A.LOGIN"] = true;
  246. $bGroup = true;
  247. }
  248. break;
  249. case "USER_ID":
  250. if(COption::GetOptionString("statistic", "dbnode_id") <= 0)
  251. {
  252. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  253. $arSqlSearch[] = $DB->IsNull("G.LAST_USER_ID","0").">0";
  254. $arSqlSearch[] = GetFilterQuery("G.LAST_USER_ID", $val, $match);
  255. $select1 .= ", ".$DB->Concat($DB->IsNull("A.NAME","''"), "' '", $DB->IsNull("A.LAST_NAME","''"))." USER_NAME, A.LOGIN";
  256. $from1 = "LEFT JOIN b_user A ON (A.ID = G.LAST_USER_ID) ";
  257. $arrGroup["A.NAME"] = true;
  258. $arrGroup["A.LAST_NAME"] = true;
  259. $arrGroup["A.LOGIN"] = true;
  260. $bGroup = true;
  261. }
  262. break;
  263. }
  264. }
  265. }
  266. if ($by == "s_id") $strSqlOrder = "ORDER BY G.ID";
  267. elseif ($by == "s_first_site_id") $strSqlOrder = "ORDER BY G.FIRST_SITE_ID";
  268. elseif ($by == "s_last_site_id") $strSqlOrder = "ORDER BY G.LAST_SITE_ID";
  269. elseif ($by == "s_events") $strSqlOrder = "ORDER BY G.C_EVENTS";
  270. elseif ($by == "s_sessions") $strSqlOrder = "ORDER BY G.SESSIONS";
  271. elseif ($by == "s_hits") $strSqlOrder = "ORDER BY G.HITS";
  272. elseif ($by == "s_first_date") $strSqlOrder = "ORDER BY G.FIRST_DATE";
  273. elseif ($by == "s_first_url_from") $strSqlOrder = "ORDER BY G.FIRST_URL_FROM";
  274. elseif ($by == "s_first_url_to") $strSqlOrder = "ORDER BY G.FIRST_URL_TO";
  275. elseif ($by == "s_first_adv_id") $strSqlOrder = "ORDER BY G.FIRST_ADV_ID";
  276. elseif ($by == "s_last_date") $strSqlOrder = "ORDER BY ".CStatistics::DBFirstDate("G.LAST_DATE");
  277. elseif ($by == "s_last_user_id") $strSqlOrder = "ORDER BY G.LAST_USER_ID";
  278. elseif ($by == "s_last_url_last") $strSqlOrder = "ORDER BY G.LAST_URL_LAST";
  279. elseif ($by == "s_last_user_agent") $strSqlOrder = "ORDER BY G.LAST_USER_AGENT";
  280. elseif ($by == "s_last_ip") $strSqlOrder = "ORDER BY G.LAST_IP";
  281. elseif ($by == "s_last_adv_id") $strSqlOrder = "ORDER BY G.LAST_ADV_ID";
  282. elseif ($by == "s_last_country_id") $strSqlOrder = "ORDER BY G.LAST_COUNTRY_ID";
  283. elseif ($by == "s_last_region_name") $strSqlOrder = "ORDER BY CITY.REGION";
  284. elseif ($by == "s_last_city_id") $strSqlOrder = "ORDER BY G.LAST_CITY_ID";
  285. else
  286. {
  287. $strSqlOrder = "ORDER BY ".CStatistics::DBFirstDate("G.LAST_DATE");
  288. }
  289. if ($order!="asc")
  290. {
  291. $strSqlOrder .= " desc ";
  292. }
  293. $strSqlGroup = $bGroup? "GROUP BY ".implode(", ", array_keys($arrGroup)): "";
  294. $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
  295. $strSql = "
  296. SELECT /*TOP*/
  297. ".$select0."
  298. G.ID, G.FIRST_SITE_ID, G.FIRST_SESSION_ID,
  299. G.LAST_SESSION_ID, G.LAST_SITE_ID,
  300. G.C_EVENTS, G.SESSIONS, G.HITS, G.FAVORITES,
  301. G.FIRST_URL_FROM, G.FIRST_URL_TO, G.FIRST_URL_TO_404,
  302. G.FIRST_ADV_ID, G.FIRST_REFERER1, G.FIRST_REFERER2, G.FIRST_REFERER3,
  303. G.LAST_ADV_ID, G.LAST_ADV_BACK, G.LAST_REFERER1, G.LAST_REFERER2, G.LAST_REFERER3,
  304. G.LAST_USER_ID, G.LAST_USER_AUTH, G.LAST_URL_LAST, G.LAST_URL_LAST_404,
  305. G.LAST_USER_AGENT, G.LAST_IP, G.LAST_LANGUAGE, G.LAST_COUNTRY_ID,
  306. CITY.REGION as LAST_REGION_NAME,
  307. G.LAST_CITY_ID, CITY.NAME as LAST_CITY_NAME,
  308. ".$DB->DateToCharFunction("G.FIRST_DATE")." FIRST_DATE,
  309. ".$DB->DateToCharFunction("G.LAST_DATE")." LAST_DATE
  310. ".$select1."
  311. FROM
  312. b_stat_guest G
  313. ".$from0."
  314. ".$from1."
  315. ".$from2."
  316. LEFT JOIN b_stat_city CITY ON (CITY.ID = G.LAST_CITY_ID)
  317. WHERE
  318. ".$strSqlSearch."
  319. ".$strSqlGroup."
  320. ".$strSqlOrder."
  321. ";
  322. $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess.__LINE__);
  323. return $res;
  324. }
  325. public static function GetByID($ID)
  326. {
  327. $DB = CDatabase::GetModuleConnection('statistic');
  328. $ID = intval($ID);
  329. $res = $DB->Query("
  330. SELECT
  331. G.*,
  332. ".$DB->DateToCharFunction("G.FIRST_DATE")." FIRST_DATE,
  333. ".$DB->DateToCharFunction("G.LAST_DATE")." LAST_DATE,
  334. ".CStatistics::DBDateDiff("FS.DATE_LAST","FS.DATE_FIRST")." FSESSION_TIME,
  335. ".CStatistics::DBDateDiff("LS.DATE_LAST","LS.DATE_FIRST")." LSESSION_TIME,
  336. FS.HITS FSESSION_HITS,
  337. LS.HITS LSESSION_HITS,
  338. C.NAME COUNTRY_NAME,
  339. CITY.REGION REGION_NAME,
  340. CITY.NAME CITY_NAME,
  341. G.LAST_CITY_INFO
  342. FROM
  343. b_stat_guest G
  344. INNER JOIN b_stat_country C ON (C.ID = G.LAST_COUNTRY_ID)
  345. LEFT JOIN b_stat_session FS ON (FS.ID = G.FIRST_SESSION_ID)
  346. LEFT JOIN b_stat_session LS ON (LS.ID = G.LAST_SESSION_ID)
  347. LEFT JOIN b_stat_city CITY ON (CITY.ID = G.LAST_CITY_ID)
  348. WHERE
  349. G.ID = '$ID'
  350. ", false, "File: ".__FILE__."<br>Line: ".__LINE__);
  351. $res = new CStatResult($res);
  352. return $res;
  353. }
  354. }