Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Про PowerImage 1.0 для PowerCounter
 
 автор: tuder   (09.06.2006 в 09:20)   письмо автору
 
 

Появилась возможность выводить на страничке результаты счётчика PowerCounter в графическом или текстовом виде. Образец можно посмотреть на нижеуказанном урле.
Там же исходники и пояснения, что нужно подправить в PowerCounter 3.3.6
Кроме появилась возможность задавать тайм-аут для повторного засчитывания уникальных хостов. Чтобы 20 подряд сделанных обновлений страниц не увеличивал бы общий счётчик посещений. Исходники счётчика с картинками прикреплены к данному сообщению.

Надеюсь, что авторы PowerCounter включат эти возможности в очередную версию PowerCounter.
Хотелось бы ещё иметь возможность использовать один счётчик для нескольких сайтов. Для этого в базы надо ввести поле для id сайта. И вызывать подсчёт
"Для того, чтобы страница на сайте учитывалась счётчиком необходимо в начало этой страницы включить файл count.php и указать id сайта:
<?php
$site_id=1;
require_once("count.php");
?>

После чего в статистике можно бы было просматривать информацию также с учётом любого сайта.
Сейчас же приходится для каждого сайта на хостинге ставить свою копию PowerCounter. Кроме того, при доступной единственной базе - нужно для каждой копии делать таблицы с отличающимися именами и соответственно вносить все эти изменения в исходники.

   
 
 автор: Loki   (09.06.2006 в 11:57)   письмо автору
 
   для: tuder   (09.06.2006 в 09:20)
 

Симпатичная штука получилась... только пара непонятностей:
если вы все равно проверяете количество строк, то зачем использовать count(putdate)?
Ну и вообще меня эта функция смущает: мне, например, интересно проследить каким путем пользователь перемещался по сайту. Но для таких как я, есть значение 0:)
И по поводу графического счетчика: почему такой странный подбор данных? посетители и хиты за сегодня - понятно, а третий - хиты за все время... или это чтобы больше казалось?:)

   
 
 автор: tuder   (09.06.2006 в 13:20)   письмо автору
 
   для: Loki   (09.06.2006 в 11:57)
 

1. После перехода на новый метод с тайм-аутом может быть несколько записей попадающих под этот интервал. Вот я их и считаю. Чтобы не искать последнюю запись и пр.
Возможно можно логику и улучшить.
2. Если страница изменится, то такая запись будет занесена в базу. Там проверяется на $id_page. Если изменилось, то засчитается. Не заносится лишь только для этой же страницы.
3. Подбор данных вроде стандартный для подобных счётчиков. hotlog, spylog.
И отражает из админки по PowerCounter

Сегодня За всё время
Засчитанные хосты 8 15
Хосты 8 15
Засчитанные хиты 22 54
Хиты 22 54

Вот в текстовом это и показывается. А в графическом вроде как
Засчитанные хиты всего 54
Засчитанные хосты всего 15
Засчитанные хосты сегодня 8

   
 
 автор: Loki   (09.06.2006 в 13:41)   письмо автору
 
   для: tuder   (09.06.2006 в 13:20)
 

В том-то и дело, что количество записей вы запрашиваете, но нигде не проверяете. Кроме того, если ваш код работает (а с виду это так:), то этот проверочный запрос всегда будет возвращать единицу (в том случае, когда вообще будет что-то возвращать). Так что count тут совершенно лишний.

Мне казалось, что обычно на счетчиках выводят именно общее количество посетителей... но я могу ошибаться.

   
 
 автор: tuder   (09.06.2006 в 14:06)   письмо автору
 
   для: Loki   (09.06.2006 в 13:41)
 

Почему не проверяю?

Делается запрос.

$query = "SELECT count(putdate) FROM 'system_ip' WHERE 'ip'=INET_ATON('$ip') and 'browsers'='$browser' and 'systems'='$os' and 'id_page'='$id_page' and ((UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( 'putdate' ) ) < $timeout)";

Результат запроса (количество совпадений за тайм-аут) заносится в переменную $last

list($last)=mysql_fetch_row(mysql_query($query));

Если их нет - идёт запись в базу.
if ($last==0)

И работает ведь это. :) Попробуйте на той странице пообновлять - счётчик добавлятся не будет.
А насчёт, что показывается, вот:
http://hotlog.ru/counter_code.php
Например: "количество ПОСЕТИТЕЛЕЙ /всего +сегодня/)", а там ещё и "количество ХИТОВ, ХОСТОВ, ПОСЕТИТЕЛЕЙ /сегодня и всего/)"

И вот аналог сводной таблицы
http://viewstat.hotlog.ru/site_stat.php?id=172248

Только в PowerCounter несколько другая терминалогия.
Хорошо бы её сопоставить с этим.
Я так понимаю: хит - это сколько раз "дёрнули" счётчик.
Хост - это уникальные ип.
Посетитель - это уникальный пользователь с хоста со своим бровзером и оперционкой, как имнимум.

   
 
 автор: Loki   (09.06.2006 в 14:42)   письмо автору
 
   для: tuder   (09.06.2006 в 14:06)
 

>Почему не проверяю?
Вы проверяете только количество возвращенных запросом строк, а значение COUNT(*) вы не проверяете.


>со своим бровзером и оперционкой. То-есть если я в течение дня зайду под тремя броузерами, то меня посчитает как трех посетителей? на мой взгляд, это неправильно. С другой стороны, и противоположные аргументы можно привести:)

   
 
 автор: tuder   (09.06.2006 в 15:33)   письмо автору
 
   для: Loki   (09.06.2006 в 14:42)
 

1. Может я что-то не понимаю? Или про разное говорим?
У меня, во-первых, count(putdate), а не count(*). Если где-то count(*) - это не моё. :-)

Во-вторых, count(putdate) - всегда, если я грубо не ошибаюсь, вернёт _одну_ строку. А в ней одно значение COUNT - количество записей подходящих под условие. Вот это значение и заношу в переменную $last.

2. Да, за трёх. А кто из приверженцев ИЕ, пойдёт на какаой-то сайт Оперой?
И наоборот. А если пойдёт, то этот факт будет зарегистрирован.
Можно, конечно, ещё и разрешение экрана и пр...

Но я исхожу из возможностей PowerCounter. Какие данные доступны, теми и оперирую.

   
 
 автор: Loki   (09.06.2006 в 16:20)   письмо автору
 
   для: tuder   (09.06.2006 в 15:33)
 

1. прошу прощения, я mysql_fetch_row прочел как mysql_num_rows. Отсюда и непонимание:)

2. Ну некоторые несознательные программы открывают по ссылке не броузер по умолчанию, а тот, который им больше нравится:)
Например, The Bat у меня открывает MyIE, если не открыта опера... а QIP так и вообще IE несмотря ни на что... очень раздражает это:)

   
 
 автор: tuder   (13.06.2006 в 14:05)   письмо автору
 
   для: Loki   (09.06.2006 в 16:20)
 

У меня и Бат и Кип открывают в Опере, может потому как она по умолчанию бровзером выставлена?..
Но в любом случае другой бровзер - это повод занести это в базу для статистики и засчитать хит.
Непонятки с терминологией. Хиты - это просмотры страниц, хосты - посетители? Мне, честно говоря, не понятно, что есть хит/хост просо так и засчитанный. Всё равно же
засчитываются и показываются и те и другие. Лучше уж так и писать, чем краткое объяснение на тестовой страничке.

Прошёлся ещё по исходникам PowerCounter, результаты на http://files.byte.nsk.su/test/
Переименовал и перенёс второй config.php (о наличии двух файлов с одинаковыми именами задаваля в форуме вопрос), перенёс документацию в отдельную папку.
Кстати, а зачем в admin/image лежат файлы button2.gif imgmenu.gif ? Нигде в исходниках не нашёл упоминание о них.

Собственно всё исправленные исходники в выложенном архиве. Можно скачать и поверх распаковать. Вроде всё работоспособно. Все изменения не повлияют на старые данные. Можно внести изменения в документацию и выложить версию 3.6.7 :-) Дополнительный файл графического счётчика - базируется на том, что сделано. Его отсутствие в "дистрибутиве" ничего не меняет. Можно туда и не включать.

   
 
 автор: Loki   (13.06.2006 в 17:01)   письмо автору
 
   для: tuder   (13.06.2006 в 14:05)
 

Совсем забыл про эту тему:)
Я вспомнил что мне не понравилось: даже если я выставляю значение таймаута 0, то запрос к БД все равно происходит:)
Надо бы условие перед ним ввести:)

   
 
 автор: tuder   (14.06.2006 в 07:21)   письмо автору
 
   для: Loki   (13.06.2006 в 17:01)
 

Так всё ж в ваших руках. :)) Я передаю сделанное тому, кто может внести эти и любые другие изменение и выложить новую версию PowerCounter, который делается "при активном участии Левина А.В. (loki_angel@mail.ru, http://alna.spb.ru), который буквально вдохнул в него вторую жизнь."

А так - вставил проверку.

Мне во тоже не нравится, что в count.php дублируется кусок из config.php

  $tbl_ip       = 'system_ip';                // Для совместимости с 2.9 перименовать в ip
  $tbl_pages    = 'system_pages';             // Для совместимости с 2.9 перименовать в pages
  $tbl_refferer = 'system_refferer';          // Для совместимости с 2.9 перименовать в refferer
  $tbl_searchquerys = 'system_searchquerys';  // Для совместимости с 2.9 перименовать в searchquerys

А также установка соединения с базой. Этого можно было бы избежать, просто подключив config.php. Правда, теперь это потребует довольно бьольшой правки кода в разных модулях.

Кстати, совсем свежее сообщение в форуме с просьбой сделать возможность использовать один счётчик для разных сайтов.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=19180&page=1
Когда на хостинге выложены несколько сайтов/доменов, но доступна одна лишь база. }{м, однако про это я уже подробно писал...

   
 
 автор: Loki   (14.06.2006 в 10:15)   письмо автору
 
   для: tuder   (14.06.2006 в 07:21)
 

>не нравится, что в count.php дублируется кусок
он не дублируется. count.php вполне самостоятельный код, который занимается сбором информации. А ее анализом у меня занимаются две разные версии счетчика.

>но доступна одна лишь база
именно для этих целей в третьей версии названия всех таблиц вынесены из кода в настройки: в одну базу можно пихать счетчики пока на сервере место не кончится:)

Графическое отображение обязательно прикрутим, только надо будет немного переделать - не нравится мне что код светит расположение счетчика. Надо будет вынести в корень.

PS Функция add_blank произвела на меня неизгладимое впечатление!:) Сильно порадовался что символов всего 10:) Предлагаю переписать как-то так:
<?
  
function add_blank($count)
        {
         return 
substr("         ".$count, -10);
        }

   
 
 автор: tuder   (14.06.2006 в 10:58)   письмо автору
 
   для: Loki   (14.06.2006 в 10:15)
 

1. То есть count.php можно использовать без всего остального? Но всё-равно ему нужен нынешний admin/dbconfig.php
Почему бы тогда там же не положить и opendb.php?
Где opendb.php примерно такого содержания

<?php
  
// Подключиться к mysql
   
@dl('mysql.so');

  
// Устанавливаем соединение с базой данных
  
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
  if (!
$dbcnx) {
   echo( 
"<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
   exit();
  }
  
// Выбираем базу данных
  
if (! @mysql_select_db($dbname,$dbcnx) ) {
    echo( 
"<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
    exit();
  }
?>


И использовать эти два файла и для count.php и для анализа.

2. То есть плодить в базе таблицы? И для каждого сайта класть свой count.php и config.php с разными именами этих таблиц? Это не есть удобно.
Достаточно для всех баз (а может даже не для всех) добавить поле id_site и вызывать
count.php?id=id_site
Добавить базу system_id_site содержашую поля
id_site - числовой идентификатор
url - имя сайта для которого будет работать счётчик
hit_max
hit_today
host_max
host_today
password

тогда для графического счётчика можно будет дёргать только эту базу
cntimg.php?id=id_site&color=red
Что значительно снизит нагрузку по запросам к базе. :)

И анализ делать также для конкретного id_site добавив ко всем выборкам это условие.
При этом при наличии пароля статистика будет доступна по паролю, при отсутствии - любому.

P.S. А я и писал: "Вывод графического(текстового) счётчика сделан по образцу SR Total Counter 1.1 by Sad Raven" - его я никак не оптимизировал. Просто скрестил ужа с ёжиком. :)

Исправил.

   
 
 автор: Loki   (14.06.2006 в 11:37)   письмо автору
 
   для: tuder   (14.06.2006 в 10:58)
 

1. Нет. У файла count.php свой собственный блок кода для коннекта к базе. Вы, конечно, правы - удобнее держать один модуль, но так как проект некоммерческий, то пишу в большой степени под свои нужды. А мне удобнее чтобы система сбора статистики и ее анализа не пересекались. В этом случае могу курочить систему анализа прямо по живому:)

>Это не есть удобно
Не знаю для кого это неудобно: для БД удобно. Для разработчика - удобно... есть недовольные?:)

   
 
 автор: tuder   (14.06.2006 в 12:52)   письмо автору
 
   для: Loki   (14.06.2006 в 11:37)
 

Никак нет. :-)
Просто люблю универсальность. Когда один модуль можно использовать во многих местах.

   
 
 автор: tuder   (23.08.2006 в 14:39)   письмо автору
 
   для: Loki   (14.06.2006 в 11:37)
 

>проект некоммерческий, то пишу в большой степени под свои нужды. А мне удобнее чтобы система сбора статистики и ее анализа не пересекались. В этом случае могу курочить систему анализа прямо по живому:)

А всё-таки получается, что эти системы пересекаются. Нигде в описании/документации не оговорено, что требуется ежедневно запускать анализ собранной статистики. Понятно, что написано под свои нужды и постоянно проводится анализ и запуск статистики.

Но сам count.php, имеющий "свой собственный блок кода для коннекта к базе" - не производит указанных действий: "Теперь полная информация сохраняется лишь
за сутки, после чего она подвергается сжатию и помещается в суточные архивные
таблицы. По прошествии недели информация сжимается в недельные таблицы, а по
прошествию месяца в месячные таблицы. Разумеется вся информация, которая не
требуется для выведения отчётов удаляется."


И если система анализа не запускалась,то в "суточной таблице" будет накапливаться и накапливаться данные.

Тем более сейчас уже, это не суточная, а месячная таблица? Но каким образом всё же хранится и архивируется информация - не понятно.
Согласно приведённым дампам - часть потеряна, часть занесена в архивы раньше времени.

Потэтому надо бы или поправить описания, либо доработать алгоритм архивизации при нерегулярном запуске программы анализа.

   
 
 автор: Loki   (23.08.2006 в 18:00)   письмо автору
 
   для: tuder   (23.08.2006 в 14:39)
 

>Потэтому надо
Кому надо и почему "поэтому"?
Если вы взяли фрагмент чужого кода, не смогли в нем разобраться и он,как следствие, не работет так, как вам хочется, то из этого, еще ничего не следует.

   
 
 автор: tuder   (24.08.2006 в 06:33)   письмо автору
 
   для: Loki   (23.08.2006 в 18:00)
 

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

Поэтому я и пытаюсь получить комментарии и разъяснения от авторов этого кода, чтобы разобраться в логике работы.

Но когда я читаю в инструкции одну информацию:
полная информация сохраняется лишь
за сутки, после чего она подвергается сжатию и помещается в суточные архивные
таблицы.

В форуме вижу другой ответ: В таблице ip данные хранятся за последний месяц.

При этом вижу в этой таблице данные за прошлый месяц, а в архивной - частично за текущий.
Я тут теряюсь в попытке понять логику.

При этом, я использую стандартную, родную функция выбора данных из баз, чтобы получить: статистика кроме сегодняшнего дня берется из архивной таблицы, а текущие сутки из таблицы ip.

Но меня "обвиняют" в том, что: Значит что-то вы напутали и берете данные только из архивной таблицы.

Кроме этого, я пытаюсь выяснить, что будет, если анализ статистики запускать не каждый день, когда полная информация сохраняется лишь за сутки, после чего она подвергается сжатию?
Что если запускать анализ 2-3 раза в месяц? При таком условии можете ли уверенно заявлять: Так что никаких потеряных данных нет?

Или всё же требуется выполнять некие действия ежедневно, для корректной архивации данных? Иначе как можно объяснить по прежнему сохраняющиеся данные в текущей базе за прошлый месяц? И отсутствия их в архивной таблице?

