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

Форум PHP

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

 

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

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

тема: "Точка входа" для PowerCounter
 
 автор: Loki   (06.04.2005 в 14:11)   письмо автору
 
 

Загорелся я тут идеей сделать отчет по точке входа. Я это понятие понимаю как "через какую страницу пользователь вошел на сайт". Но вот с алгоритмом у меня пока туго:
нужно сделать запрос к базе, чтобы получить в результате массив первуых страниц, на которую сначала заходили уникальные посетители в пределах одного дня (так как сессий пока нет).
С общей статистикой вопрос можно решить простым циклом, а вот как сделать запрос в пределах одного дня у меня пока придумать не получается.
Можно немного ваших мыслей?

   
 
 автор: cheops   (06.04.2005 в 22:58)   письмо автору
 
   для: Loki   (06.04.2005 в 14:11)
 

Тоже думал в этом направлении, но тут есть небольшая неприятность связанная с тем, что посетители крайне пароноидальные существа, они всеми доступными средствами отключают referer и получается множество точек входа, а ещё есть роботы и менеджеры закачек, которые про referer вообще ничего не знают, т.е. можно за горой точек входа не увидить тех, которые настоящии. Либо вводить какие-то элементы эвристики, но на большом объёме данных в базе... всё выглядит как-то печально... Самый жизнеспособный вариант связан с введением сессий или кукисов - тогда всё будет просто.

   
 
 автор: Loki   (06.04.2005 в 23:50)   письмо автору
 
   для: cheops   (06.04.2005 в 22:58)
 

А я и не предлагаю использовать refferer. Значительно проще использовать ip и временной интервал. Приблизительно то, что у меня сделано в файле pages.php: самое раннее упоминание данного ip за какой-то интервал времени (напр. сутки) - и есть точка входа.

   
 
 автор: cheops   (07.04.2005 в 00:47)   письмо автору
 
   для: Loki   (06.04.2005 в 23:50)
 

А вы хотите найти самые ранние точки IP-адресов и потом разворачивать каждый отдельно... хм... нужно подумать... скорее всего здесь подойдёт GROUP BY по IP-адресу с одновременной соритровкой по дате...

   
 
 автор: Loki   (07.04.2005 в 00:53)   письмо автору
 
   для: cheops   (07.04.2005 в 00:47)
 

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

   
 
 автор: Loki   (07.04.2005 в 08:57)   письмо автору
 
   для: Loki   (07.04.2005 в 00:53)
 

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

   
 
 автор: cheops   (07.04.2005 в 11:17)   письмо автору
 
   для: Loki   (07.04.2005 в 08:57)
 

Не очень понятно, что за повторы: IP-адресов или страниц для этого IP-адреса?

   
 
 автор: Loki   (07.04.2005 в 12:05)   письмо автору
 
   для: cheops   (07.04.2005 в 11:17)
 

итак, есть следующий запрос:

SELECT id_page
FROM 'ip' 
WHERE putdate <= now( ) 
AND putdate > now( ) - INTERVAL 1 
DAY GROUP BY ip
ORDER BY putdate

В результате мы получаем одномерный массив состоящий из идентификаторов страниц, являвшихся точками входа. Мы помещаем этот массив в цикл, который подставляет различные даты (сдвигая запрос на сутки). В результате чего, наш одномерный массив содержит id всех точек входа столько раз, сколько страницы этими точками являлись. Теперь нужно в этом массиве узнать количество одинаковых значений. Как?

   
 
 автор: Loki   (08.04.2005 в 11:46)   письмо автору
 
   для: Loki   (07.04.2005 в 12:05)
 

Так кто-нибудь знает как выяснить количество одинаковых значений в массиве?

   
 
 автор: cheops   (08.04.2005 в 22:11)   письмо автору
 
   для: Loki   (08.04.2005 в 11:46)
 

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

   
 
 автор: Loki   (08.04.2005 в 22:51)   письмо автору
 
   для: cheops   (08.04.2005 в 22:11)
 

Быть может я изначально неправильно подошел к решению вопроса? Как бы вы это делали?

   
 
 автор: cheops   (08.04.2005 в 23:24)   письмо автору
 
   для: Loki   (08.04.2005 в 22:51)
 

Так а что в массиве? Это поддаётся сортировке? Если массив будет отсортирован в порядке скажем убывания
103
103
103
100
99
99
98
98
98
50
50

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

   
 
 автор: Loki   (09.04.2005 в 00:07)   письмо автору
 
   для: cheops   (08.04.2005 в 23:24)
 

Спасибо за идею! Попробую реализовать.

   
 
 автор: Loki   (09.04.2005 в 22:30)   письмо автору
 
   для: Loki   (09.04.2005 в 00:07)
 

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

Перичитал... получилось довольно путано. Поэтому покажу то, что уже получилось.

<?
 $query_points
="SELECT id_page
                     FROM ip
                    WHERE 
                    putdate <= now( ) 
                    AND putdate > now( ) - INTERVAL 1 
                    DAY GROUP BY ip 
                    ORDER BY putdate"
;
        
$pags mysql_query($query_points);
  
//Получаем массив с названиями, id и адресами страниц      
  
$p_n=mysql_query("SELECT * FROM pages");
  
$p_names=mysql_fetch_array($p_n);    
  
//Перегоняем точки входа в отдельный массив (этот массив будет прогоняться столько раз, за сколько суток будет статистика.
 
while($pag mysql_fetch_array($pags))
 {
$pages[]=$pag['id_page'];
 } 
 print 
$pages;
//Считаем количество входов на каждую страницу
$points=array_count_values($pages);    
//Сортируем по количесву входов в обратном порядке
 
arsort($points);  
//Выводим таблицу где будет название страницы и количество заходов через нее
????
?>

Собственно, как быть дальше, мне пока и не придумать.

   
 
 автор: cheops   (10.04.2005 в 00:20)   письмо автору
 
   для: Loki   (09.04.2005 в 22:30)
 

Хм... странно а почему многотабличный запрос не пашет? Вы какой используете?
SELECT ip.id_page AS ip
FROM ip, pages 
WHERE 
ip.putdate <= now( ) AND
ip.putdate > now( ) - INTERVAL 1 DAY AND
ip.id_page = pages.id_page
GROUP BY ip.ip 
ORDER BY ip.putdate

   
 
 автор: Loki   (10.04.2005 в 17:24)   письмо автору
 
   для: cheops   (10.04.2005 в 00:20)
 

Многотабличный запрос работает отлично, но потом его не обсчитать стандартными средствами. Вот я и хочу попробовать не городить огород:)

   
 
 автор: Loki   (10.04.2005 в 21:03)   письмо автору
 
   для: Loki   (10.04.2005 в 17:24)
 

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

   
 
 автор: Loki   (14.04.2005 в 08:52)   письмо автору
 
   для: Loki   (07.04.2005 в 12:05)
 

Что-то не так с моим sql запросом... если явно указать ip, то запрос обрабатывается нормально, а если использовать в том виде как он изображен выше - попадают страницы которые не являются первыми для данного ip.
Нид хелп!

   
 
 автор: cheops   (14.04.2005 в 11:27)   письмо автору
 
   для: Loki   (14.04.2005 в 08:52)
 

Хм... а насколько я понял - он же извлекает только первые страницы, а потом мы восстанавливаем все остальные по этому IP-адресу?

   
 
 автор: Loki   (14.04.2005 в 11:39)   письмо автору
 
   для: cheops   (14.04.2005 в 11:27)
 

Задумано было следующим образом: выбираем все посещенные за день страницы, группируем их по ip и сортируем по порядку для каждого ip. Затем берем только самую раннюю страницу для каждого ip. Вот только что-то работет не так...
Как мне кажется, страницы сначала сортируются, а затем группируются...

   
 
 автор: cheops   (14.04.2005 в 11:57)   письмо автору
 
   для: Loki   (14.04.2005 в 11:39)
 

А может вот как поступить, сначала сгруппировать IP - поместить их во временную таблицу, а её уже сортировать и выводить результаты из неё, примерно так как это описывается в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=3389? По большому счёту разбить запрос на два.

   
 
 автор: Loki   (14.04.2005 в 13:43)   письмо автору
 
   для: cheops   (14.04.2005 в 11:57)
 

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

   
 
 автор: Loki   (15.04.2005 в 11:16)   письмо автору
 
   для: cheops   (14.04.2005 в 11:57)
 

Подправил немного запрос

 $query_points="SELECT id_page, min( putdate ) AS date
 FROM ip
WHERE 
$tmp1 
$tmp2 
GROUP BY ip"; 

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

   
 
 автор: Loki   (15.04.2005 в 12:08)   письмо автору
 
   для: Loki   (15.04.2005 в 11:16)
 

Сделал точку входа и точку выхода. Выношу на суд зрителей:)

   
 
 автор: Loki   (07.04.2005 в 12:07)   письмо автору
 
   для: cheops   (07.04.2005 в 11:17)
 

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

   
 
 автор: Loki   (13.04.2005 в 18:06)   письмо автору
 
   для: Loki   (07.04.2005 в 12:07)
 

дубль

   
 
 автор: Loki   (13.04.2005 в 18:08)   письмо автору
 
   для: Loki   (07.04.2005 в 12:07)
 

Сегодня поймал отчет на ошибке... Как ее ловить пока не представляю:(

   
 
 автор: Олег   (15.04.2005 в 15:16)   письмо автору
 
   для: Loki   (13.04.2005 в 18:08)
 

как сделаете "Точки входа" выложите плиз в DOWNLOADS :)

   
 
 автор: Loki   (15.04.2005 в 15:37)   письмо автору
 
   для: Олег   (15.04.2005 в 15:16)
 

Можете скачать ее четырьмя постами выше, а выкладывать или нет - решают хозяева ресурса:)

   
 
 автор: cheops   (15.04.2005 в 23:05)   письмо автору
 
   для: Loki   (15.04.2005 в 15:37)
 

Классная штука и обязательно войдёт в состав PowerCounter, только я пока в раздумьях вводить постраничную навигацию или нет, с постраничной навигацией вроде как теряется обзор, а без неё вроде как слишком длиная страница...

   
 
 автор: Loki   (15.04.2005 в 23:33)   письмо автору
 
   для: cheops   (15.04.2005 в 23:05)
 

Думаю, это имеет смысл прикрутить. Правда, мне пока не нужна, но я - частный случай.
Cheops, очень надеюсь что вы посоветуете как вывести и нулевые позиции тоже.

   
 
 автор: cheops   (16.04.2005 в 11:40)   письмо автору
 
   для: Loki   (15.04.2005 в 23:33)
 

А имеет ли смысл нулевые позиции прикручивать? Вроде как информации от них не много...

   
 
 автор: Loki   (16.04.2005 в 16:04)   письмо автору
 
   для: cheops   (16.04.2005 в 11:40)
 

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

   
 
 автор: cheops   (16.04.2005 в 22:53)   письмо автору
 
   для: Loki   (16.04.2005 в 16:04)
 

Ну вообще-то может быть... просто не все страницы предназначены для захода из вне... хм... вообще можно запомнить первичные ключи страниц, которые входят в статистику "точек входа", создать их список и запросить из page все значения которые не входят в этот список
SELECT * FROM pages WHERE id_page NOT IN (1,12,34,45,67,89,45)

А вот этот (1,12,34,45,67,89,45) формировать в цикле
<?php
  
//Перегоняем точки входа в отдельный массив (этот массив будет прогоняться столько раз, за сколько суток будет статистика.
 
while($pag mysql_fetch_array($pags))
     {
      
$pages[]=$pag['id_page'];
     }
   }
?>

А лучше уже после сортировки - оно так побыстрее искаться будет.

   
 
 автор: Loki   (17.04.2005 в 01:22)   письмо автору
 
   для: cheops   (16.04.2005 в 22:53)
 

На самом деле, это первое решение, которое пришло мне в голову. Просто я до последнего пытался избежать дополнительного запроса к БД. Вообще насколько данное стремение опревдано? Например, был простой вариант реализации, когда каждая новая строка отчеты вызывалась своим sql запросом, но мне показалось, что это слишком варварский подход:)
Надо ли при написании программ стараться снижать количество запросов к базе? Или наоборот лучше выполнить максимум операций средствами mysql, так как они должны работать быстрее php?

   
 
 автор: cheops   (17.04.2005 в 01:33)   письмо автору
 
   для: Loki   (17.04.2005 в 01:22)
 

Подход может и варварский, но если он не приводит к увеличению времени исполнения скрипта больее 10 минут он вполне приемлем, так как цель может быть только одна - реализация задачи. Если ничего подходящего в голову не лезет, нужно использовать первый подходящий варинант, так как может статься, что он лимититрующая стадия расположена совсем в другом месте и вы только зря тратите время вылизыва код здесь. SQL-запросы работают быстрее PHP, но вызов всё-равно производится PHP и тут теряется время. Хотя повторюсь кромолы в том, что выполняется большое число SQL-запросов в цикле нет, так как иногда это единственное приемлемое решение, особенно в случае MySQL, где полноценные вложенные запросы появились только в версии 4.1, а она ещё не получила широкое распространение на хостингах.

   
 
 автор: Loki   (17.04.2005 в 23:19)   письмо автору
 
   для: cheops   (17.04.2005 в 01:33)
 

Доделал току входа (нулевые позиции + кое-какая косметика) и добавил в count.php проверку и по адресу и по названию - надеюсь, будет работать корректно.
Вообще возникла мысль: ведь на основании соотношения входов/выходов можно вычислять рейтинг "интересности" содержания страницы:) Правда, для этого придется очень сильно переписать отчет... может потом и возьмусь:)

   
 
 автор: cheops   (17.04.2005 в 23:38)   письмо автору
 
   для: Loki   (17.04.2005 в 23:19)
 

Ага, интегрировал в рабочую версию.

PS Если будете ещё писать посты - заведите плиз ещё одну тему, а то эта уже очень длинная не удобно с ней работать.

   
 
 автор: Loki   (19.04.2005 в 17:17)   письмо автору
 
   для: cheops   (17.04.2005 в 23:38)
 

Продолжение темы
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3502&page=1

   
Rambler's Top100
вверх

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