|
|
|
| Загорелся я тут идеей сделать отчет по точке входа. Я это понятие понимаю как "через какую страницу пользователь вошел на сайт". Но вот с алгоритмом у меня пока туго:
нужно сделать запрос к базе, чтобы получить в результате массив первуых страниц, на которую сначала заходили уникальные посетители в пределах одного дня (так как сессий пока нет).
С общей статистикой вопрос можно решить простым циклом, а вот как сделать запрос в пределах одного дня у меня пока придумать не получается.
Можно немного ваших мыслей? | |
|
|
|
|
|
|
|
для: Loki
(06.04.2005 в 14:11)
| | Тоже думал в этом направлении, но тут есть небольшая неприятность связанная с тем, что посетители крайне пароноидальные существа, они всеми доступными средствами отключают referer и получается множество точек входа, а ещё есть роботы и менеджеры закачек, которые про referer вообще ничего не знают, т.е. можно за горой точек входа не увидить тех, которые настоящии. Либо вводить какие-то элементы эвристики, но на большом объёме данных в базе... всё выглядит как-то печально... Самый жизнеспособный вариант связан с введением сессий или кукисов - тогда всё будет просто. | |
|
|
|
|
|
|
|
для: cheops
(06.04.2005 в 22:58)
| | А я и не предлагаю использовать refferer. Значительно проще использовать ip и временной интервал. Приблизительно то, что у меня сделано в файле pages.php: самое раннее упоминание данного ip за какой-то интервал времени (напр. сутки) - и есть точка входа. | |
|
|
|
|
|
|
|
для: Loki
(06.04.2005 в 23:50)
| | А вы хотите найти самые ранние точки IP-адресов и потом разворачивать каждый отдельно... хм... нужно подумать... скорее всего здесь подойдёт GROUP BY по IP-адресу с одновременной соритровкой по дате... | |
|
|
|
|
|
|
|
для: cheops
(07.04.2005 в 00:47)
| | ...и все это заключить в цикл по количеству дней. В общем, вроде идея сформировалась. Пошел на поиски граблей:) | |
|
|
|
|
|
|
|
для: Loki
(07.04.2005 в 00:53)
| | Собственно, сразу появился затык: предположим, сделали выборку за первые сутки, получили массив значений id страниц (причем, значения могут повторяться). Нужно выяснить количество повторов для каждого значения. Как это сделать? | |
|
|
|
|
|
|
|
для: Loki
(07.04.2005 в 08:57)
| | Не очень понятно, что за повторы: IP-адресов или страниц для этого IP-адреса? | |
|
|
|
|
|
|
|
для: 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
(07.04.2005 в 12:05)
| | Так кто-нибудь знает как выяснить количество одинаковых значений в массиве? | |
|
|
|
|
|
|
|
для: Loki
(08.04.2005 в 11:46)
| | Ну можно перебрать, а что в массиве, дело в том, что есть такая функция для строки - она выясняет число вхождений букв в строку. | |
|
|
|
|
|
|
|
для: cheops
(08.04.2005 в 22:11)
| | Быть может я изначально неправильно подошел к решению вопроса? Как бы вы это делали? | |
|
|
|
|
|
|
|
для: Loki
(08.04.2005 в 22:51)
| | Так а что в массиве? Это поддаётся сортировке? Если массив будет отсортирован в порядке скажем убывания
103
103
103
100
99
99
98
98
98
50
50
|
То уж больно просто считать, в цикле прогнать массив и смотреть за сменой значения, создавая параллельно массив в качестве ключей которого выступают цифры 103, 100, 99 и т.д., а в качестве значений - число вхождений? | |
|
|
|
|
|
|
|
для: cheops
(08.04.2005 в 23:24)
| | Спасибо за идею! Попробую реализовать. | |
|
|
|
|
|
|
|
для: 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);
//Выводим таблицу где будет название страницы и количество заходов через нее
????
?>
|
Собственно, как быть дальше, мне пока и не придумать. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(10.04.2005 в 00:20)
| | Многотабличный запрос работает отлично, но потом его не обсчитать стандартными средствами. Вот я и хочу попробовать не городить огород:) | |
|
|
|
|
|
|
|
для: Loki
(10.04.2005 в 17:24)
| | В общем, написал я модуль - тестируйте.
Еще хотелось бы сделать чтобы выводились в конце списка страницы с нулевым рейтингом, но те варианты решения которые уже я придумал какие-то не вполне человеческие... | |
|
|
|
|
|
|
|
для: Loki
(07.04.2005 в 12:05)
| | Что-то не так с моим sql запросом... если явно указать ip, то запрос обрабатывается нормально, а если использовать в том виде как он изображен выше - попадают страницы которые не являются первыми для данного ip.
Нид хелп! | |
|
|
|
|
|
|
|
для: Loki
(14.04.2005 в 08:52)
| | Хм... а насколько я понял - он же извлекает только первые страницы, а потом мы восстанавливаем все остальные по этому IP-адресу? | |
|
|
|
|
|
|
|
для: cheops
(14.04.2005 в 11:27)
| | Задумано было следующим образом: выбираем все посещенные за день страницы, группируем их по ip и сортируем по порядку для каждого ip. Затем берем только самую раннюю страницу для каждого ip. Вот только что-то работет не так...
Как мне кажется, страницы сначала сортируются, а затем группируются... | |
|
|
|
|
|
|
|
для: Loki
(14.04.2005 в 11:39)
| | А может вот как поступить, сначала сгруппировать IP - поместить их во временную таблицу, а её уже сортировать и выводить результаты из неё, примерно так как это описывается в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=3389? По большому счёту разбить запрос на два. | |
|
|
|
|
|
|
|
для: cheops
(14.04.2005 в 11:57)
| | Признаться, не совсем понимаю что мы при этом получим: получится таблица состоящая из уникальных ip и одного id_page страницы для каждого ip. Так собственно задача и состоит в том, чтобы выбрать это правильное id_page.
Быть может чуть более развернуто опишете алгоритм? | |
|
|
|
|
|
|
|
для: 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 в 11:16)
| | Сделал точку входа и точку выхода. Выношу на суд зрителей:) | |
|
|
|
|
|
|
|
для: cheops
(07.04.2005 в 11:17)
| | Кстати, неплохо бы ввести статистику по поисковым запросам. Для этого, наверное, надо создать еще одну таблицу. | |
|
|
|
|
|
|
|
для: Loki
(07.04.2005 в 12:07)
| | дубль | |
|
|
|
|
|
|
|
для: Loki
(07.04.2005 в 12:07)
| | Сегодня поймал отчет на ошибке... Как ее ловить пока не представляю:( | |
|
|
|
|
|
|
|
для: Loki
(13.04.2005 в 18:08)
| | как сделаете "Точки входа" выложите плиз в DOWNLOADS :) | |
|
|
|
|
|
|
|
для: Олег
(15.04.2005 в 15:16)
| | Можете скачать ее четырьмя постами выше, а выкладывать или нет - решают хозяева ресурса:) | |
|
|
|
|
|
|
|
для: Loki
(15.04.2005 в 15:37)
| | Классная штука и обязательно войдёт в состав PowerCounter, только я пока в раздумьях вводить постраничную навигацию или нет, с постраничной навигацией вроде как теряется обзор, а без неё вроде как слишком длиная страница... | |
|
|
|
|
|
|
|
для: cheops
(15.04.2005 в 23:05)
| | Думаю, это имеет смысл прикрутить. Правда, мне пока не нужна, но я - частный случай.
Cheops, очень надеюсь что вы посоветуете как вывести и нулевые позиции тоже. | |
|
|
|
|
|
|
|
для: Loki
(15.04.2005 в 23:33)
| | А имеет ли смысл нулевые позиции прикручивать? Вроде как информации от них не много... | |
|
|
|
|
|
|
|
для: cheops
(16.04.2005 в 11:40)
| | Как раз нулевые - важнее топовых: с топовыми все ясно - тема хорошоя, ключевые слова привильные, народ - валит. А вот то что внизу списка требует доработки всего вышеперечисленного.
Или вы как-то иначе трактуете получаемую информацию? | |
|
|
|
|
|
|
|
для: 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'];
}
}
?>
|
А лучше уже после сортировки - оно так побыстрее искаться будет. | |
|
|
|
|
|
|
|
для: cheops
(16.04.2005 в 22:53)
| | На самом деле, это первое решение, которое пришло мне в голову. Просто я до последнего пытался избежать дополнительного запроса к БД. Вообще насколько данное стремение опревдано? Например, был простой вариант реализации, когда каждая новая строка отчеты вызывалась своим sql запросом, но мне показалось, что это слишком варварский подход:)
Надо ли при написании программ стараться снижать количество запросов к базе? Или наоборот лучше выполнить максимум операций средствами mysql, так как они должны работать быстрее php? | |
|
|
|
|
|
|
|
для: Loki
(17.04.2005 в 01:22)
| | Подход может и варварский, но если он не приводит к увеличению времени исполнения скрипта больее 10 минут он вполне приемлем, так как цель может быть только одна - реализация задачи. Если ничего подходящего в голову не лезет, нужно использовать первый подходящий варинант, так как может статься, что он лимититрующая стадия расположена совсем в другом месте и вы только зря тратите время вылизыва код здесь. SQL-запросы работают быстрее PHP, но вызов всё-равно производится PHP и тут теряется время. Хотя повторюсь кромолы в том, что выполняется большое число SQL-запросов в цикле нет, так как иногда это единственное приемлемое решение, особенно в случае MySQL, где полноценные вложенные запросы появились только в версии 4.1, а она ещё не получила широкое распространение на хостингах. | |
|
|
|
|
|
|
|
для: cheops
(17.04.2005 в 01:33)
| | Доделал току входа (нулевые позиции + кое-какая косметика) и добавил в count.php проверку и по адресу и по названию - надеюсь, будет работать корректно.
Вообще возникла мысль: ведь на основании соотношения входов/выходов можно вычислять рейтинг "интересности" содержания страницы:) Правда, для этого придется очень сильно переписать отчет... может потом и возьмусь:) | |
|
|
|
|
|
|
|
для: Loki
(17.04.2005 в 23:19)
| | Ага, интегрировал в рабочую версию.
PS Если будете ещё писать посты - заведите плиз ещё одну тему, а то эта уже очень длинная не удобно с ней работать. | |
|
|
|
|