Я это уже задаю вопросы непосредственно по работе PowerCounter, вне связи с моим приложением.

   
 
 автор: tuder   (15.06.2006 в 12:14)   письмо автору
 
   для: Loki   (14.06.2006 в 10:15)
 

>А ее анализом у меня >занимаются две разные версии счетчика.
>
>>но доступна одна лишь база
>именно для этих целей в третьей версии названия всех таблиц
>вынесены из кода в настройки: в одну базу можно пихать
>счетчики пока на сервере место не кончится:)
>

Если "поместить имя страницы в переменной $titlepage, в отчётах системы, данная страница будет участвовать под этим именем. Более того, вы можете объединять несколько страниц в одну строку, присваивая им одинаковые названия.

<?php
     $titlepage 
"Название страницы";
   require_once(
"count.php");
?>

Можно ли таким образом задавать анализ только для указанной страницы?

   
 
 автор: Loki   (15.06.2006 в 16:36)   письмо автору
 
   для: tuder   (15.06.2006 в 12:14)
 

Непонял вопроса

   
 
 автор: tuder   (18.08.2006 в 11:51)   письмо автору
 
   для: Loki   (15.06.2006 в 16:36)
 

Несколько вопросов по PowerCounter в разрезе PowerImage. Чисто академический интерес.

1) В базу system_ip, я так понимаю, counter.php заносит в поле browsers информацию.
Когда бровзер отдаёт такую строку:
Opera/7.23 (Windows NT 5.1; U) [ru]
явно учитывается, что это Опера. Если же
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50
то заносится Mozilla? Но это уже некорректный подсчёт. :-(
Лучше уж писать полный ответ.

2) Что подсчитывается/меняется, какая обработка баз происходит при запуске pcounter/admin ?
Дело в том, что count.php заносит все хиты в базу.
Некоторое время PowerImage их выдёргивает и отображает правильно. 400-420-450-500-505
Потом вдруг замечаю, что уже продолжительное время счётчик показывает 505. Через пару дней вообще 504. :-( )

Захожу в админку, смотрю статистику хитов/хостов - 526. Хм, тут же обновляю страничку с графическим баннером - всё, там тоже 526.
Теперь снова некоторое время будет подсчитываться и отображаться правильно.

Но ведь сами пишете:
> мне удобнее чтобы система сбора статистики и ее анализа не пересекались.

А выходит, что собранную статистику нельзя корректно использовать "не обработав" её анализом.

3) Нельзя ли всё-таки внести предложенные мною изменения, чтобы я снёс эту страничку?
http://www.files.byte.nsk.su/test/
И выпустить 3.3.7 - это займёт не более получаса времени.

   
 
 автор: cheops   (18.08.2006 в 12:27)   письмо автору
 
   для: tuder   (18.08.2006 в 11:51)
 

> 1. Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50
>то заносится Mozilla? Но это уже некорректный подсчёт. :-(
Нет это не так, в этом случае в базу ложиться Opera.

2. Не очень понятно, если честно.

   
 
 автор: tuder   (21.08.2006 в 07:56)   письмо автору
 
   для: cheops   (18.08.2006 в 12:27)
 

count.php заносит данный в базы.

Когда заходишь в админку, для просмотра статистики, для просмотра хитов используется модуль hits.php

Как, я писал на свой страничке, из этого модуля я выдернул кусок и положил в отдельный файл: functioncounter.php, подключив его обратно к hits.php через include()


<?
  
///////////////////////////////////////////////////
  // Система учёта посещаемости сайта - PowerCounter
  // 2003-2006 (C) IT-студия SoftTime (http://www.softtime.ru)
  // Поддержка: http://www.softtime.ru/forum/
  // Симдянов И.В. (simdyanov@softtime.ru)
  // Кузнецов М.В. (kuznetsov@softtime.ru)
  // Голышев С.В. (softtime@softtime.ru)
  // Левин А.В. (loki_angel@mail.ru)
  ///////////////////////////////////////////////////
// Функция возвращает массив из трёх переменных:
// количество хостов,
// количество засчитанных хитов и
// общее количества хитов.
// $begin - число дней, которое необходимо вычесть из текущей даты,
// для того чтобы получить начальную точку временного интервала
// $end - число дней, которое необходимо вычесть из текущей даты,
// для того чтобы получить конечную точку воменного интервала
// $id_user - первичный ключ записи таблицы users, соответствующий
// текущему сайту
// $tbl_ip - название таблицы, в которой хранятся IP-адреса
// $tbl_arch_hits - название архивной таблицы

//отсюда и ниже исправления от 11.02.06
function show_ip_host_today($tbl_ip)                                                              //изменено 11.02.06 Loki
{

    
// Запрос на статистику за текущий неархивированный день
    
$tmp1 "putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL 1 DAY";

    
// Общее число хитов
    
$query_hit_total "SELECT COUNT(*)
                        FROM 
$tbl_ip
                        WHERE "
.$tmp1;
    
// Засчитанные хиты
    
$query_hit       "SELECT COUNT(*)
                        FROM 
$tbl_ip
                        WHERE systems!='none' AND
                              systems NOT LIKE 'robot_%' AND "
.$tmp1;   //изменено 14.02 Loki
    // Подсчитываем число IP-адресов (хостов)
    
$query_host_total"SELECT COUNT(DISTINCT ip)
                        FROM 
$tbl_ip
                        WHERE "
.$tmp1;
    
// Подсчитываем число уникальных посетителей за сутки
    
$query_host   "SELECT COUNT(DISTINCT ip)
                        FROM 
$tbl_ip
                        WHERE systems!='none' AND
                              systems NOT LIKE 'robot_%' AND "
.$tmp1;   //изменено 14.02 Loki

    // Осуществляем запросы к базе данных
    
$tot_hit mysql_query($query_hit_total);
    if(!
$tot_hit) exit(mysql_error());
    
$uni_hit mysql_query($query_hit);
    if(!
$uni_hit) exit(mysql_error());
    
$tot_hst mysql_query($query_host_total);
    if(!
$tot_hst) exit(mysql_error());
    
$uni_hst mysql_query($query_host);
    if(!
$uni_hst) exit(mysql_error());

    
// Если запросы выполнениы удачно,
    // получаем результат за текущие сутки
    
$hits_total_today  mysql_result($tot_hit0);
    
$hits_today        mysql_result($uni_hit0);
    
$hosts_total_today mysql_result($tot_hst0);
    
$hosts_today       mysql_result($uni_hst0);

  return array(
$hits_total_today$hits_today$hosts_total_today$hosts_today);
}
function 
show_ip_host($begin$end$tbl_arch_hits$tbl_arch_hits_month)                                 //изменено 11.02.06 Loki
{
  
// Обнуляем хиты и хосты
  
$hosts_total 0;
  
$hosts       0;
  
$hits_total  0;
  
$hits        0;

  
/////////////////////////////////////////////////////////////////////////////
  // Исходим из таблицы соответствия
  //            begin end
  // сегодня      1    0  - это извлекаем из $tbl_ip  //этот фрагмент исключен 11.02.06  Loki
  // вчера        2    1  - это извлекаем из $tbl_arch_hits
  // неделя       7    0  - это извлекаем из $tbl_arch_hits
  // месяц       30    0  - это извлекаем из $tbl_arch_hits
  // всё время    0    0  - это извлекаем из $tbl_arch_hits
  /////////////////////////////////////////////////////////////////////////////


  // Если требуемый интервал затрагивает дни, упакованные в архивную таблицу
  // плюс ко всему извлекаем информацию из архивной таблицы $tbl_arch_hits
  
if($begin != && $begin != 0)
  {
    
// Запрос на статистику за временной интервал определяемый
    // параметрами $begin,$end
    
if($end != 0$tmp1 "putdate < DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '".($end 1)."' DAY";
    else 
$tmp1 "putdate < DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '$end' DAY";
    if(
$begin == 0$tmp2 "";
    else 
$tmp2 " AND putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '".($begin 1)."' DAY";

    
// Общее число хитов
    
$query_hit_total "SELECT SUM(hits_total)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;
    
// Засчитанные хиты
    
$query_hit       "SELECT SUM(hits)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;
    
// Подсчитываем число IP-адресов (хостов)
    
$query_host_total"SELECT SUM(hosts_total)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;
    
// Подсчитываем число уникальных посетителей за сутки
    
$query_host   "SELECT SUM(host)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;

    
// Осуществляем запросы к базе данных
    
$tot_hit mysql_query($query_hit_total);
    if(!
$tot_hit) exit(mysql_error());
    
$uni_hit mysql_query($query_hit);
    if(!
$uni_hit) exit(mysql_error());
    
$tot_hst mysql_query($query_host_total);
    if(!
$tot_hst) exit(mysql_error());
    
$uni_hst mysql_query($query_host);
    if(!
$uni_hst) exit(mysql_error());

    
// Если запросы выполнениы удачно,
    // получаем результат
    
$hits_total  += mysql_result($tot_hit0);
    
$hits        += mysql_result($uni_hit0);
    
$hosts_total += mysql_result($tot_hst0);
    
$hosts       += mysql_result($uni_hst0);
  }

  
// Если требуемый интервал затрагивает дни, упакованные в месячную архивную таблицу
  // плюс ко всему извлекаем информацию из архивной таблицы $tbl_arch_hits_month
  
if($begin == && $end == 0)
  {
    
// Запрос на статистику за временной интервал определяемый
    // параметрами $begin,$end
    
$tmp1 "putdate < DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '$end' DAY";
    
$tmp2 "";

    
// Общее число хитов
    
$query_hit_total "SELECT SUM(hits_total)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;
    
// Засчитанные хиты
    
$query_hit       "SELECT SUM(hits)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;
    
// Подсчитываем число IP-адресов (хостов)
    
$query_host_total"SELECT SUM(hosts_total)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;
    
// Подсчитываем число уникальных посетителей за сутки
    
$query_host   "SELECT SUM(host)
                        FROM 
$tbl_arch_hits
                        WHERE "
.$tmp1.$tmp2;

    
// Осуществляем запросы к базе данных
    
$tot_hit mysql_query($query_hit_total);
    if(!
$tot_hit) exit(mysql_error());
    
$uni_hit mysql_query($query_hit);
    if(!
$uni_hit) exit(mysql_error());
    
$tot_hst mysql_query($query_host_total);
    if(!
$tot_hst) exit(mysql_error());
    
$uni_hst mysql_query($query_host);
    if(!
$uni_hst) exit(mysql_error());

    
// Если запросы выполнениы удачно,
    // получаем результат
    
$hits_total  += mysql_result($tot_hit0);
    
$hits        += mysql_result($uni_hit0);
    
$hosts_total += mysql_result($tot_hst0);
    
$hosts       += mysql_result($uni_hst0);

    
// Получаем самое старое число из таблицы $tbl_arch_hits,
    // всё, что позже берём из таблицы $tbl_arch_hits_month
    
$select "SELECT UNIX_TIMESTAMP(MIN(putdate)) AS data FROM $tbl_arch_hits";
    
$dat mysql_query($select);
    if(!
$dat) exit("month ".mysql_error());
    if(
mysql_num_rows($dat) > 0)
    {
      
$last_date mysql_result($dat0);
      
$tmp1 "putdate < '".date("Y-m-01 23:59:59"$last_date)."'";
      
$tmp2 "";

      
// Общее число хитов
      
$query_hit_total "SELECT SUM(hits_total)
                          FROM 
$tbl_arch_hits_month
                          WHERE "
.$tmp1.$tmp2;
      
// Засчитанные хиты
      
$query_hit       "SELECT SUM(hits)
                          FROM 
$tbl_arch_hits_month
                          WHERE "
.$tmp1.$tmp2;
      
// Подсчитываем число IP-адресов (хостов)
      
$query_host_total"SELECT SUM(hosts_total)
                          FROM 
$tbl_arch_hits_month
                          WHERE "
.$tmp1.$tmp2;
      
// Подсчитываем число уникальных посетителей за сутки
      
$query_host   "SELECT SUM(host)
                          FROM 
$tbl_arch_hits_month
                          WHERE "
.$tmp1.$tmp2;

      
// Осуществляем запросы к базе данных
      
$tot_hit mysql_query($query_hit_total);
      if(!
$tot_hit) exit(mysql_error());
      
$uni_hit mysql_query($query_hit);
      if(!
$uni_hit) exit(mysql_error());
      
$tot_hst mysql_query($query_host_total);
      if(!
$tot_hst) exit(mysql_error());
      
$uni_hst mysql_query($query_host);
      if(!
$uni_hst) exit(mysql_error());

      
// Если запросы выполнениы удачно,
      // получаем результат
      
$hits_total  += mysql_result($tot_hit0);
      
$hits        += mysql_result($uni_hit0);
      
$hosts_total += mysql_result($tot_hst0);
      
$hosts       += mysql_result($uni_hst0);
    }
  }
  
// Возвращаем результат
  
return array($hits_total$hits$hosts_total$hosts);
}
?>



Этот вновь полученный модуль я использую в своём PowerImage для извлечения из баз (зачем городить своё, если есть готовое?) трёх переменных:
// Функция возвращает массив из трёх переменных:
// количество хостов,
// количество засчитанных хитов и
// общее количества хитов.


После чего я генерирую картинку, где и вывожу эти три числа.
На текущий момент это

Просмотров всего: 527
Просмотров сегодня: 0
Посетителей всего: 411
Уникальных посетителей сегодня: 0


Никакие обновления старнички не помогают "выдернуть" из базы новые значения.
Но если я сейчас зайду на просмотр стастистики, то, во-первых, выижу, что сегодня уже было посещение 2006-08-21 06:48:57 и тут же обновляю страничку со своим примером: вижу

Просмотров всего: 536
Просмотров сегодня: 0
Посетителей всего: 420
Уникальных посетителей сегодня: 0


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

Вот и хотелось бы провентилировать, что именно там может происходить? Чтобы мне не зарываться в чужой код, может это известно и лежит на поверхности.
Я понимаю, что базы и программа не предназначалась для использования баз вне собственной системы показа статистики. Но почему бы не предположить, что пользователям захочется воспользоваться результатами работы непосредственно самого счётчика count.php, без обращения к вашей системе статистики? А делая запрос непосредственно к базам и выводя только нужную информацию.

Могу ли я рассказать про ситуацию ещё как-то более подробно?

   
 
 автор: Loki   (21.08.2006 в 10:10)   письмо автору
 
   для: tuder   (21.08.2006 в 07:56)
 

Значит что-то вы напутали и берете данные только из архивной таблицы.

   
 
 автор: tuder   (21.08.2006 в 11:12)   письмо автору
 
   для: Loki   (21.08.2006 в 10:10)
 

Вот кусок кода, делающий выборку и использующий те функции. Символ в символ с аналогичным куском из hits.php, исключая убранные комментарии и исправленную опечатку.

  //запрашиваем данные за текущие сутки
  list($hits_total[0],
       $hits[0],
                 $hosts_total[0],
                 $hosts[0])=show_ip_host_today($tbl_ip);
  //запрашиваем данные за вчерашние сутки
    list($hits_total[1],
         $hits[1],
         $hosts_total[1],
         $hosts[1]) = show_ip_host($time[1]['begin'],
                                    $time[1]['end'],
                                    $tbl_arch_hits,
                                    $tbl_arch_hits_month);
  // запрашиваем данные за остальные периоды и
  // прибавляем к ним данные за текущие сутки
  for($i=2; $i<5; $i++)
  {
    list($hits_total[$i],
         $hits[$i],
         $hosts_total[$i],
         $hosts[$i]) = show_ip_host($time[$i]['begin'],
                                    $time[$i]['end'],
                                    $tbl_arch_hits,
                                    $tbl_arch_hits_month);
         $hits_total[$i]        +=$hits_total[0];
         $hits[$i]                      +=$hits[0];
    $hosts_total[$i]    +=$hosts_total[0];
    $hosts[$i]                  +=$hosts[0];
  }


Если в hits.php написано
//запрашиваем данные за текущие сутки
то я считаю, что так оно и есть. И запрашивается именно из текущей базы.
//запрашиваем данные за вчерашние сутки
Это запрашивается из архивной
// запрашиваем данные за остальные периоды и
// прибавляем к ним данные за текущие сутки
как и это.
Вопрос. В какой момент происходит сброс в архив? Когда заходишь в админку/статистику. Так?
Да. Вот оно. Далеко запрятано. В admin/index.php стоит

  // Включаем заголовок страницы
  include "topcounter.php";

Казалось бы чего безобиднее, всего лишь заголовок. Но там

  // Устанавливаем соединение с базой данных
  require_once("config.php");
  require_once("archive.php");

Что такое archive.php? О! Это же как раз архивация.

    ///////////////////////////////////////////////////
    // Архивируем информацию в ежедневные таблицы
    ///////////////////////////////////////////////////


Поразмыслив, я теперь предполагаю, что функция show_ip_host_today($tbl_ip)
берёт из system_ip, по умолчанию, данные именно за текущую дату. Не трогая данные за предыдущие даты. Но эти данные ещё не сброшены в архив, так как админку никто не запускал.
В результате получается, что ни в текущей, ни в архивных базах не берётся данные за предыдущие, необработанные числа.
Да, выходит, что так оно и есть. Вот где собака порылась! :-)

    // Запрос на статистику за текущий неархивированный день
    $tmp1 = "putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL 1 DAY";


Спрашивается, зачем здесь ограничивать текущим неархивным днём, если при заходе в статистику всегда, однозначно, будет производится архивация данных? То есть их уже здесь не будет.
НО! А вот если по какой-то причине архивация не произошла, то всё, эти данные учитываться не будут вообще. Так как в архивных их нет, а из текущих они не берутся.

>Значит что-то вы напутали и берете данные только из архивной таблицы.
Так что ошибка - это у вас в логике программы. :-Ъ
Прийдётся править функцию, для работы с PowerImage.

   
 
 автор: tuder   (21.08.2006 в 12:56)   письмо автору
 
   для: Loki   (21.08.2006 в 10:10)
 

Кстати, нормальное ли это явление, что в system_ip, при такой статистике

<b>Засчитанные хосты
5 2 21 130 373
Хосты
6 2 23 141 425
Засчитанные хиты
5 2 24 155 520
Хиты
6 2 25 161 541</b>

находятся данные ещё за прошлый месяц? См. прикреплённый дамп базы.
Если я меняю в функции запрос

    // Запрос на статистику за текущий неархивированный день
//    $tmp1 = "putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL 1 DAY";
    $tmp1= "TRUE";


То статистика резко меняется.

<b>Засчитанные хосты
121 2 137 246 489
Хосты
127 2 144 262 546
Засчитанные хиты
150 2 169 300 665
Хиты
163 2 182 318 698</b>

Это как раз выявляются "потерянные" хиты. Правда, все потерянные теперь попадают в "Сегодня", но общее количество-то становится реальным.

   
 
 автор: Loki   (21.08.2006 в 13:44)   письмо автору
 
   для: tuder   (21.08.2006 в 12:56)
 

Вся статистика кроме сегодняшнего дня берется из архивной таблицы, а текущие сутки из таблицы ip. В таблице ip данные хранятся за последний месяц. Так что никаких потеряных данных нет.

   
 
 автор: tuder   (22.08.2006 в 07:32)   письмо автору
 
   для: Loki   (21.08.2006 в 13:44)
 

Прикреплённый дамп смотрели?

Цитирую:


INSERT INTO `system_ip` VALUES("420", "1355377803", "2006-07-22 21:15:17", "6", "opera", "windows");
INSERT INTO `system_ip` VALUES("421", "1432330303", "2006-07-22 21:25:01", "2", "firefox", "windows");
INSERT INTO `system_ip` VALUES("422", "3639556744", "2006-07-23 17:57:14", "2", "msie", "windows");
INSERT INTO `system_ip` VALUES("423", "1360216614", "2006-07-24 07:10:33", "6", "msie", "robot_rambler");
INSERT INTO `system_ip` VALUES("424", "3272364970", "2006-07-24 15:48:53", "2", "msie", "windows");
INSERT INTO `system_ip` VALUES("425", "1209958676", "2006-07-24 21:44:53", "5", "mozilla", "none");
INSERT INTO `system_ip` VALUES("426", "3558934598", "2006-07-25 13:55:57", "6", "firefox", "windows");
INSERT INTO `system_ip` VALUES("427", "1439330645", "2006-07-25 19:30:01", "2", "mozilla", "windows");


Это за какой месяц данные в system_ip ?

А вот информация из system_arch_ip - смотрим по порядковым номерам записей...


INSERT INTO `system_arch_ip` VALUES("364", "2006-07-30 23:59:59", "1359298561", "1");
INSERT INTO `system_arch_ip` VALUES("365", "2006-07-30 23:59:59", "2112504245", "1");
INSERT INTO `system_arch_ip` VALUES("366", "2006-07-30 23:59:59", "3274603020", "1");
INSERT INTO `system_arch_ip` VALUES("367", "2006-07-30 23:59:59", "1049457425", "1");
INSERT INTO `system_arch_ip` VALUES("368", "2006-08-01 23:59:59", "1374850558", "1");
INSERT INTO `system_arch_ip` VALUES("369", "2006-08-01 23:59:59", "1209950858", "1");
INSERT INTO `system_arch_ip` VALUES("370", "2006-08-01 23:59:59", "1415450191", "1");
INSERT INTO `system_arch_ip` VALUES("371", "2006-08-02 23:59:59", "1370506090", "1");
INSERT INTO `system_arch_ip` VALUES("372", "2006-08-02 23:59:59", "1049457504", "1");
INSERT INTO `system_arch_ip` VALUES("373", "2006-08-02 23:59:59", "1433580451", "1");
INSERT INTO `system_arch_ip` VALUES("374", "2006-08-02 23:59:59", "1408042406", "1");
INSERT INTO `system_arch_ip` VALUES("375", "2006-08-02 23:59:59", "1439330645", "1");
INSERT INTO `system_arch_ip` VALUES("376", "2006-08-02 23:59:59", "1047068778", "1");
INSERT INTO `system_arch_ip` VALUES("377", "2006-08-03 23:59:59", "1406897237", "2");
INSERT INTO `system_arch_ip` VALUES("378", "2006-08-03 23:59:59", "3282142825", "1");
INSERT INTO `system_arch_ip` VALUES("379", "2006-08-03 23:59:59", "1370506090", "1");
INSERT INTO `system_arch_ip` VALUES("380", "2006-08-03 23:59:59", "1369809302", "1");
INSERT INTO `system_arch_ip` VALUES("381", "2006-08-03 23:59:59", "1360216585", "1");
INSERT INTO `system_arch_ip` VALUES("382", "2006-08-03 23:59:59", "3582071925", "1");
INSERT INTO `system_arch_ip` VALUES("383", "2006-08-04 23:59:59", "1374983517", "1");
INSERT INTO `system_arch_ip` VALUES("384", "2006-08-04 23:59:59", "3562210002", "1");
INSERT INTO `system_arch_ip` VALUES("385", "2006-08-04 23:59:59", "3642185765", "1");
INSERT INTO `system_arch_ip` VALUES("386", "2006-08-04 23:59:59", "1427093229", "1");
INSERT INTO `system_arch_ip` VALUES("387", "2006-08-05 23:59:59", "1415538283", "1");
INSERT INTO `system_arch_ip` VALUES("388", "2006-08-06 23:59:59", "1408103942", "1");
INSERT INTO `system_arch_ip` VALUES("389", "2006-08-06 23:59:59", "3416260903", "1");
INSERT INTO `system_arch_ip` VALUES("390", "2006-08-07 23:59:59", "2887090793", "1");
INSERT INTO `system_arch_ip` VALUES("391", "2006-08-08 23:59:59", "1433695746", "1");
INSERT INTO `system_arch_ip` VALUES("392", "2006-08-09 23:59:59", "1360216614", "1");
INSERT INTO `system_arch_ip` VALUES("393", "2006-08-09 23:59:59", "3264186620", "1");
INSERT INTO `system_arch_ip` VALUES("394", "2006-08-09 23:59:59", "1439330645", "1");
INSERT INTO `system_arch_ip` VALUES("395", "2006-08-09 23:59:59", "1464093996", "1");
INSERT INTO `system_arch_ip` VALUES("396", "2006-08-11 23:59:59", "1374981438", "1");
INSERT INTO `system_arch_ip` VALUES("397", "2006-08-12 23:59:59", "1347958488", "1");
INSERT INTO `system_arch_ip` VALUES("398", "2006-08-12 23:59:59", "1209950858", "1");
INSERT INTO `system_arch_ip` VALUES("399", "2006-08-12 23:59:59", "1374979581", "1");
INSERT INTO `system_arch_ip` VALUES("400", "2006-08-13 23:59:59", "1374979581", "1");
INSERT INTO `system_arch_ip` VALUES("401", "2006-08-13 23:59:59", "1431872140", "1");
INSERT INTO `system_arch_ip` VALUES("402", "2006-08-14 23:59:59", "2112504501", "1");
INSERT INTO `system_arch_ip` VALUES("403", "2006-08-15 23:59:59", "1425147488", "1");
INSERT INTO `system_arch_ip` VALUES("404", "2006-08-15 23:59:59", "1439330645", "1");
INSERT INTO `system_arch_ip` VALUES("405", "2006-08-15 23:59:59", "1370506090", "1");
INSERT INTO `system_arch_ip` VALUES("406", "2006-08-16 23:59:59", "3377426402", "1");
INSERT INTO `system_arch_ip` VALUES("407", "2006-08-16 23:59:59", "1047373624", "1");
INSERT INTO `system_arch_ip` VALUES("408", "2006-08-16 23:59:59", "1441366273", "1");
INSERT INTO `system_arch_ip` VALUES("409", "2006-08-17 23:59:59", "3251358235", "3");
INSERT INTO `system_arch_ip` VALUES("410", "2006-08-17 23:59:59", "1415493506", "1");
INSERT INTO `system_arch_ip` VALUES("411", "2006-08-18 23:59:59", "1422672499", "1");
INSERT INTO `system_arch_ip` VALUES("412", "2006-08-18 23:59:59", "1051013542", "1");
INSERT INTO `system_arch_ip` VALUES("413", "2006-08-18 23:59:59", "3286948982", "1");
INSERT INTO `system_arch_ip` VALUES("414", "2006-08-18 23:59:59", "1346825253", "1");
INSERT INTO `system_arch_ip` VALUES("415", "2006-08-18 23:59:59", "1408098457", "1");
INSERT INTO `system_arch_ip` VALUES("416", "2006-08-19 23:59:59", "3648409353", "1");
INSERT INTO `system_arch_ip` VALUES("417", "2006-08-19 23:59:59", "1435360158", "1");
INSERT INTO `system_arch_ip` VALUES("418", "2006-08-20 23:59:59", "1446619534", "1");
INSERT INTO `system_arch_ip` VALUES("419", "2006-08-20 23:59:59", "1435360192", "1");

   
 
 автор: @ndry   (13.06.2006 в 15:48)   письмо автору
 
   для: tuder   (09.06.2006 в 09:20)
 

Я использовал стандартные функии Power Counter, которые используються при отображении страницы "Хосты и хиты"

   
 
 автор: tuder   (14.06.2006 в 07:03)   письмо автору
 
   для: @ndry   (13.06.2006 в 15:48)
 

? Для чего использовал?

Из hits.php ? Так и я их же. Только выдрал в отдельный файл.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования