|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
|
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
всех приветствую.
при подсчете времени которое пользователь был онлайн, возникла следующая проблемма: Есть БД MySQL, в ней таблица с логами входов/выходов юзеров, Далее я вытаскиваю из неё записи нужного мне юзера, за нужный промежуток времени, но вот есть трудность: запись входа пользователя обозначается как STAT_IN, а выхода STAT_OUT, и мне нужно получить промежуток времени между двумя этими записями, но как? насколько мне известно узнать следующий ход цикла, не прерывая предыдущий нельзя. слышал про перебор массивов, но никогда ещё с ним не работал, может как то с помощью него можно реализовать это? |
|||
|
||||
нуп |
|
|||
Ботокодер Профиль Группа: Участник Сообщений: 987 Регистрация: 22.6.2009 Где: Кременчуг Репутация: нет Всего: 33 |
Если правильно понял , но причем здесь массивы
Результат в милисекундах. Дальше сам переводи Это сообщение отредактировал(а) нуп - 12.7.2010, 22:47 |
|||
|
||||
CruorVult |
|
|||
Опытный Профиль Группа: Участник Сообщений: 868 Регистрация: 24.9.2008 Где: г.Киев, Украина Репутация: 9 Всего: 28 |
||||
|
||||
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
нет, алгоритм вычисления времени я уже написал. проблеммма не в этом.
попробую ещё раз описать проблемму: вот таблица mysql:
|
|||
|
||||
нуп |
|
|||
Ботокодер Профиль Группа: Участник Сообщений: 987 Регистрация: 22.6.2009 Где: Кременчуг Репутация: нет Всего: 33 |
||||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
jone31,
Разумнее было бы делать время прихода - ухода в одной строке таблицы. Так проблем с вычислениями не было бы. соотвестственно, при выходе юзера - ведем поиск записи входа этого с максимальным временем и вписываем ему время выхода. Или вообще при любом телодвижении юзера вписываем ему время выхода "time()+10 минут", а то реальный выход с сайта ловить достаточно нетривиально. если на каждую запись "прихода" юзера есть соответствующая запись "ухода" - можно построить запрос с join'ом, который всю таблицу вернет в нужном виде. Что такое user_sn - сессия юзера? если так, то запрос может быть примерно такой
Только в таблицу нужно будет добавить ключей - в user_sn и в type? иначе будет тормозить ... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
ksnk, речь идет не о сайте, а о чат-боте. `user_sn` - это ICQ номер с которого выполнен вход(он тоже уникален, но у одного пользователя их может быть несколько, поэтому по `user_id` ловить легче)
нуп, нет, пользователь вошел и в лог пишется что он зашел, если он сам набрал команду выхода то в лог об этом записали. Но есть такие записи, где есть запись входа, но нету записи выхода(т.к. пользователя выкинуло из ICQ, вышел из аськи не выходя из чата и т.д.), такие записи в расчет не берутся. Берутся только парные записи, т.е. вход/выход. вот небольшой(150 строк) кусочек таблицы(поля user_sn и msg вырезаны):
STATE_IN и STATE_OUT - вход/выход значение OUT - сообщение Это сообщение отредактировал(а) jone31 - 13.7.2010, 20:38 |
|||
|
||||
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
ну неужели это невозможное действие?
|
|||
|
||||
bazzjr |
|
||||
Опытный Профиль Группа: Участник Сообщений: 460 Регистрация: 27.12.2007 Где: Россия, Пермь Репутация: 4 Всего: 6 |
jone31, если я правильно понял, то тебе нужно посчитать время из поля `time` до настоящего времени при `type`='STATE_OUT' ?
Если так то:
теперь имеем к примеру в переменной $timeUserIn значение из базы дальше можно вычислить сколько он пробыл онлайн :
Ну или же возьми две других даты из базы STAT_IN и STAT_OUT. Это сообщение отредактировал(а) bazzjr - 15.7.2010, 06:16 |
||||
|
|||||
bazzjr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 460 Регистрация: 27.12.2007 Где: Россия, Пермь Репутация: 4 Всего: 6 |
Немного подумав... наверно решение ksnk будет правильным.
Чем оно не утраивает? |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
bazzjr, тем, что поля в базе имеют другой смысл
jone31, Выбраная схема и дисциплина огранизации хранения данных не предполагает их реляционную обработку. Я не смог состряпать разумно выглядящий запрос, который бы сам все делал и считал для пользоателя время, проведенное им на сайте. Разве что выбрать все STATE_OUT и STATE_IN для пользователя, а потом вручную отсортировав по возрастанию времен, найти соответствующие пары и посчитать разницу. Хотя, возможно я просто не понял задачу если нужно просто понять - сколько пользователь сидит в онлайне в эту сессию (от последнего незакрытого STATE_IN), то запрос относительно простой, хотя, тоже только полуавтомат
результат нужно проверить. если первая строчка результата - type==STATE_IN, то все в порядке, сессия не закрыта. время в онлайне будет time()-`ts` Это сообщение отредактировал(а) ksnk - 15.7.2010, 09:40 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
а я и не просил и даже сам не думал обойтись одним sql. Мой алгоритм поначалу был такой: вывести все STATE_IN и STATE_OUT в массив, и потом путем перебора массива сделать новый массив где они все разложены в пары, а лишнее все убрано. но пока что ничего не получается. |
|||
|
||||
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
мне нужно узнать сколько он всего просидел в чате по данным лога.
|
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
jone31, тот-же запрос, но limit 2.
Это даст нам пару значений - вход и выход юзера. если первая запись - вход - юзер еще сидит в онлайне. Если первая запись - выход, а вторая - вход, то сколько он сидел можно посчитать отняв первое значение времени от второго. При других значениях ответа база некорректна, надо бежать жаловаться создателю... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
jone31 |
|
|||
Опытный Профиль Группа: Участник Сообщений: 343 Регистрация: 29.11.2008 Репутация: нет Всего: нет |
суть проблеммы неправильна понята.
там записей вход/выход тысячи. нужно их все сгрупировать по вход/выход, найти разницу во времени и все это сложить. там получится онлайн у каждого пользовтаеля самое малое - 2 месяца(это я вручную прикинул) |
|||
|
||||
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |