📊 Конверсии
Всего пользователей: | Показано: | Страница из
| User ID | GCLID | WBRAID | GBRAID | GCLID Start | WBRAID Start | GBRAID Start | AW Tag | Offer | Visit Time | Created At | Цепочка | Стр. | Created At | Устройство |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die('Database connection failed: ' . $e->getMessage()); } // Получаем параметры фильтрации $page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1; $limit = isset($_GET['limit']) ? max(1, min(500, (int)$_GET['limit'])) : 100; $offset = ($page - 1) * $limit; $search = isset($_GET['search']) ? trim($_GET['search']) : ''; $aw_tag_filter = isset($_GET['aw_tag']) ? trim($_GET['aw_tag']) : ''; $offer_filter = isset($_GET['offer_filter']) ? trim($_GET['offer_filter']) : ''; $visit_time_from = isset($_GET['visit_time_from']) ? trim($_GET['visit_time_from']) : ''; $visit_time_to = isset($_GET['visit_time_to']) ? trim($_GET['visit_time_to']) : ''; $creation_date_from = isset($_GET['creation_date_from']) ? trim($_GET['creation_date_from']) : ''; $creation_date_to = isset($_GET['creation_date_to']) ? trim($_GET['creation_date_to']) : ''; // Пагинация с учетом фильтра try { $countQuery = "SELECT COUNT(*) as total FROM page_conversions WHERE 1=1"; $countParams = []; // Фильтр по цепочке страниц if (!empty($search)) { $countQuery .= " AND page_name LIKE ?"; $countParams[] = '%' . $search . '%'; } // Фильтр по AW Tag if (!empty($aw_tag_filter)) { $countQuery .= " AND aw_tag LIKE ?"; $countParams[] = '%' . $aw_tag_filter . '%'; } // Фильтр по Offer if (!empty($offer_filter)) { $countQuery .= " AND offer LIKE ?"; $countParams[] = '%' . $offer_filter . '%'; } // Фильтр по времени визита (от) if (!empty($visit_time_from)) { $countQuery .= " AND visit_time >= ?"; $countParams[] = $visit_time_from; } // Фильтр по времени визита (до) if (!empty($visit_time_to)) { $countQuery .= " AND visit_time <= ?"; $countParams[] = $visit_time_to; } // Фильтр по дате создания (от) if (!empty($creation_date_from)) { $countQuery .= " AND visit_time >= ?"; $countParams[] = $creation_date_from; } // Фильтр по дате создания (до) if (!empty($creation_date_to)) { $countQuery .= " AND visit_time <= ?"; $countParams[] = $creation_date_to . ' 23:59:59'; } $countStmt = $pdo->prepare($countQuery); $countStmt->execute($countParams); $totalUsers = $countStmt->fetch(PDO::FETCH_ASSOC)['total']; } catch (PDOException $e) { die('Error in count query: ' . $e->getMessage()); } $totalPages = max(1, ceil($totalUsers / $limit)); // Получаем данные с пагинацией и фильтрацией try { $dataQuery = " SELECT user_id, gclid, wbraid, gbraid, gclid_start, wbraid_start, gbraid_start, aw_tag, offer, visit_time, created_at, page_name as page_flow, user_agent, (LENGTH(page_name) - LENGTH(REPLACE(page_name, ' → ', ''))) / LENGTH(' → ') + 1 as pages_visited FROM page_conversions WHERE 1=1"; $dataParams = []; // Фильтр по цепочке страниц if (!empty($search)) { $dataQuery .= " AND page_name LIKE ?"; $dataParams[] = '%' . $search . '%'; } // Фильтр по AW Tag if (!empty($aw_tag_filter)) { $dataQuery .= " AND aw_tag LIKE ?"; $dataParams[] = '%' . $aw_tag_filter . '%'; } // Фильтр по Offer if (!empty($offer_filter)) { $dataQuery .= " AND offer LIKE ?"; $dataParams[] = '%' . $offer_filter . '%'; } // Фильтр по времени визита (от) if (!empty($visit_time_from)) { $dataQuery .= " AND visit_time >= ?"; $dataParams[] = $visit_time_from; } // Фильтр по времени визита (до) if (!empty($visit_time_to)) { $dataQuery .= " AND visit_time <= ?"; $dataParams[] = $visit_time_to; } // Фильтр по дате создания (от) if (!empty($creation_date_from)) { $dataQuery .= " AND visit_time >= ?"; $dataParams[] = $creation_date_from; } // Фильтр по дате создания (до) if (!empty($creation_date_to)) { $dataQuery .= " AND visit_time <= ?"; $dataParams[] = $creation_date_to . ' 23:59:59'; } $dataQuery .= " ORDER BY visit_time DESC LIMIT ? OFFSET ?"; $stmt = $pdo->prepare($dataQuery); // Привязываем все параметры фильтрации $paramIndex = 1; foreach ($dataParams as $param) { $stmt->bindValue($paramIndex, $param, PDO::PARAM_STR); $paramIndex++; } // Привязываем LIMIT и OFFSET как целые числа $stmt->bindValue($paramIndex, $limit, PDO::PARAM_INT); $stmt->bindValue($paramIndex + 1, $offset, PDO::PARAM_INT); $stmt->execute(); $conversions = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { die('Error in data query: ' . $e->getMessage()); } // Получаем общую статистику по всем пользователям (не только по текущей странице) try { $totalStmt = $pdo->query(" SELECT COUNT(*) as total_users, COALESCE(SUM((LENGTH(page_name) - LENGTH(REPLACE(page_name, ' → ', ''))) / LENGTH(' → ') + 1), 0) as total_pages_count FROM page_conversions "); $totalStats = $totalStmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { die('Error in total stats query: ' . $e->getMessage()); } // Получаем количество пользователей по категориям try { $categoryStmt = $pdo->query(" SELECT COALESCE(SUM(CASE WHEN (gclid IS NOT NULL AND gclid != '') OR (gclid_start IS NOT NULL AND gclid_start != '') THEN 1 ELSE 0 END), 0) as gclid_users, COALESCE(SUM(CASE WHEN (wbraid IS NOT NULL AND wbraid != '') OR (wbraid_start IS NOT NULL AND wbraid_start != '') THEN 1 ELSE 0 END), 0) as wbraid_users, COALESCE(SUM(CASE WHEN (gbraid IS NOT NULL AND gbraid != '') OR (gbraid_start IS NOT NULL AND gbraid_start != '') THEN 1 ELSE 0 END), 0) as gbraid_users, COALESCE(SUM(CASE WHEN aw_tag IS NOT NULL AND aw_tag != '' THEN 1 ELSE 0 END), 0) as aw_users, COALESCE(SUM(CASE WHEN (gclid IS NULL OR gclid = '') AND (wbraid IS NULL OR wbraid = '') AND (gbraid IS NULL OR gbraid = '') AND (gclid_start IS NULL OR gclid_start = '') AND (wbraid_start IS NULL OR wbraid_start = '') AND (gbraid_start IS NULL OR gbraid_start = '') AND (aw_tag IS NULL OR aw_tag = '') THEN 1 ELSE 0 END), 0) as organic_users FROM page_conversions "); $categoryStats = $categoryStmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { die('Error in category stats query: ' . $e->getMessage()); } $gclid_users = $categoryStats['gclid_users']; $wbraid_users = $categoryStats['wbraid_users']; $gbraid_users = $categoryStats['gbraid_users']; $aw_users = $categoryStats['aw_users']; $organic_users = $categoryStats['organic_users']; $total_users = $totalStats['total_users']; $total_pages_count = $totalStats['total_pages_count']; $avg_pages = $total_users > 0 ? round($total_pages_count / $total_users, 1) : 0; // Функция для форматирования времени для отображения function formatDisplayTime($utcTime) { $datetime = new DateTime($utcTime); $datetime->setTimezone(new DateTimeZone('Europe/Moscow')); return $datetime->format('d.m.Y H:i:s'); } // Функция для форматирования даты для отображения function formatDisplayDate($utcTime) { $datetime = new DateTime($utcTime); $datetime->setTimezone(new DateTimeZone('Europe/Moscow')); return $datetime->format('d.m.Y H:i'); } // Функция для форматирования времени в формате ISO 8601 (для выгрузки) function formatISOTime($utcTime) { $datetime = new DateTime($utcTime); return $datetime->format('c'); // Формат ISO 8601 } // Функция для создания URL с параметрами function buildUrl($params) { $currentParams = $_GET; foreach ($params as $key => $value) { if ($value === null || $value === '') { unset($currentParams[$key]); } else { $currentParams[$key] = $value; } } return '?' . http_build_query($currentParams); } // Функция для получения основного идентификатора для экспорта function getMainIdentifier($conv) { // Проверяем в порядке приоритета: gclid, wbraid, gbraid return $conv['gclid'] ?: ($conv['wbraid'] ?: ($conv['gbraid'] ?: ($conv['gclid_start'] ?: ($conv['wbraid_start'] ?: ($conv['gbraid_start'] ?: ''))))); } // Функция для отображения статуса параметра (есть/нет) function displayParameterStatus($value, $fullValue = null) { $title = $fullValue ?: $value; if (!empty($value)) { return '✓'; } else { return ''; } } // Функция для определения типа устройства по user agent function getDeviceType($userAgent) { if (empty($userAgent)) { return 'Неизвестно'; } // Мобильные устройства if (preg_match('/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/', $userAgent)) { // Проверяем конкретные типы мобильных устройств if (preg_match('/iPhone|iPad|iPod/', $userAgent)) { return 'iOS'; } elseif (preg_match('/Android/', $userAgent)) { return 'Android'; } else { return 'Мобильный'; } } // Планшеты elseif (preg_match('/Tablet|iPad|PlayBook|Kindle/', $userAgent)) { if (preg_match('/iPad/', $userAgent)) { return 'iPad'; } else { return 'Планшет'; } } // Десктопы else { // Определяем операционную систему if (preg_match('/Windows/', $userAgent)) { return 'Windows'; } elseif (preg_match('/Macintosh|Mac OS X/', $userAgent)) { return 'Mac'; } elseif (preg_match('/Linux/', $userAgent)) { return 'Linux'; } else { return 'Десктоп'; } } } // Функция для получения браузера по user agent function getBrowser($userAgent) { if (empty($userAgent)) { return 'Неизвестно'; } if (preg_match('/Chrome/', $userAgent) && !preg_match('/Edge/', $userAgent)) { return 'Chrome'; } elseif (preg_match('/Firefox/', $userAgent)) { return 'Firefox'; } elseif (preg_match('/Safari/', $userAgent) && !preg_match('/Chrome/', $userAgent)) { return 'Safari'; } elseif (preg_match('/Edge/', $userAgent)) { return 'Edge'; } elseif (preg_match('/Opera|OPR/', $userAgent)) { return 'Opera'; } elseif (preg_match('/MSIE|Trident/', $userAgent)) { return 'IE'; } else { return 'Другой'; } } ?>
Всего пользователей: | Показано: | Страница из
| User ID | GCLID | WBRAID | GBRAID | GCLID Start | WBRAID Start | GBRAID Start | AW Tag | Offer | Visit Time | Created At | Цепочка | Стр. | Created At | Устройство |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|