public function __construct($arDBRecord = false) { parent::__construct($arDBRecord); $DB = CDatabase::GetModuleConnection('statistic'); if (!$arDBRecord) { $country_recs = COption::GetOptionString("statistic", "COUNTRY_INDEX_LOADED", "N"); if ($country_recs !== "Y") { $rs = $DB->Query(CStatistics::DBTopSql("SELECT /*TOP*/ * FROM b_stat_country", 1)); if ($rs->Fetch()) { $country_recs = "Y"; COption::SetOptionString("statistic", "COUNTRY_INDEX_LOADED", "Y"); } } $this->country_avail = $country_recs === "Y"; if ($this->country_avail) { $city_recs = COption::GetOptionString("statistic", "CITY_INDEX_LOADED", "N"); if ($city_recs !== "Y") { $rs = $DB->Query(CStatistics::DBTopSql("SELECT /*TOP*/ * FROM b_stat_city_ip", 1)); if ($rs->Fetch()) { COption::SetOptionString("statistic", "CITY_INDEX_LOADED", "Y"); } } $this->city_avail = COption::GetOptionString("statistic", "CITY_INDEX_LOADED", "N") === "Y"; } $this->is_installed = $this->country_avail; } }
/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#referer">ссылающихся сайтов (страниц)</a>.</p> * * * * * @param string &$by = "s_id" Поле для сортировки. В зависимости от группировки списка, набор * доступных значений данной переменной может быть различным. <ul> * <li>при группировке по ссылающейся странице (<i>filter</i>["<b>GROUP</b>"]="U"): <ul> * <li> <b>s_url_from</b> - ссылающаяся страница; </li> <li> <b>s_quantity</b> - количество * заходов с ссылающейся страницы; </li> <li> <b>s_average_hits</b> - среднее * количество <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">хитов</a>, * производимое посетителями заходящими с той или ссылающейся * страницы. </li> </ul> </li> <li>при группировке по ссылающемуся домену * (<i>filter</i>["<b>GROUP</b>"]="S"): <ul> <li> <b>s_url_from</b> - ссылающийся домен; </li> <li> * <b>s_quantity</b> - количество заходов с ссылающегося домена; </li> <li> * <b>s_average_hits</b> - среднее количество хитов, производимое * посетителями. </li> </ul> </li> <li>когда группировка не установлена: <ul> <li> * <b>s_id</b> - ID записи; </li> <li> <b>s_site_id</b> - ID сайта, на который пришли; </li> <li> * <b>s_url_from</b> - ссылающаяся страница (с которой пришли); </li> <li> <b>s_url_to</b> * - страница на которую пришли; </li> <li> <b>s_date_hit</b> - дата; </li> <li> * <b>s_session_id</b> - ID сессии. </li> </ul> </li> </ul> * * * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b> - ID записи; </li> <li> * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b> * будет искаться вхождение; </li> <li> <b>SESSION_ID</b> - ID сессии; </li> <li> * <b>SESSION_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>SESSION_ID</b> будет искаться вхождение; </li> <li> <b>DATE1</b> - начальное * значение интервала для поля "дата"; </li> <li> <b>DATE2</b> - конечное * значение интервала для поля "дата"; </li> <li> <b>FROM_PROTOCOL</b> - протокол * ссылающейся страницы; </li> <li> <b>FROM_PROTOCOL_EXACT_MATCH</b> - если значение * равно "Y", то при фильтрации по <b>FROM_PROTOCOL</b> будет искаться точное * совпадение; </li> <li> <b>FROM_DOMAIN</b> - домен ссылающейся страницы; </li> <li> * <b>FROM_DOMAIN_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>FROM_DOMAIN</b> будет искаться точное совпадение; </li> <li> <b>FROM_PAGE</b> - * ссылающаяся страница; </li> <li> <b>FROM_PAGE_EXACT_MATCH</b> - если значение равно * "Y", то при фильтрации по <b>FROM_PAGE</b> будет искаться точное * совпадение; </li> <li> <b>FROM</b> - протокол + домен + ссылающаяся страница; * </li> <li> <b>FROM_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>FROM</b> будет искаться точное совпадение; </li> <li> <b>TO</b>* - страница на * которую пришли; </li> <li> <b>TO_EXACT_MATCH</b> - если значение равно "Y", то при * фильтрации по <b>TO</b> будет искаться точное совпадение; </li> <li> * <b>TO_404</b> - была ли <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#404">404 ошибка</a> * на странице, на которую пришли, возможные значения: <ul> <li> <b>Y</b> - * была; </li> <li> <b>N</b> - не была. </li> </ul> </li> <li> <b>SITE_ID</b> - ID сайта на который * пришли; </li> <li> <b>GROUP</b> - группировка результирующего списка; * возможные значения: <ul> <li> <b>S</b> - группировка по ссылающемуся * домену (сайту); </li> <li> <b>U</b> - группировка по ссылающейся странице. * </li> </ul> </li> </ul> * - допускается <a * href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная логика</a> * * * * @param bool &$is_filtered Флаг отфильтрованности результирующего списка. Если значение * равно "true", то список был отфильтрован. * * * * @param int &$total Суммарные количество заходов с ссылающихся страниц. * * * * @param string &$group_by Группировка результирующего списка. Возможные значения: <ul> <li> * <b>U</b> - группировка по ссылающейся странице; </li> <li> <b>S</b> - * группировка по ссылающемуся домену. </li> </ul> * * * * @param int &$max Количество заходов с самой популярной ссылающейся страницы. * * * * @return CDBResult * * * <h4>Example</h4> * <pre> * <? * // отфильтруем только заходы с доменов "google" * // сгруппировав по ссылающемуся домену * $arFilter = array( * "FROM_DOMAIN" => "google", * "GROUP" => "S" * ); * * // получим список записей * $rs = <b>CReferer::GetList</b>( * ($by = "s_url_from"), * ($order = "desc"), * $arFilter, * $is_filtered, * $total, * $group_by, * $max * ); * * // выведем все записи * while ($ar = $rs->Fetch()) * { * echo "<pre>"; print_r($ar); echo "</pre>"; * } * ?> * </pre> * * * * <h4>See Also</h4> * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#referer">Термин "Ссылающийся * сайт (страница)"</a> </li> </ul> <a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/creferer/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered, &$total, &$grby, &$max) { $err_mess = "File: " . __FILE__ . "<br>Line: "; global $grby, $total; $DB = CDatabase::GetModuleConnection('statistic'); $group = false; $strSqlGroup = "GROUP BY L.PROTOCOL, L.SITE_NAME, L.URL_FROM, R.HITS, R.SESSIONS"; $url_from = $DB->Concat("L.PROTOCOL", "L.SITE_NAME", "L.URL_FROM"); $arSqlSearch = array(); $strSqlSearch = ""; if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "ID": case "SESSION_ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("L." . $key, $val, $match); break; case "DATE1": if (CheckDateTime($val)) { $arSqlSearch[] = "L.DATE_HIT >= " . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE2": if (CheckDateTime($val)) { $arSqlSearch[] = "L.DATE_HIT < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); } break; case "FROM_PROTOCOL": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("L.PROTOCOL", $val, $match, array("/", "\\", ":")); break; case "FROM_DOMAIN": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("L.SITE_NAME", $val, $match, array(".")); break; case "FROM_PAGE": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("L.URL_FROM", $val, $match, array("/", "\\", ".", "?", "#", ":", ":")); break; case "FROM": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery($url_from, $val, $match, array("/", "\\", ".", "?", "#", ":"), "N", "N"); break; case "TO": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("L.URL_TO", $val, $match, array("/", "\\", ".", "?", "#", ":")); break; case "TO_404": $arSqlSearch[] = $val == "Y" ? "L.URL_TO_404='Y'" : "L.URL_TO_404='N'"; break; case "GROUP": $group = true; if ($val == "S") { $find_group = "S"; $strSqlGroup = "GROUP BY L.SITE_NAME, R.HITS, R.SESSIONS"; $url_from = "L.SITE_NAME"; } else { $find_group = "U"; } break; case "SITE_ID": if (is_array($val)) { $val = implode(" | ", $val); } $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("L.SITE_ID", $val, $match); break; } } } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $grby = $find_group == "U" || $find_group == "S" ? $find_group : ""; $strSqlOrder = ""; if (strlen($grby) <= 0) { if ($by == "s_id") { $strSqlOrder = " ORDER BY L.ID "; } elseif ($by == "s_site_id") { $strSqlOrder = " ORDER BY L.SITE_ID "; } elseif ($by == "s_url_from") { $strSqlOrder = " ORDER BY URL_FROM "; } elseif ($by == "s_url_to") { $strSqlOrder = " ORDER BY L.URL_TO "; } elseif ($by == "s_date_hit") { $strSqlOrder = " ORDER BY L.DATE_HIT "; } elseif ($by == "s_session_id") { $strSqlOrder = " ORDER BY L.SESSION_ID "; } else { $by = "s_id"; $strSqlOrder = "ORDER BY L.ID"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSql = "\n\t\t\t\tSELECT /*TOP*/\n\t\t\t\t\t" . $url_from . " as URL_FROM,\n\t\t\t\t\tL.ID,\n\t\t\t\t\tL.SESSION_ID,\n\t\t\t\t\tL.SITE_ID,\n\t\t\t\t\t" . $DB->DateToCharFunction("L.DATE_HIT") . " DATE_HIT,\n\t\t\t\t\tL.URL_TO,\n\t\t\t\t\tL.URL_TO_404\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_referer_list L\n\t\t\t\tWHERE\n\t\t\t\t" . $strSqlSearch . "\n\t\t\t\t" . $strSqlOrder . "\n\t\t\t"; } elseif (IsFiltered($strSqlSearch) || $grby == "U") { if ($by == "s_url_from") { $strSqlOrder = "ORDER BY URL_FROM"; } elseif ($by == "s_quantity") { $strSqlOrder = "ORDER BY QUANTITY"; } elseif ($by == "s_average_hits") { $strSqlOrder = "ORDER BY AVERAGE_HITS"; } else { $by = "s_quantity"; $strSqlOrder = "ORDER BY QUANTITY"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tcount(L.ID) as COUNTER\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_referer_list L\n\t\t\t\t\tLEFT JOIN b_stat_referer R ON (R.ID = L.REFERER_ID)\n\t\t\t\tWHERE\n\t\t\t\t" . $strSqlSearch . "\n\t\t\t\t" . $strSqlGroup . "\n\t\t\t"; $c = $DB->Query($strSql, false, $err_mess . __LINE__); $total = 0; $arrCount = array(); while ($cr = $c->Fetch()) { $total += intval($cr["COUNTER"]); $arrCount[] = intval($cr["COUNTER"]); } if (count($arrCount) > 0) { $max = max($arrCount); } $strSql = "\n\t\t\t\tSELECT /*TOP*/\n\t\t\t\t\t" . $url_from . " URL_FROM,\n\t\t\t\t\tcount(L.ID) QUANTITY,\n\t\t\t\t\t(count(L.ID)*100)/{$total} C_PERCENT,\n\t\t\t\t\tR.HITS/R.SESSIONS AVERAGE_HITS\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_referer_list L\n\t\t\t\t\tLEFT JOIN b_stat_referer R ON (R.ID = L.REFERER_ID)\n\t\t\t\tWHERE\n\t\t\t\t" . $strSqlSearch . "\n\t\t\t\t" . $strSqlGroup . "\n\t\t\t\t" . $strSqlOrder . "\n\t\t\t"; } elseif ($grby == "S") { if ($by == "s_url_from") { $strSqlOrder = "ORDER BY URL_FROM"; } elseif ($by == "s_quantity") { $strSqlOrder = "ORDER BY QUANTITY"; } elseif ($by == "s_average_hits") { $strSqlOrder = "ORDER BY AVERAGE_HITS"; } else { $by = "s_quantity"; $strSqlOrder = "ORDER BY QUANTITY"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSql = "SELECT sum(R.SESSIONS) TOTAL, max(R.SESSIONS) MAX FROM b_stat_referer R"; $c = $DB->Query($strSql, false, $err_mess . __LINE__); $cr = $c->Fetch(); $total = intval($cr["TOTAL"]); $max = intval($cr["MAX"]); $strSql = "\n\t\t\t\tSELECT /*TOP*/\n\t\t\t\t\tR.SITE_NAME URL_FROM,\n\t\t\t\t\tsum(R.SESSIONS) QUANTITY,\n\t\t\t\t\t(sum(R.SESSIONS)*100)/{$total} C_PERCENT,\n\t\t\t\t\tsum(R.HITS)/sum(R.SESSIONS) AVERAGE_HITS\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_referer R\n\t\t\t\tGROUP BY R.SITE_NAME\n\t\t\t\t" . $strSqlOrder . "\n\t\t\t"; } $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess . __LINE__); $is_filtered = IsFiltered($strSqlSearch) || $group; return $res; }
/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">хитов</a> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителей</a>. Число выводимых строк определяется в поле <b>Максимальное кол-во показываемых записей в таблицах</b> в <a href="http://dev.1c-bitrix.ru/user_help/statistic/settings.php" >настройках модуля</a> Веб-аналитика.</p> * * * @param string &$by = "s_id" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID хита; </li> * <li> <b>s_site_id</b> - ID сайта; </li> <li> <b>s_session_id</b> - ID <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#session">сессии</a>; </li> <li> <b>s_date_hit</b> - * время хита; </li> <li> <b>s_user_id</b> - ID <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#user">пользователя</a> под которым * был авторизован посетитель (в момент хита или до того); </li> <li> * <b>s_guest_id</b> - ID <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителя</a>; * </li> <li> <b>s_ip</b> - <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#ip">IP адрес</a> * посетителя; </li> <li> <b>s_url</b> - страница хита; </li> <li> <b>s_country_id</b> - ID * страны посетителя. </li> </ul> * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID хита; </li> <li> <b>ID_EXACT_MATCH</b> - * если значение равно "N", то при фильтрации по <b>ID</b> будет искаться * вхождение; </li> <li> <b>GUEST_ID</b>* - ID посетителя; </li> <li> <b>GUEST_ID_EXACT_MATCH</b> - * если значение равно "N", то при фильтрации по <b>GUEST_ID</b> будет * искаться вхождение; </li> <li> <b>NEW_GUEST</b> - флаг "новый посетитель", * возможные значения: <ul> <li> <b>Y</b> - посетитель впервые на портале; </li> * <li> <b>N</b> - посетитель уже посещал ранее портал. </li> </ul> </li> <li> * <b>SESSION_ID</b>* - ID сессии; </li> <li> <b>SESSION_ID_EXACT_MATCH</b> - если значение равно * "N", то при фильтрации по <b>SESSION_ID</b> будет искаться вхождение; </li> <li> * <b>STOP_LIST_ID</b>* - ID записи <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#stop_list">стоп-листа</a> под которую * попал посетитель (если это имело место быть); </li> <li> * <b>STOP_LIST_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>STOP_LIST_ID</b> будет искаться вхождение; </li> <li> <b>URL</b>* - страница хита; * </li> <li> <b>URL_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>URL</b> будет искаться точное совпадение; </li> <li> <b>URL_404</b> - была ли <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#404">404 ошибка</a> на странице хита <ul> * <li> <b>Y</b> - была; </li> <li> <b>N</b> - не было. </li> </ul> </li> <li> <b>USER</b>* - ID, логин, * имя, фамилия пользователя под которым был авторизован посетитель * в момент хита или до него; </li> <li> <b>USER_EXACT_MATCH</b> - если значение равно * "Y", то при фильтрации по <b>USER</b> будет искаться точное совпадение; * </li> <li> <b>REGISTERED</b> - флаг "был ли авторизован посетитель в момент * хита или до этого", возможные значения: <ul> <li> <b>Y</b> - был; </li> <li> <b>N</b> * - не был. </li> </ul> </li> <li> <b>DATE_1</b> - начальное значение интервала даты * хита; </li> <li> <b>DATE_2</b> - конечное значение интервала даты хита; </li> <li> * <b>IP</b>* - IP адрес посетителя в момент хита; </li> <li> <b>IP_EXACT_MATCH</b> - если * значение равно "Y", то при фильтрации по <b>IP</b> будет искаться * точное совпадение; </li> <li> <b>USER_AGENT</b>* - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#user_agent">UserAgent</a> посетителя в * момент хита; </li> <li> <b>USER_AGENT_EXACT_MATCH</b> - если значение равно "Y", то при * фильтрации по <b>USER_AGENT</b> будет искаться точное совпадение; </li> <li> * <b>COUNTRY_ID</b>* - ID страны посетителя в момент хита; </li> <li> * <b>COUNTRY_ID_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>COUNTRY_ID</b> будет искаться точное совпадение; </li> <li> <b>COUNTRY</b>* - * название страны; </li> <li> <b>COUNTRY_EXACT_MATCH</b> - если значение равно "Y", то * при фильтрации по <b>COUNTRY</b> будет искаться точное совпадение; </li> * <li> <b>COOKIE</b>* - содержимое <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#cookie">Cookie</a> в момент хита; </li> <li> * <b>COOKIE_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>COOKIE</b> будет искаться точное совпадение; </li> <li> <b>STOP</b> - <ul> <li> <b>Y</b> * - был; </li> <li> <b>N</b> - не был. </li> </ul> </li> <li> <b>SITE_ID</b>* - ID сайта; </li> <li> * <b>SITE_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>SITE_ID</b> будет искаться вхождение. </li> </ul> <br> * - допускается <a * href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная логика</a> * * @param bool &$is_filtered Флаг отфильтрованности списка хитов. Если значение равно "true", то * список был отфильтрован. * * @return CDBResult * * <h4>Example</h4> * <pre> * <? * // выберем хиты сессии #1056 * $arFilter = array( * "SESSION_ID" => 1056 * ); * * // получим список записей * $rs = <b>CHit::GetList</b>( * ($by = "s_id"), * ($order = "desc"), * $arFilter, * $is_filtered * ); * * // выведем все записи * while ($ar = $rs->Fetch()) * { * echo "<pre>"; print_r($ar); echo "</pre>"; * } * ?> * </pre> * * * <h4>See Also</h4> * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">Термин "Хит"</a> </li> </ul> <a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/chit/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered) { $err_mess = "File: " . __FILE__ . "<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $arSqlSearch = array(); $strSqlSearch = ""; if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "ID": case "GUEST_ID": case "SESSION_ID": case "STOP_LIST_ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("H." . $key, $val, $match); break; case "URL": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H.URL", $val, $match, array("/", "\\", ".", "?", "#", ":")); break; case "URL_404": case "NEW_GUEST": $arSqlSearch[] = $val == "Y" ? "H." . $key . "='Y'" : "H." . $key . "='N'"; break; case "REGISTERED": $arSqlSearch[] = $val == "Y" ? "H.USER_ID>0" : "(H.USER_ID<=0 or H.USER_ID is null)"; break; case "DATE_1": if (CheckDateTime($val)) { $arSqlSearch[] = "H.DATE_HIT >= " . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_2": if (CheckDateTime($val)) { $arSqlSearch[] = "H.DATE_HIT < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); } break; case "IP": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H.IP", $val, $match, array(".")); break; case "USER_AGENT": case "COUNTRY_ID": case "CITY_ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H." . $key, $val, $match); break; case "COOKIE": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H.COOKIES", $val, $match); break; case "USER": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = $DB->IsNull("H.USER_ID", "0") . ">0"; $arSqlSearch[] = GetFilterQuery("H.USER_ID,A.LOGIN,A.LAST_NAME,A.NAME", $val, $match); $select = ", A.LOGIN, " . $DB->Concat($DB->IsNull("A.NAME", "''"), "' '", $DB->IsNull("A.LAST_NAME", "''")) . " USER_NAME"; $from1 = "LEFT JOIN b_user A ON (A.ID = H.USER_ID)"; break; case "COUNTRY": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("C.NAME", $val, $match); $from2 = "INNER JOIN b_stat_country C ON (C.ID = H.COUNTRY_ID)"; break; case "REGION": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("CITY.REGION", $val, $match); break; case "CITY": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("CITY.NAME", $val, $match); break; case "STOP": $arSqlSearch[] = $val == "Y" ? "H.STOP_LIST_ID>0" : "(H.STOP_LIST_ID<=0 or H.STOP_LIST_ID is null)"; break; case "SITE_ID": if (is_array($val)) { $val = implode(" | ", $val); } $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("H.SITE_ID", $val, $match); break; } } } if ($by == "s_id") { $strSqlOrder = "ORDER BY H.ID"; } elseif ($by == "s_site_id") { $strSqlOrder = "ORDER BY H.SITE_ID"; } elseif ($by == "s_session_id") { $strSqlOrder = "ORDER BY H.SESSION_ID"; } elseif ($by == "s_date_hit") { $strSqlOrder = "ORDER BY H.DATE_HIT"; } elseif ($by == "s_user_id") { $strSqlOrder = "ORDER BY H.USER_ID"; } elseif ($by == "s_guest_id") { $strSqlOrder = "ORDER BY H.GUEST_ID"; } elseif ($by == "s_ip") { $strSqlOrder = "ORDER BY H.IP"; } elseif ($by == "s_url") { $strSqlOrder = "ORDER BY H.URL "; } elseif ($by == "s_country_id") { $strSqlOrder = "ORDER BY H.COUNTRY_ID "; } elseif ($by == "s_region_name") { $strSqlOrder = "ORDER BY CITY.REGION "; } elseif ($by == "s_city_id") { $strSqlOrder = "ORDER BY H.CITY_ID "; } else { $by = "s_id"; $strSqlOrder = "ORDER BY H.ID"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $strSql = "\n\t\t\tSELECT /*TOP*/\n\t\t\t\tH.ID,\n\t\t\t\tH.SESSION_ID,\n\t\t\t\tH.GUEST_ID,\n\t\t\t\tH.NEW_GUEST,\n\t\t\t\tH.USER_ID,\n\t\t\t\tH.USER_AUTH,\n\t\t\t\tH.URL,\n\t\t\t\tH.URL_404,\n\t\t\t\tH.URL_FROM,\n\t\t\t\tH.IP,\n\t\t\t\tH.METHOD,\n\t\t\t\tH.COOKIES,\n\t\t\t\tH.USER_AGENT,\n\t\t\t\tH.STOP_LIST_ID,\n\t\t\t\tH.COUNTRY_ID,\n\t\t\t\tH.CITY_ID,\n\t\t\t\tCITY.REGION REGION_NAME,\n\t\t\t\tCITY.NAME CITY_NAME,\n\t\t\t\tH.SITE_ID,\n\t\t\t\t" . $DB->DateToCharFunction("H.DATE_HIT") . " DATE_HIT\n\t\t\t\t" . $select . "\n\t\t\tFROM\n\t\t\t\tb_stat_hit H\n\t\t\t\tLEFT JOIN b_stat_city CITY ON (CITY.ID = H.CITY_ID)\n\t\t\t" . $from1 . "\n\t\t\t" . $from2 . "\n\t\t\tWHERE\n\t\t\t" . $strSqlSearch . "\n\t\t\t" . $strSqlOrder . "\n\t\t"; $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess . __LINE__); $is_filtered = IsFiltered($strSqlSearch); return $res; }
/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителей</a>.</p> * * * * * @param string &$by = "s_last_date" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID * посетителя; </li> <li> <b>s_events</b> - суммарное кол-во <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">событий</a> сгенерированных * посетителем; </li> <li> <b>s_sessions</b> - суммарное кол-во <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#session">сессий</a> посетителя; </li> <li> * <b>s_hits</b> - суммарное кол-во <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">хитов</a> посетителя; </li> <li> * <b>s_first_site_id</b> - ID сайта на который впервые пришел посетитель; </li> <li> * <b>s_first_date</b> - время первого захода на сайт; </li> <li> <b>s_first_url_from</b> - * страница с которой впервые пришел посетитель; </li> <li> <b>s_first_url_to</b> - * страница куда впервые пришел посетитель; </li> <li> <b>s_first_adv_id</b> - ID <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv">рекламной кампании</a> первого * захода; </li> <li> <b>s_last_site_id</b> - ID сайта последнего захода посетителя; * </li> <li> <b>s_last_date</b> - время последнего захода поестителя; </li> <li> * <b>s_last_user_id</b> - ID пользователя; </li> <li> <b>s_last_url_last</b> - последняя * страница на которую заходил посетитель; </li> <li> <b>s_last_user_agent</b> - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#user_agent">UserAgent</a> посетителя на * последнем заходе; </li> <li> <b>s_last_ip</b> - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#ip">IP адрес</a> посетителя на * последнем заходе; </li> <li> <b>s_last_adv_id</b> - ID рекламной кампании на * последнем заходе; </li> <li> <b>s_last_country_id</b> - ID страны посетителя на * последнем заходе. </li> </ul> * * * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID посетителя; </li> <li> * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b> * будет искаться вхождение; </li> <li> <b>REGISTERED</b> - был ли посетитель * когда либо авторизован на сайте, возможные значения: <ul> <li> <b>Y</b> - * был; </li> <li> <b>N</b> - не был. </li> </ul> </li> <li> <b>FIRST_DATE1</b> - начальное * значение интервала для поля "дата первого захода на сайт"; </li> <li> * <b>FIRST_DATE2</b> - конечное значение интервала для поля "дата первого * захода на сайт"; </li> <li> <b>LAST_DATE1</b> - начальное значение интервала * для поля "дата последнего захода на сайт"; </li> <li> <b>LAST_DATE2</b> - * конечное значение интервала для поля "дата первого захода на * сайт"; </li> <li> <b>PERIOD_DATE1</b> - начальное значение интервала для даты * посещения посетителем сайта; </li> <li> <b>PERIOD_DATE2</b> - конечно значение * интервала для даты посещения посетителем сайта; </li> <li> <b>SITE_ID</b>* - ID * сайта первого либо последнего захода; </li> <li> <b>SITE_ID_EXACT_MATCH</b> - если * значение равно "N", то при фильтрации по <b>SITE_ID</b> будет искаться * вхождение; </li> <li> <b>FIRST_SITE_ID</b>* - ID сайта первого захода; </li> <li> * <b>FIRST_SITE_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>FIRST_SITE_ID</b> будет искаться вхождение; </li> <li> <b>LAST_SITE_ID</b>* - ID сайта * последнего захода; </li> <li> <b>LAST_SITE_ID_EXACT_MATCH</b> - если значение равно * "N", то при фильтрации по <b>LAST_SITE_ID</b> будет искаться вхождение; </li> * <li> <b>URL</b>* - страница откуда впервые пришел посетитель, страница на * которую впервые пришел посетитель и последняя страница * просмотренная посетителем; </li> <li> <b>URL_EXACT_MATCH</b> - если значение * равно "Y", то при фильтрации по <b>URL</b> будет искаться точное * совпадение; </li> <li> <b>URL_404</b> - была ли <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#404">404 ошибка</a> на первой странице * или на последней странице посещенной посетителем, возможные * значения: <ul> <li> <b>Y</b> - была; </li> <li> <b>N</b> - не было. </li> </ul> </li> <li> * <b>USER_AGENT</b>* - UserAgent посетителя на последнем заходе; </li> <li> * <b>USER_AGENT_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>USER_AGENT</b> будет искаться точное совпадение; </li> <li> <b>ADV</b> - флаг * "приходил ли посетитель когда либо по рекламной кампании (не * равной NA/NA)", возможные значения: <ul> <li> <b>Y</b> - посетитель приходил * по какой либо рекламной кампании (не равной NA/NA); </li> <li> <b>N</b> - не * приходил никогда ни по одной рекламной кампании (не равной NA/NA). * </li> </ul> </li> <li> <b>ADV_ID</b> - ID рекламной кампании первого либо * последнего захода посетителя (при этом это мог быть как <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_first">прямой заход</a> так и <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_back">возврат</a> по рекламной * кампании); </li> <li> <b>REFERER1</b>* - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_id">идентификатор</a> referer1 * рекламной кампании первого либо последнего захода посетителя; * </li> <li> <b>REFERER1_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>REFERER1</b> будет искаться точное совпадение; </li> <li> <b>REFERER2</b>* - * идентификатор referer2 рекламной кампании первого либо последнего * захода посетителя; </li> <li> <b>REFERER2_EXACT_MATCH</b> - если значение равно "Y", * то при фильтрации по <b>REFERER2</b> будет искаться точное совпадение; * </li> <li> <b>REFERER3</b>* - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_referer3">дополнительный * параметр</a> referer3 рекламной кампании первого либо последнего * захода посетителя; </li> <li> <b>REFERER3_EXACT_MATCH</b> - если значение равно "Y", * то при фильтрации по <b>REFERER3</b> будет искаться точное совпадение; * </li> <li> <b>EVENTS1</b> - начальное значение для интервала кол-ва событий * сгенерированных посетителем; </li> <li> <b>EVENTS2</b> - конечное значение * для интервала кол-ва событий сгенерированных посетителем; </li> <li> * <b>SESS1</b> - начальное значение для интервала кол-ва сессий * сгенерированных посетителем; </li> <li> <b>SESS2</b> - конечное значение * для интервала кол-ва сессий сгенерированных посетителем; </li> <li> * <b>HITS1</b> - начальное значение для интервала кол-ва хитов * сгенерированных посетителем; </li> <li> <b>HITS2</b> - конечное значение * для интервала кол-ва хитов сгенерированных посетителем; </li> <li> * <b>FAVORITES</b> - флаг "добавлял ли посетитель сайт в "<a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#favorites">Избранное</a>"", возможные * значения: <ul> <li> <b>Y</b> - добавлял; </li> <li> <b>N</b> - не добавлял. </li> </ul> </li> * <li> <b>IP</b> - IP адрес посетителя сайта в последнем заходе; </li> <li> * <b>LANG</b> - <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#browser_lang">языки * установленные в настройках браузера</a> посетителя в последнем * заходе; </li> <li> <b>COUNTRY_ID</b>* - ID страны (двухсимвольный идентификатор) * посетителя в последнем заходе; </li> <li> <b>COUNTRY_ID_EXACT_MATCH</b> - если * значение равно "Y", то при фильтрации по <b>COUNTRY_ID</b> будет искаться * точное совпадение; </li> <li> <b>COUNTRY</b>* - название страны; </li> <li> * <b>COUNTRY_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>COUNTRY</b> будет искаться точное совпадение; </li> <li> <b>USER</b>* - ID, логин, * имя, фамилия <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#user">пользователя</a>, * под которыми посетитель последний раз был авторизован; </li> <li> * <b>USER_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по <b>USER</b> * будет искаться точное совпадение; </li> <li> <b>USER_ID</b>* - ID пользователя, * под которым посетитель последний раз был авторизован; </li> <li> * <b>USER_ID_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>USER_ID</b> будет искаться точное совпадение. </li> </ul> <br> * - * допускается <a href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная * логика</a> * * * * @param bool &$is_filtered Флаг отфильтрованности списка посетителей. Если значение равно * "true", то список был отфильтрован. * * * * @return CDBResult * * * <h4>Example</h4> * <pre> * <? * // выберем только тех посетителей UserAgent которых содержит "Opera" * $arFilter = array( * "USER_AGENT" => "Opera" * ); * * // получим список записей * $rs = <b>CGuest::GetList</b>( * ($by = "s_id"), * ($order = "desc"), * $arFilter, * $is_filtered * ); * * // выведем все записи * while ($ar = $rs->Fetch()) * { * echo "<pre>"; print_r($ar); echo "</pre>"; * } * ?> * </pre> * * * * <h4>See Also</h4> * <ul><li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">Термин "Посетитель"</a> * </li></ul><a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cguest/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter=Array(), &$is_filtered) { $err_mess = "File: ".__FILE__."<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $arSqlSearch = Array(); $strSqlSearch = ""; $bGroup = false; $arrGroup = array( "G.ID" => true, "G.C_EVENTS" => true, "G.FIRST_SITE_ID" => true, "G.LAST_SITE_ID" => true, "G.SESSIONS" => true, "G.HITS" => true, "G.FAVORITES" => true, "G.FIRST_URL_FROM" => true, "G.FIRST_URL_TO" => true, "G.FIRST_URL_TO_404" => true, "G.FIRST_ADV_ID" => true, "G.FIRST_REFERER1" => true, "G.FIRST_REFERER2" => true, "G.FIRST_REFERER3" => true, "G.LAST_ADV_ID" => true, "G.LAST_ADV_BACK" => true, "G.LAST_REFERER1" => true, "G.LAST_REFERER2" => true, "G.LAST_REFERER3" => true, "G.LAST_USER_ID" => true, "G.LAST_USER_AUTH" => true, "G.LAST_URL_LAST" => true, "G.LAST_URL_LAST_404" => true, "G.LAST_USER_AGENT" => true, "G.LAST_IP" => true, "G.LAST_LANGUAGE" => true, "G.LAST_COUNTRY_ID" => true, "G.LAST_CITY_ID" => true, "G.FIRST_DATE" => true, "G.LAST_DATE" => true, "G.FIRST_SESSION_ID" => true, "G.LAST_SESSION_ID" => true, "CITY.REGION" => true, "CITY.NAME" => true, ); if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if(is_array($val)) { if(count($val) <= 0) continue; } else { if( (strlen($val) <= 0) || ($val === "NOT_REF") ) continue; } $match_value_set = array_key_exists($key."_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch($key) { case "ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.ID",$val,$match); break; case "REGISTERED": if ($val=="Y") $arSqlSearch[] = "G.LAST_USER_ID>0 and G.LAST_USER_ID is not null"; elseif ($val=="N") $arSqlSearch[] = "G.LAST_USER_ID<=0 or G.LAST_USER_ID is null"; break; case "FIRST_DATE1": if (CheckDateTime($val)) $arSqlSearch[] = "G.FIRST_DATE >= ".$DB->CharToDateFunction($val, "SHORT"); break; case "FIRST_DATE2": if (CheckDateTime($val)) $arSqlSearch[] = "G.FIRST_DATE < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); break; case "LAST_DATE1": if (CheckDateTime($val)) $arSqlSearch[] = "G.LAST_DATE >= ".$DB->CharToDateFunction($val, "SHORT"); break; case "LAST_DATE2": if (CheckDateTime($val)) $arSqlSearch[] = "G.LAST_DATE < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); break; case "PERIOD_DATE1": ResetFilterLogic(); if (CheckDateTime($val)) { $arSqlSearch[] = "S.DATE_FIRST >= ".$DB->CharToDateFunction($val, "SHORT"); $from0 = " INNER JOIN b_stat_session S ON (S.GUEST_ID = G.ID) "; $select0 = "count(S.ID) as SESS,"; $bGroup = true; } break; case "PERIOD_DATE2": ResetFilterLogic(); if (CheckDateTime($val)) { $arSqlSearch[] = "S.DATE_LAST < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); $from0 = " INNER JOIN b_stat_session S ON (S.GUEST_ID = G.ID) "; $select0 = "count(S.ID) as SESS,"; $bGroup = true; } break; case "SITE_ID": if (is_array($val)) $val = implode(" | ", $val); $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.LAST_SITE_ID, G.FIRST_SITE_ID", $val, $match); break; case "LAST_SITE_ID": case "FIRST_SITE_ID": if (is_array($val)) $val = implode(" | ", $val); $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.".$key, $val, $match); break; case "URL": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_URL_FROM,G.FIRST_URL_TO,G.LAST_URL_LAST", $val, $match, array("/","\\",".","?","#",":")); break; case "URL_404": if ($val=="Y") $arSqlSearch[] = "G.FIRST_URL_TO_404='Y' or G.LAST_URL_LAST_404='Y'"; elseif ($val=="N") $arSqlSearch[] = "G.FIRST_URL_TO_404='N' and G.LAST_URL_LAST_404='N'"; break; case "USER_AGENT": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_USER_AGENT", $val, $match); break; case "ADV": if ($val=="Y") { $arSqlSearch[] = "( G.FIRST_ADV_ID>0 and G.FIRST_ADV_ID is not null and G.FIRST_REFERER1<>'NA' and G.FIRST_REFERER2<>'NA' or G.LAST_ADV_ID>0 and G.LAST_ADV_ID is not null and G.LAST_REFERER1<>'NA' and G.LAST_REFERER2<>'NA' )"; } elseif ($val=="N") { $arSqlSearch[] = "(( G.FIRST_ADV_ID<=0 or G.FIRST_ADV_ID is null or (G.FIRST_REFERER1='NA' and G.FIRST_REFERER2='NA') ) and ( G.LAST_ADV_ID<=0 or G.LAST_ADV_ID is null or (G.LAST_REFERER1='NA' and G.LAST_REFERER2='NA') ))"; } break; case "ADV_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.FIRST_ADV_ID,G.LAST_ADV_ID", $val, $match); break; case "REFERER1": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER1,G.LAST_REFERER1", $val, $match); break; case "REFERER2": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER2,G.LAST_REFERER2", $val, $match); break; case "REFERER3": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER3,G.LAST_REFERER3", $val, $match); break; case "EVENTS1": $arSqlSearch[] = "G.C_EVENTS>='".intval($val)."'"; break; case "EVENTS2": $arSqlSearch[] = "G.C_EVENTS<='".intval($val)."'"; break; case "SESS1": $arSqlSearch[] = "G.SESSIONS>='".intval($val)."'"; break; case "SESS2": $arSqlSearch[] = "G.SESSIONS<='".intval($val)."'"; break; case "HITS1": $arSqlSearch[] = "G.HITS>='".intval($val)."'"; break; case "HITS2": $arSqlSearch[] = "G.HITS<='".intval($val)."'"; break; case "FAVORITES": if ($val=="Y") $arSqlSearch[] = "G.FAVORITES='Y'"; elseif ($val=="N") $arSqlSearch[] = "G.FAVORITES<>'Y'"; break; case "IP": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_IP",$val,$match,array(".")); break; case "LANG": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_LANGUAGE", $val, $match); break; case "COUNTRY_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_COUNTRY_ID", $val, $match); break; case "COUNTRY": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("C.NAME", $val, $match); $select1 .= " , C.NAME LAST_COUNTRY_NAME "; $from2 = " LEFT JOIN b_stat_country C ON (C.ID = G.LAST_COUNTRY_ID) "; $arrGroup["C.NAME"] = true; $bGroup = true; break; case "REGION": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("CITY.REGION", $val, $match); break; case "CITY_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_CITY_ID", $val, $match); break; case "CITY": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("CITY.NAME", $val, $match); break; case "USER": if(COption::GetOptionString("statistic", "dbnode_id") <= 0) { $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = $DB->IsNull("G.LAST_USER_ID","0").">0"; $arSqlSearch[] = GetFilterQuery("G.LAST_USER_ID,A.LOGIN,A.LAST_NAME,A.NAME", $val, $match); $select1 .= ", ".$DB->Concat($DB->IsNull("A.NAME","''"), "' '", $DB->IsNull("A.LAST_NAME","''"))." USER_NAME, A.LOGIN"; $from1 = "LEFT JOIN b_user A ON (A.ID = G.LAST_USER_ID) "; $arrGroup["A.NAME"] = true; $arrGroup["A.LAST_NAME"] = true; $arrGroup["A.LOGIN"] = true; $bGroup = true; } break; case "USER_ID": if(COption::GetOptionString("statistic", "dbnode_id") <= 0) { $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = $DB->IsNull("G.LAST_USER_ID","0").">0"; $arSqlSearch[] = GetFilterQuery("G.LAST_USER_ID", $val, $match); $select1 .= ", ".$DB->Concat($DB->IsNull("A.NAME","''"), "' '", $DB->IsNull("A.LAST_NAME","''"))." USER_NAME, A.LOGIN"; $from1 = "LEFT JOIN b_user A ON (A.ID = G.LAST_USER_ID) "; $arrGroup["A.NAME"] = true; $arrGroup["A.LAST_NAME"] = true; $arrGroup["A.LOGIN"] = true; $bGroup = true; } break; } } } if ($by == "s_id") $strSqlOrder = "ORDER BY G.ID"; elseif ($by == "s_first_site_id") $strSqlOrder = "ORDER BY G.FIRST_SITE_ID"; elseif ($by == "s_last_site_id") $strSqlOrder = "ORDER BY G.LAST_SITE_ID"; elseif ($by == "s_events") $strSqlOrder = "ORDER BY G.C_EVENTS"; elseif ($by == "s_sessions") $strSqlOrder = "ORDER BY G.SESSIONS"; elseif ($by == "s_hits") $strSqlOrder = "ORDER BY G.HITS"; elseif ($by == "s_first_date") $strSqlOrder = "ORDER BY G.FIRST_DATE"; elseif ($by == "s_first_url_from") $strSqlOrder = "ORDER BY G.FIRST_URL_FROM"; elseif ($by == "s_first_url_to") $strSqlOrder = "ORDER BY G.FIRST_URL_TO"; elseif ($by == "s_first_adv_id") $strSqlOrder = "ORDER BY G.FIRST_ADV_ID"; elseif ($by == "s_last_date") $strSqlOrder = "ORDER BY ".CStatistics::DBFirstDate("G.LAST_DATE"); elseif ($by == "s_last_user_id") $strSqlOrder = "ORDER BY G.LAST_USER_ID"; elseif ($by == "s_last_url_last") $strSqlOrder = "ORDER BY G.LAST_URL_LAST"; elseif ($by == "s_last_user_agent") $strSqlOrder = "ORDER BY G.LAST_USER_AGENT"; elseif ($by == "s_last_ip") $strSqlOrder = "ORDER BY G.LAST_IP"; elseif ($by == "s_last_adv_id") $strSqlOrder = "ORDER BY G.LAST_ADV_ID"; elseif ($by == "s_last_country_id") $strSqlOrder = "ORDER BY G.LAST_COUNTRY_ID"; elseif ($by == "s_last_region_name") $strSqlOrder = "ORDER BY CITY.REGION"; elseif ($by == "s_last_city_id") $strSqlOrder = "ORDER BY G.LAST_CITY_ID"; else { $by = "s_last_date"; $strSqlOrder = "ORDER BY ".CStatistics::DBFirstDate("G.LAST_DATE"); } if ($order!="asc") { $strSqlOrder .= " desc "; $order="desc"; } if($bGroup) { $strSqlGroup = "GROUP BY ".implode(", ", array_keys($arrGroup)); } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $strSql = " SELECT /*TOP*/ ".$select0." G.ID, G.FIRST_SITE_ID, G.FIRST_SESSION_ID, G.LAST_SESSION_ID, G.LAST_SITE_ID, G.C_EVENTS, G.SESSIONS, G.HITS, G.FAVORITES, G.FIRST_URL_FROM, G.FIRST_URL_TO, G.FIRST_URL_TO_404, G.FIRST_ADV_ID, G.FIRST_REFERER1, G.FIRST_REFERER2, G.FIRST_REFERER3, G.LAST_ADV_ID, G.LAST_ADV_BACK, G.LAST_REFERER1, G.LAST_REFERER2, G.LAST_REFERER3, G.LAST_USER_ID, G.LAST_USER_AUTH, G.LAST_URL_LAST, G.LAST_URL_LAST_404, G.LAST_USER_AGENT, G.LAST_IP, G.LAST_LANGUAGE, G.LAST_COUNTRY_ID, CITY.REGION as LAST_REGION_NAME, G.LAST_CITY_ID, CITY.NAME as LAST_CITY_NAME, ".$DB->DateToCharFunction("G.FIRST_DATE")." FIRST_DATE, ".$DB->DateToCharFunction("G.LAST_DATE")." LAST_DATE ".$select1." FROM b_stat_guest G ".$from0." ".$from1." ".$from2." LEFT JOIN b_stat_city CITY ON (CITY.ID = G.LAST_CITY_ID) WHERE ".$strSqlSearch." ".$strSqlGroup." ".$strSqlOrder." "; $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess.__LINE__); $is_filtered = (IsFiltered($strSqlSearch)); return $res; }
function GetList(&$by, &$order, $arFilter = array(), &$is_filtered) { $err_mess = "File: " . __FILE__ . "<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $arSqlSearch = array(); $strSqlSearch = ""; if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "ID": case "SEARCHER_ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("H." . $key, $val, $match); break; case "URL": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H.URL", $val, $match, array("/", "\\", ".", "?", "#", ":")); break; case "URL_404": $arSqlSearch[] = $val == "Y" ? "H.URL_404='Y'" : "H.URL_404='N'"; break; case "SEARCHER": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("S.NAME", $val, $match); break; case "DATE1": if (CheckDateTime($val)) { $arSqlSearch[] = "H.DATE_HIT >= " . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE2": if (CheckDateTime($val)) { $arSqlSearch[] = "H.DATE_HIT < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); } break; case "IP": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H.IP", $val, $match, array(".")); break; case "USER_AGENT": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("H.USER_AGENT", $val, $match); break; case "SITE_ID": if (is_array($val)) { $val = implode(" | ", $val); } $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("H.SITE_ID", $val, $match); break; } } } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); if ($by == "s_id") { $strSqlOrder = "ORDER BY H.ID"; } elseif ($by == "s_site_id") { $strSqlOrder = "ORDER BY H.SITE_ID"; } elseif ($by == "s_date_hit") { $strSqlOrder = "ORDER BY H.DATE_HIT"; } elseif ($by == "s_searcher_id") { $strSqlOrder = "ORDER BY H.SEARCHER_ID"; } elseif ($by == "s_user_agent") { $strSqlOrder = "ORDER BY H.USER_AGENT"; } elseif ($by == "s_ip") { $strSqlOrder = "ORDER BY H.IP"; } elseif ($by == "s_url") { $strSqlOrder = "ORDER BY H.URL "; } else { $by = "s_date_hit"; $strSqlOrder = "ORDER BY H.DATE_HIT"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSql = "\n\t\t\tSELECT /*TOP*/\n\t\t\t\tH.ID, H.SEARCHER_ID, H.URL, H.URL_404, H.IP, H.USER_AGENT, H.HIT_KEEP_DAYS, H.SITE_ID,\n\t\t\t\tS.NAME SEARCHER_NAME,\n\t\t\t\t" . $DB->DateToCharFunction("H.DATE_HIT") . " DATE_HIT\n\t\t\tFROM\n\t\t\t\tb_stat_searcher_hit H\n\t\t\tINNER JOIN b_stat_searcher S ON (S.ID = H.SEARCHER_ID)\n\t\t\tWHERE\n\t\t\t" . $strSqlSearch . "\n\t\t\t" . $strSqlOrder . "\n\t\t"; $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess . __LINE__); $is_filtered = IsFiltered($strSqlSearch); return $res; }
/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#phrase">поисковых фраз</a> с возможностью группировки по поисковое фразе или <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#search">поисковой системе</a>.</p> * * * * * @param string &$by = "s_id" Поле для сортировки. В зависимости от группировки списка, набор * доступных значений данной переменной может быть различным. <ul> * <li>при группировке по поисковой фразе (<i>filter</i>["<b>GROUP</b>"]="P"): <ul> <li> * <b>s_phrase</b> - поисковая фраза; </li> <li> <b>s_quantity</b> - количество заходов с * той или иной поисковой фразой. </li> </ul> </li> <li>при группировке по * поисковой системе (<i>filter</i>["<b>GROUP</b>"]="S"): <ul> <li> <b>s_name</b> - поисковая * система; </li> <li> <b>s_quantity</b> - количество заходов с данной поисковой * системы; </li> <li> <b>s_average_hits</b> - среднее количество <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">хитов</a> производимое * посетителями заходящим с той или иной поисковой системы. </li> </ul> * </li> <li>когда группировка не установлена: <ul> <li> <b>s_id</b> - ID записи; </li> * <li> <b>s_counter</b> - счетчик; </li> <li> <b>s_site_id</b> - ID сайта на который пришли; * </li> <li> <b>s_phrase</b> - поисковая фраза; </li> <li> <b>s_searcher_id</b> - ID поисковой * системы; </li> <li> <b>s_referer_id</b> - ID записи из таблицы <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#referer">ссылающихся сайтов * (страниц)</a>; </li> <li> <b>s_date_hit</b> - дата захода; </li> <li> <b>s_url_to</b> - * страница на которую пришли; </li> <li> <b>s_session_id</b> - ID <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#session">сессии</a>. </li> </ul> </li> </ul> * * * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b> - ID записи; </li> <li> * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b> * будет искаться вхождение; </li> <li> <b>SESSION_ID</b> - ID сессии; </li> <li> * <b>SESSION_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>SESSION_ID</b> будет искаться вхождение; </li> <li> <b>SEARCHER_ID</b> - ID поисковой * системы; </li> <li> <b>SEARCHER_ID_EXACT_MATCH</b> - если значение равно "N", то при * фильтрации по <b>SEARCHER_ID</b> будет искаться вхождение; </li> <li> * <b>REFERER_ID</b> - ID записи из таблицы ссылающихся сайтов (страниц); </li> <li> * <b>REFERER_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>REFERER_ID</b> будет искаться вхождение; </li> <li> <b>SEARCHER</b>* - название * поисковой системы; </li> <li> <b>SEARCHER_EXACT_MATCH</b> - если значение равно "Y", * то при фильтрации по <b>SEARCHER</b> будет искаться точное совпадение; * </li> <li> <b>DATE1</b> - начальное значение интервала для поля "дата"; </li> <li> * <b>DATE2</b> - конечно значение интервала для поля "дата"; </li> <li> <b>PHRASE</b>* * - поисковая фраза; </li> <li> <b>PHRASE_EXACT_MATCH</b> - если значение равно "Y", то * при фильтрации по <b>PHRASE</b> будет искаться точное совпадение; </li> <li> * <b>TO</b>* - страница на которую пришли; </li> <li> <b>TO_EXACT_MATCH</b> - если * значение равно "Y", то при фильтрации по <b>TO</b> будет искаться * точное совпадение; </li> <li> <b>TO_404</b> - была ли <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#404">404 ошибка</a> на странице на * которую пришли, возможные значения: <ul> <li> <b>Y</b> - была; </li> <li> <b>N</b> - * не была. </li> </ul> </li> <li> <b>SITE_ID</b> - ID сайта, на который пришли; </li> <li> * <b>GROUP</b> - группировка результирующего списка, возможные значения: * <ul> <li> <b>P</b> - группировка по поисковой фразе; </li> <li> <b>S</b> - * группировка по поисковой системе. </li> </ul> </li> </ul> * - допускается <a * href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная логика</a> * * * * @param bool &$is_filtered Флаг отфильтрованности результирующего списка. Если значение * равно "true", то список был отфильтрован. * * * * @param int &$total Суммарное количество поисковых фраз. Принимает значение только * при установленной группировке. * * * * @param string &$group_by Группировка списка поисковых фраз. Возможные значения: <ul> <li> <b>P</b> * - группировка по поисковой фразе; </li> <li> <b>S</b> - группировка по * поисковой системе. </li> </ul> * * * * @param int &$max Количество заходов по самой популярной поисковой фразе. * Принимает значение только при установленной группировке. * * * * @return CDBResult * * * <h4>Example</h4> * <pre> * <?<br>// отфильтруем только те поисковые фразы<br>// которые искали на сайте с помощью внутреннего поиска<br>$arFilter = array(<br> "SEARCHER_ID" => 1<br> );<br><br>// получим список записей<br>$rs = <b>CPhrase::GetList</b>(<br> ($by = "s_id"), <br> ($order = "desc"), <br> $arFilter, <br> $is_filtered,<br> $total,<br> $group_by,<br> $max<br> );<br><br>// выведем все записи<br>while ($ar = $rs->Fetch())<br>{<br> echo "<pre>"; print_r($ar); echo "</pre>"; <br>}<br>?><br> * </pre> * * * * <h4>See Also</h4> * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#phrase">Термин "Поисковая * фраза"</a> </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#search">Термин * "Поисковая система"</a> </li> </ul><a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cphrase/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter=Array(), &$is_filtered, &$total, &$grby, &$max) { $err_mess = "File: ".__FILE__."<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $group = false; $s = "S.NAME as SEARCHER_NAME, S.ID as SEARCHER_ID"; $strSqlGroup = "GROUP BY S.ID, S.NAME, S.PHRASES_HITS, S.PHRASES"; $arSqlSearch = Array("PH.SEARCHER_ID <> 1"); $strSqlSearch = ""; if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if(is_array($val)) { if(count($val) <= 0) continue; } else { if( (strlen($val) <= 0) || ($val === "NOT_REF") ) continue; } $match_value_set = array_key_exists($key."_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch($key) { case "ID": case "SESSION_ID": case "SEARCHER_ID": case "REFERER_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("PH.".$key,$val,$match); break; case "SEARCHER_ID_STR": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("S.ID",$val,$match); break; case "SEARCHER": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("S.NAME", $val, $match); break; case "DATE1": if (CheckDateTime($val)) $arSqlSearch[] = "PH.DATE_HIT >= ".$DB->CharToDateFunction($val, "SHORT"); break; case "DATE2": if (CheckDateTime($val)) $arSqlSearch[] = "PH.DATE_HIT < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); break; case "PHRASE": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; if($match == "N") $val = '"'.trim($val, '"').'"'; $arSqlSearch[] = GetFilterQuery("PH.PHRASE", $val, $match); break; case "TO": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("PH.URL_TO",$val,$match,array("/","\\",".","?","#",":")); break; case "TO_404": $arSqlSearch[] = ($val=="Y") ? "PH.URL_TO_404='Y'" : "PH.URL_TO_404='N'"; break; case "GROUP": $group = true; if ($val=="P") { $find_group="P"; $strSqlGroup = " GROUP BY PH.PHRASE "; $s = " PH.PHRASE "; } else $find_group="S"; break; case "SITE_ID": if (is_array($val)) $val = implode(" | ", $val); $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("PH.SITE_ID", $val, $match); break; } } } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $grby = ($find_group=="P" || $find_group=="S") ? $find_group : ""; $strSqlOrder = ""; if (strlen($grby)<=0) { if ($by == "s_id") $strSqlOrder = "ORDER BY PH.ID"; elseif ($by == "s_site_id") $strSqlOrder = "ORDER BY PH.SITE_ID"; elseif ($by == "s_phrase") $strSqlOrder = "ORDER BY PH.PHRASE"; elseif ($by == "s_searcher_id") $strSqlOrder = "ORDER BY PH.SEARCHER_ID"; elseif ($by == "s_referer_id") $strSqlOrder = "ORDER BY PH.REFERER_ID"; elseif ($by == "s_date_hit") $strSqlOrder = "ORDER BY PH.DATE_HIT"; elseif ($by == "s_url_to") $strSqlOrder = "ORDER BY PH.URL_TO"; elseif ($by == "s_session_id") $strSqlOrder = "ORDER BY PH.SESSION_ID"; else { $by = "s_id"; $strSqlOrder = "ORDER BY PH.ID"; } if ($order!="asc") { $strSqlOrder .= " desc "; $order="desc"; } $strSql = " SELECT /*TOP*/ PH.ID, PH.PHRASE, PH.SESSION_ID, PH.SEARCHER_ID, PH.URL_TO, PH.URL_TO_404, PH.REFERER_ID, PH.SITE_ID, ".$DB->DateToCharFunction("PH.DATE_HIT")." DATE_HIT, S.NAME SEARCHER_NAME FROM b_stat_phrase_list PH INNER JOIN b_stat_searcher S ON (S.ID = PH.SEARCHER_ID) WHERE ".$strSqlSearch." ".$strSqlOrder." "; } elseif (IsFiltered($strSqlSearch) || $grby=="P") { if ($by == "s_phrase" && $grby=="P") $strSqlOrder = "ORDER BY PH.PHRASE"; elseif ($by == "s_searcher_id" && $grby=="S") $strSqlOrder = "ORDER BY PH.SEARCHER_ID"; elseif ($by == "s_quantity") $strSqlOrder = "ORDER BY QUANTITY"; else { $by = "s_quantity"; $strSqlOrder = "ORDER BY QUANTITY"; } if ($order!="asc") { $strSqlOrder .= " desc "; $order="desc"; } $strSql = " SELECT count(PH.ID) as COUNTER FROM b_stat_phrase_list PH, b_stat_searcher S WHERE ".$strSqlSearch." and S.ID = PH.SEARCHER_ID ".$strSqlGroup." "; $c = $DB->Query($strSql, false, $err_mess.__LINE__); $total = 0; $arrCount = array(); while ($cr = $c->Fetch()) { $total += intval($cr["COUNTER"]); $arrCount[] = intval($cr["COUNTER"]); } $max = (is_array($arrCount) && count($arrCount)>0) ? max($arrCount) : 0; if ($grby=="P") { $strSql = " SELECT /*TOP*/ $s, count(PH.ID) QUANTITY, (count(PH.ID)*100)/$total C_PERCENT FROM b_stat_phrase_list PH, b_stat_searcher S WHERE ".$strSqlSearch." and S.ID = PH.SEARCHER_ID ".$strSqlGroup." ".$strSqlOrder." "; } else { $strSql = " SELECT /*TOP*/ $s, count(PH.ID) QUANTITY, (count(PH.ID)*100)/$total C_PERCENT, S.PHRASES_HITS/S.PHRASES AVERAGE_HITS FROM b_stat_phrase_list PH, b_stat_searcher S WHERE ".$strSqlSearch." and S.ID = PH.SEARCHER_ID ".$strSqlGroup." ".$strSqlOrder." "; } } elseif ($grby=="S") { if ($by == "s_name") $strSqlOrder = "ORDER BY S.ID"; elseif ($by == "s_quantity") $strSqlOrder = "ORDER BY QUANTITY"; elseif ($by == "s_average_hits") $strSqlOrder = "ORDER BY AVERAGE_HITS"; else { $by = "s_quantity"; $strSqlOrder = "ORDER BY QUANTITY"; } if ($order!="asc") { $strSqlOrder .= " desc "; $order="desc"; } $strSql = "SELECT sum(S.PHRASES) TOTAL, max(S.PHRASES) MAX FROM b_stat_searcher S"; $c = $DB->Query($strSql, false, $err_mess.__LINE__); $cr = $c->Fetch(); $total = intval($cr["TOTAL"]); $max = intval($cr["MAX"]); $strSql = " SELECT /*TOP*/ S.ID SEARCHER_ID, S.NAME SEARCHER_NAME, S.PHRASES QUANTITY, S.PHRASES*100/$total C_PERCENT, S.PHRASES_HITS/S.PHRASES AVERAGE_HITS FROM b_stat_searcher S WHERE ".$DB->IsNull("S.PHRASES","0")." > 0 ".$strSqlOrder." "; } $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess.__LINE__); $is_filtered = (IsFiltered($strSqlSearch) || $group); return $res; }
function GetByID($ID) { $DB = CDatabase::GetModuleConnection('statistic'); $strSql = "SELECT /*TOP*/ * FROM b_stat_path WHERE PATH_ID = '" . $DB->ForSql($ID) . "'"; return $DB->Query(CStatistics::DBTopSql($strSql, 1), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); }
public static function GetListUniqueCheck($arFilter = array(), $LIMIT = 1) { $err_mess = "File: " . __FILE__ . "<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $arSqlSearch = array(); $strSqlSearch = ""; if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "EVENT3": $arSqlSearch[] = "E.EVENT3 = '" . $DB->ForSql($val, 255) . "'"; break; case "DATE": if (CheckDateTime($val)) { $arSqlSearch[] = "E.DATE_ENTER=" . $DB->CharToDateFunction($val); } break; case "EVENT_ID": case "SESSION_ID": case "GUEST_ID": case "ADV_ID": case "COUNTRY_ID": $arSqlSearch[] = "E." . $key . "='" . $DB->ForSql($val) . "'"; break; case "ADV_BACK": $arSqlSearch[] = $val == "Y" ? "E.ADV_BACK='Y'" : "E.ADV_BACK='N'"; break; case "SITE_ID": $arSqlSearch[] = "E.SITE_ID = '" . $DB->ForSql($val, 2) . "'"; break; } } } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $strSql = "\n\t\t\tSELECT /*TOP*/\n\t\t\t\tE.ID\n\t\t\tFROM\n\t\t\t\tb_stat_event_list E\n\t\t\tWHERE\n\t\t\t\t" . $strSqlSearch . "\n\t\t"; $res = $DB->Query(CStatistics::DBTopSql($strSql, $LIMIT), false, $err_mess . __LINE__); return $res; }
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); } } }