Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
kir55rus
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 12
1

Структура таблиц для статистики сайта

19.10.2013, 09:41. Просмотров 1162. Ответов 3
Метки нет (Все метки)

Здравствуйте

Сайтом пользуются N человек ( 10<N<500 )
Каждый из них может создать по 1-100 потоков для приема трафика
Нужно отслеживать статистику по этим потокам по след.пунктам:
-хиты
-просмотры
-уникальный клики по ссылке http://site.ru/go/123
-все клики по этой ссылке
-источники трафика

С первыми 4-мя проблем не возникло. Создал 2 таблицы для этого:
Код
--
-- Структура таблицы `ips`
--

CREATE TABLE IF NOT EXISTS `ips` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_flow` int(11) NOT NULL,
  `type` int(1) NOT NULL,
  `ip` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Структура таблицы `stats`
--

CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_flow` int(11) NOT NULL,
  `date` date NOT NULL,
  `views` int(11) NOT NULL,
  `hits` int(11) NOT NULL,
  `a_clicks` int(11) NOT NULL,
  `u_clicks` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Исходник счетчика:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//Статистика
 
$date = date("Y-m-d");
$ip = sprintf('%u', ip2long($_SERVER["REMOTE_ADDR"]));
$id_flow = $GLOBALS['id_flow'];
$id_go = $GLOBALS['id_go'];
 
/*
В БД поле `type` обозначает тип статистики:
0 - просмотры/хиты
1 - клики
*/
 
//Если это переход на целевую страницу
if($id_go){
    
    //Запрашиваем статистику за сегодняшнее число для данного потока
    $s_res = xsql("SELECT `id` FROM `stats` WHERE `date`='". $date ."' AND `id_flow`=". $id_flow);
    
    //Если данных нет, то это первый посетитель за сегодня. Чистим вчерашние Ip и создаем запись для сегодняшнего дня
    if(mysql_num_rows($s_res) == 0){
        xsql("DELETE FROM `ips` WHERE `id_flow`=". $id_flow);
        
        xsql("INSERT INTO `stats` (`id_flow`, `date`, `views`, `hits`, `a_clicks`, `u_clicks`) VALUES (". $id_flow .", '". $date ."', 1, 1, 1, 1)");
        xsql("INSERT INTO `ips` (`id_flow`, `type`, `ip`) VALUES (". $id_flow .", 1, ". $ip .")");
        
    }else{ //Если уже есть ячейка для сегодняшнего дня, обновляем ее
        
        $s_row = mysql_fetch_assoc($s_res);
        
        //Если это уникальный клик
        $sip_res = xsql("SELECT `id` FROM `ips` WHERE `ip`=". $ip ." AND `id_flow`=". $id_flow ." AND `type`=1");
        if(mysql_num_rows($sip_res) == 0){
            
            //Прибавляем +1 к уникальным и не уникальным кликам
            xsql("UPDATE `stats` SET `a_clicks`=`a_clicks`+1, `u_clicks`=`u_clicks`+1 WHERE `id`=". $s_row['id']);
            
            //Заносим ip в базу данных
            xsql("INSERT INTO `ips` (`id_flow`, `type`, `ip`) VALUES (". $id_flow .", 1, ". $ip .")");
        }else{//Если это не уникальный клик
            
            //Прибаляем +1 к не уникальным кликам
            xsql("UPDATE `stats` SET `a_clicks`=`a_clicks`+1 WHERE `id`=". $s_row['id']);
        }
        
    }
    
    
}else{ //Если просмотр страницы приема трафика
    
    //Запрашиваем статистику за сегодняшнее число для данного потока
    $s_res = xsql("SELECT `id` FROM `stats` WHERE `date`='". $date ."' AND `id_flow`=". $id_flow);
    
    //Если данных нет, то это первый посетитель за сегодня. Чистим вчерашние Ip и создаем запись для сегодняшнего дня
    if(mysql_num_rows($s_res) == 0){
        xsql("DELETE FROM `ips` WHERE `id_flow`=". $id_flow);
        
        xsql("INSERT INTO `stats` (`id_flow`, `date`, `views`, `hits`, `a_clicks`, `u_clicks`) VALUES (". $id_flow .", '". $date ."', 1, 1, 0, 0)");
        xsql("INSERT INTO `ips` (`id_flow`, `type`, `ip`) VALUES (". $id_flow .", 0, ". $ip .")");
        
    }else{ //Если уже есть ячейка для сегодняшнего дня, обновляем ее
        
        $s_row = mysql_fetch_assoc($s_res);
        
        //Если Это уникальный посетитель
        $sip_res = xsql("SELECT `id` FROM `ips` WHERE `ip`=". $ip ." AND `id_flow`=". $id_flow ." AND `type`=0");
        if(mysql_num_rows($sip_res) == 0){
            
            //Прибавляем +1 к просмотру и хиту
            xsql("UPDATE `stats` SET `views`=`views`+1, `hits`=`hits`+1 WHERE `id`=". $s_row['id']);
            
            //Заносим ip в базу данных
            xsql("INSERT INTO `ips` (`id_flow`, `type`, `ip`) VALUES (". $id_flow .", 0, ". $ip .")");
        }else{//Если это не уникальный посетитель
            
            //Прибаляем +1 к просмотрам
            xsql("UPDATE `stats` SET `views`=`views`+1 WHERE `id`=". $s_row['id']);
        }
        
    }
    
    
}
Этот код инклудится в скрипт отдачи страниц для приема трафика (Его содержимое не важно. За исключением 2-х моментов: $id_flow - поток трафика, который создает юзер, $id_go используется для того, чтобы отличить переход на целевую страницу от просмотра одностраничника)


Вот так собирается стата по просмотрам и кликам. Ее можно сортировать по дате (Например, просмотреть статистику с 1 по 20 числа)

Теперь вопрос. Как лучше прикрутить сюда сортировку по сайтам-источникам? Статистику по ним нужно будет сортировать по дням (Посмотреть, сколько с источника было уникальных посетителей, сколько кликов по ссылке за определенный срок). То есть, должны собираться первые 4 параметра!

Была такая идея:
Изменить таблицу stats, а именно добавить поле source
В этом поле будет храниться в формате json массив:
Array(
'Site1.ru' => array( 'views' => 20, 'hits' => 10, 'a_clicks' => 5, 'u_clicks' => 2),
'Site2.ru' => array( 'views' => 30, 'hits' => 20, 'a_clicks' => 6, 'u_clicks' => 4),
...
)
И каждый раз, при обновлении статистики, обновлять этот массив.
Алгоритм:
PHP
1
2
3
4
5
6
 $sources = json_decode($row['source'], true);
/* увеличение значений
Например, $sources[$utm_content]['views']++; 
*/
$sources = json_encode($sources);
//обновление записи в бд
Но боюсь, что это даст большую нагрузку на сервер (каждый раз преобразовывать из json в массив и обратно)


В общем, как нужно сконструировать таблицы в бд для моих целей? Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2013, 09:41
Ответы с готовыми решениями:

Структура таблиц(ы)
Есть &quot;Название книги&quot; и &quot;Автор&quot;. Предложите структуру таблиц(ы) как хранить?...

структура сайта
Здравствуйте. Решил написать сайт по следующей технологии: вначале...

Структура сайта (Ядро)
Когда я искал решение для реализации ЧПУ для сайта, мне дали ссылку на сайт....

Скрипт для статистики
Здравствуйте, при регистрации введу статистику за каждые сутки новых...

Логика построения для статистики
Доброго вечера, товарищи. Нужен совет. Собираюсь для страниц клиентов (коих...

3
sqlnub
Заблокирован
19.10.2013, 15:59 2
Во-первых это php и базы данных, а не php и трафик. В котором полагаю редкий читатель разбирается. Ну, например если в рубрике по JS я задам вопрос как написать скрипт для ФШ, меня там никто не поймет. Потому что надо предмет знать. Учет трафика - он самый. В абстрактных терминах БД излагайте.

Во-вторых ничего не понимая в предмете все равно мне подозрительно что так много запросов соседствует. Это может быть признаком неправильной организации связей, или полного их отсутствия.

БД, конечно, изображается бочками, типа хранилища, но главная фишка в реляциях. Если их нет, то нафиг вообще БД - пишите свои логи в файл.
0
kir55rus
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 12
20.10.2013, 08:57  [ТС] 3
Цитата Сообщение от sqlnub Посмотреть сообщение
Во-первых это php и базы данных, а не php и трафик. В котором полагаю редкий читатель разбирается. Ну, например если в рубрике по JS я задам вопрос как написать скрипт для ФШ, меня там никто не поймет. Потому что надо предмет знать. Учет трафика - он самый. В абстрактных терминах БД излагайте.
Здравствуйте
Внимательнее читайте сообщение. Трафик тут дело второстепенное. Я попросил подсказать, как должна выглядеть таблица в базе данных для моих целей
Я задал вопрос, привел пример своей реализации (но она не полная, потому что не знаю, как лучше сделать дальше) и попросил помощи. Попросил, чтобы мне подсказали, как лучше построить таблицу(ы)

Именно поэтому считаю, что тема должна быть в этом разделе форума
Скрипт на php, вопрос по таблицам в базе данных. Название раздела - "PHP и базы данных". Все идеально подходит


Цитата Сообщение от sqlnub Посмотреть сообщение
Во-вторых ничего не понимая в предмете все равно мне подозрительно что так много запросов соседствует. Это может быть признаком неправильной организации связей, или полного их отсутствия.

БД, конечно, изображается бочками, типа хранилища, но главная фишка в реляциях. Если их нет, то нафиг вообще БД - пишите свои логи в файл.
Для этого и спрашивал, чтобы показали пример таблиц для данной цели
0
sqlnub
Заблокирован
20.10.2013, 11:29 4
Цитата Сообщение от kir55rus Посмотреть сообщение
Для этого и спрашивал, чтобы показали пример таблиц для данной цели
Все еще не заметно что нет ответов по вашей данной цели? Потому что она очень специфична и чтобы оценить варианты надо разбираться именно в ней самой, а не в БД.

Ну хорошо, хоть одна связь у вас там есть?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 11:29

Структура сайта. Как лучше сделать?
Всем Привет! Ситуация в следующем: Имеем: Фирма, Продавец, Клиент, Товар....

Лог файл в денвере для статистики посещаемости
Всем привет! Решил написать скрипт для статистики посещаемости Web-сервера,...

Какая должна быть структура сайта(каталоги, их названия, название файлов), что бы было понятно другим
Если можно краткий обзор, заметил, что это очень влияет на легко читаемость...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru