Beispiel #1
0
 /**
  * <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>
  * &lt;?
  * // выберем хиты сессии #1056
  * $arFilter = array(
  *     "SESSION_ID" =&gt; 1056
  *     );
  * 
  * // получим список записей
  * $rs = <b>CHit::GetList</b>(
  *     ($by = "s_id"), 
  *     ($order = "desc"), 
  *     $arFilter, 
  *     $is_filtered
  *     );
  * 
  * // выведем все записи
  * while ($ar = $rs-&gt;Fetch())
  * {
  *     echo "&lt;pre&gt;"; print_r($ar); echo "&lt;/pre&gt;";    
  * }
  * ?&gt;
  * </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;
 }
Beispiel #2
0
 /**
  * <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>
  * &lt;?
  * // отфильтруем только заходы с доменов "google"
  * // сгруппировав по ссылающемуся домену
  * $arFilter = array(
  *     "FROM_DOMAIN"  =&gt; "google",
  *     "GROUP"        =&gt; "S"
  *     );
  * 
  * // получим список записей
  * $rs = <b>CReferer::GetList</b>(
  *     ($by = "s_url_from"), 
  *     ($order = "desc"), 
  *     $arFilter, 
  *     $is_filtered,
  *     $total,
  *     $group_by,
  *     $max
  *     );
  * 
  * // выведем все записи
  * while ($ar = $rs-&gt;Fetch())
  * {
  *     echo "&lt;pre&gt;"; print_r($ar); echo "&lt;/pre&gt;";    
  * }
  * ?&gt;
  * </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;
 }
Beispiel #3
0
	/**
	 * <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>
	 * &lt;?
	 * // выберем только тех посетителей UserAgent которых содержит "Opera"
	 * $arFilter = array(
	 *     "USER_AGENT" =&gt; "Opera"
	 *     );
	 * 
	 * // получим список записей
	 * $rs = <b>CGuest::GetList</b>(
	 *     ($by = "s_id"), 
	 *     ($order = "desc"), 
	 *     $arFilter, 
	 *     $is_filtered
	 *     );
	 * 
	 * // выведем все записи
	 * while ($ar = $rs-&gt;Fetch())
	 * {
	 *     echo "&lt;pre&gt;"; print_r($ar); echo "&lt;/pre&gt;";    
	 * }
	 * ?&gt;
	 * </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;
	}
Beispiel #4
0
 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;
 }
Beispiel #5
0
 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":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("S.ID", $val, $match);
                     break;
                 case "DATE_START_1":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "S.DATE_START >= " . $DB->CharToDateFunction($val, "SHORT");
                     }
                     break;
                 case "DATE_START_2":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "S.DATE_START < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
                     }
                     break;
                 case "DATE_END_1":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "S.DATE_END >= " . $DB->CharToDateFunction($val, "SHORT");
                     }
                     break;
                 case "DATE_END_2":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "S.DATE_END < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
                     }
                     break;
                 case "ACTIVE":
                 case "SAVE_STATISTIC":
                     $arSqlSearch[] = $val == "Y" ? "S." . $key . "='Y'" : "S." . $key . "='N'";
                     break;
                 case "IP_1":
                 case "IP_2":
                 case "IP_3":
                 case "IP_4":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("S." . $key, $val, $match);
                     break;
                 case "URL_FROM":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("S.URL_FROM", $val, $match, array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "USER_AGENT":
                 case "MESSAGE":
                 case "COMMENTS":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("S." . $key, $val, $match);
                     break;
                 case "URL_TO":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("S.URL_TO", $val, $match, array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "URL_REDIRECT":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("S.URL_REDIRECT", $val, $match, array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "SITE_ID":
                     if (is_array($val)) {
                         $val = implode(" | ", $val);
                     }
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("S.SITE_ID", $val, $match);
                     break;
             }
         }
     }
     $strSqlOrder = "";
     if ($order != "asc") {
         $order = "desc";
     }
     if ($by == "s_id") {
         $strSqlOrder = "ORDER BY S.ID {$order}";
     } elseif ($by == "s_date_start") {
         $strSqlOrder = "ORDER BY S.DATE_START {$order}";
     } elseif ($by == "s_site_id") {
         $strSqlOrder = "ORDER BY S.SITE_ID {$order}";
     } elseif ($by == "s_date_end") {
         $strSqlOrder = "ORDER BY S.DATE_END {$order}";
     } elseif ($by == "s_active") {
         $strSqlOrder = "ORDER BY S.ACTIVE {$order}";
     } elseif ($by == "s_save_statistic") {
         $strSqlOrder = "ORDER BY S.SAVE_STATISTIC {$order}";
     } elseif ($by == "s_ip") {
         $strSqlOrder = "ORDER BY S.IP_1 {$order}, S.IP_2 {$order}, S.IP_3 {$order}, S.IP_4 {$order}";
     } elseif ($by == "s_mask") {
         $strSqlOrder = "ORDER BY S.MASK_1 {$order}, S.MASK_2 {$order}, S.MASK_3 {$order}, S.MASK_4 {$order}";
     } elseif ($by == "s_url_to") {
         $strSqlOrder = "ORDER BY S.URL_TO {$order}";
     } elseif ($by == "s_url_from") {
         $strSqlOrder = "ORDER BY S.URL_FROM {$order}";
     } else {
         $strSqlOrder = "ORDER BY S.ID {$order}";
         $by = "s_id";
     }
     $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
     $strSql = "\n\t\t\tSELECT\n\t\t\t\tS.ID, S.ACTIVE, S.SAVE_STATISTIC,\n\t\t\t\tS.IP_1, S.IP_2, S.IP_3, S.IP_4,\n\t\t\t\tS.MASK_1, S.MASK_2, S.MASK_3, S.MASK_4,\n\t\t\t\tS.USER_AGENT, S.USER_AGENT_IS_NULL,\n\t\t\t\tS.URL_TO, S.URL_FROM, S.MESSAGE, S.MESSAGE_LID,\n\t\t\t\tS.URL_REDIRECT, S.COMMENTS, S.TEST, S.SITE_ID,\n\t\t\t\t" . $DB->DateToCharFunction("S.TIMESTAMP_X") . "\tTIMESTAMP_X,\n\t\t\t\t" . $DB->DateToCharFunction("S.DATE_END") . "\t\tDATE_END,\n\t\t\t\t" . $DB->DateToCharFunction("S.DATE_START") . "\t\tDATE_START,\n\t\t\t\tif ((\n\t\t\t\t\t(S.DATE_START<=now() or S.DATE_START is null) and\n\t\t\t\t\t(S.DATE_END>=now() or S.DATE_END is null) and\n\t\t\t\t\tS.ACTIVE='Y'),\n\t\t\t\t\t'green',\n\t\t\t\t\t'red') as LAMP\n\t\t\tFROM\n\t\t\t\tb_stop_list S\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\t{$strSqlOrder}\n\t\t\tLIMIT " . COption::GetOptionString('statistic', 'RECORDS_LIMIT') . "\n\t\t\t";
     $res = $DB->Query($strSql, false, $err_mess . __LINE__);
     $is_filtered = IsFiltered($strSqlSearch);
     return $res;
 }
Beispiel #6
0
	/**
	 * <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>
	 * &lt;?<br>// отфильтруем только те поисковые фразы<br>// которые искали на сайте с помощью внутреннего поиска<br>$arFilter = array(<br>    "SEARCHER_ID"  =&gt; 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-&gt;Fetch())<br>{<br>    echo "&lt;pre&gt;"; print_r($ar); echo "&lt;/pre&gt;";    <br>}<br>?&gt;<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;
	}
Beispiel #7
0
 function GetList($PARENT_ID = "", $COUNTER_TYPE = "COUNTER_FULL_PATH", &$by, &$order, $arFilter = array(), &$is_filtered)
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     $DB = CDatabase::GetModuleConnection('statistic');
     if ($COUNTER_TYPE != "COUNTER_FULL_PATH") {
         $COUNTER_TYPE = "COUNTER";
     }
     $arSqlSearch = array();
     $strSqlSearch = "";
     $counter = "P." . $COUNTER_TYPE;
     $where_counter = "and P." . $COUNTER_TYPE . ">0";
     if (strlen($PARENT_ID) <= 0 && $COUNTER_TYPE == "COUNTER") {
         $where_parent = "and (P.PARENT_PATH_ID is null or " . $DB->Length("P.PARENT_PATH_ID") . "<=0)";
     } elseif ($COUNTER_TYPE == "COUNTER") {
         $where_parent = "and P.PARENT_PATH_ID = '" . $DB->ForSql($PARENT_ID) . "'";
     }
     if (is_array($arFilter)) {
         if (strlen($arFilter["ADV"]) > 0) {
             $from_adv = " , b_stat_path_adv A ";
             $where_adv = "and A.PATH_ID = P.PATH_ID and A.DATE_STAT = P.DATE_STAT ";
             $ADV_EXIST = "Y";
             if ($arFilter["ADV_DATA_TYPE"] == "B") {
                 $counter = $DB->IsNull("A." . $COUNTER_TYPE . "_BACK", "0");
                 $where_counter = "and " . $counter . ">0";
             } elseif ($arFilter["ADV_DATA_TYPE"] == "P") {
                 $counter = $DB->IsNull("A." . $COUNTER_TYPE, "0");
                 $where_counter = "and " . $counter . ">0";
             } elseif ($arFilter["ADV_DATA_TYPE"] == "S") {
                 $counter = $DB->IsNull("A." . $COUNTER_TYPE, "0") . " + " . $DB->IsNull("A." . $COUNTER_TYPE . "_BACK", "0");
                 $where_counter = "and (" . $counter . ")>0";
             }
         } else {
             $from_adv = "";
             $where_adv = "";
             $ADV_EXIST = "N";
         }
         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 "PATH_ID":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("P.PATH_ID", $val, $match);
                     break;
                 case "DATE1":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "P.DATE_STAT >= " . $DB->CharToDateFunction($val, "SHORT");
                         if ($ADV_EXIST == "Y") {
                             $arSqlSearch[] = "A.DATE_STAT >= " . $DB->CharToDateFunction($val, "SHORT");
                         }
                     }
                     break;
                 case "DATE2":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "P.DATE_STAT < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
                         if ($ADV_EXIST == "Y") {
                             $arSqlSearch[] = "A.DATE_STAT < " . CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1);
                         }
                     }
                     break;
                 case "FIRST_PAGE":
                 case "LAST_PAGE":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("P." . $key, $val, $match, array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "FIRST_PAGE_SITE_ID":
                 case "LAST_PAGE_SITE_ID":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("P." . $key, $val, $match);
                     break;
                 case "FIRST_PAGE_404":
                 case "LAST_PAGE_404":
                     $arSqlSearch[] = $val == "Y" ? "P." . $key . "='Y'" : "P." . $key . "='N'";
                     break;
                 case "PAGE":
                     $arSqlSearch[] = GetFilterQuery("P.PAGES", $val, "Y", array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "PAGE_SITE_ID":
                     $arSqlSearch[] = GetFilterQuery("P.PAGES", "[" . $val . "]", "Y", array("[", "]"));
                     break;
                 case "PAGE_404":
                     $arSqlSearch[] = $val == "Y" ? "P.PAGES like '%ERROR_404:%'" : "P.PAGES not like '%ERROR_404:%'";
                     break;
                 case "ADV":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("A.ADV_ID", $val, $match);
                     break;
                 case "STEPS1":
                     $arSqlSearch[] = "P.STEPS>='" . intval($val) . "'";
                     break;
                 case "STEPS2":
                     $arSqlSearch[] = "P.STEPS<='" . intval($val) . "'";
                     break;
             }
         }
     }
     if ($COUNTER_TYPE == "COUNTER") {
         $select1 = "P.LAST_PAGE, P.LAST_PAGE_404, P.LAST_PAGE_SITE_ID";
     } elseif ($COUNTER_TYPE == "COUNTER_FULL_PATH") {
         $select1 = "P.PAGES";
     }
     $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
     if ($by == "s_last_page" && $COUNTER_TYPE == "COUNTER") {
         $strSqlOrder = "ORDER BY P.LAST_PAGE";
     } elseif ($by == "s_pages" && $COUNTER_TYPE == "COUNTER_FULL_PATH") {
         $strSqlOrder = "ORDER BY P.PAGES";
     } elseif ($by == "s_counter") {
         $strSqlOrder = "ORDER BY COUNTER";
     } else {
         $by = "s_counter";
         $strSqlOrder = "ORDER BY COUNTER desc, " . $select1;
     }
     if ($order != "asc") {
         $strSqlOrder .= " desc ";
         $order = "desc";
     }
     $strSql = "\n\t\t\tSELECT /*TOP*/\n\t\t\t\tP.PATH_ID,\n\t\t\t\t{$select1},\n\t\t\t\tsum({$counter}) as COUNTER\n\t\t\tFROM\n\t\t\t\tb_stat_path P\n\t\t\t\t{$from_adv}\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\t{$where_parent}\n\t\t\t{$where_adv}\n\t\t\t{$where_counter}\n\t\t\tGROUP BY P.PATH_ID, {$select1}\n\t\t\t{$strSqlOrder}\n\t\t";
     $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess . __LINE__);
     $is_filtered = IsFiltered($strSqlSearch);
     return $res;
 }