VBsupport перешел с домена .ORG на родной .RU
Ура!
Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей
Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже: Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота. Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
Где в БД хранятся записи о непрочитанных сообщениях?
0
Собственно сабж. Дописываю один модуль и ни как не могу понять - как найти в БД ID (или ещё чего) тем, непрочитанных пользователем. Полазив по файлам понял, что зависит всё это от нескольких переменных:
Может не от всех.
Кто подскажет, как из БД выдернуть темы (или ID), которые пользователь не прочитал?
Причём надо именно записи БД, а не переменные vBulletin.
Надеюсь объяснил подробно.
Сорри - сам понял ;)
Беру из vb_user 'lastactivity' и сравниваю с vb_post 'dateline' - думаю, что делаю правильно.
Может у кого есть другие идеи?
CityCat добавил 29.03.2009 в 03:54
Не совсем панацея, т.к. при следующем посещении форума vb_user 'lastactivity' сбрасывается на текущее время (и не понять, конкретная тема прочитана или нет), то есть получается, я зашёл на форум и после этого все темы у меня прочитаны...
Есть идеи?
Last edited by CityCat : 03-29-2009 at 04:55 AM.
Reason: Добавлено сообщение
есть. использовать для определения времени прочтения указанной темы таблицу vb_threadread - это раз. не учитывать сообщения/темы, созданные/обновленные ранее чем $vbulletin->options['markinglimit'] дней назад - это два.
@CityCat
Эксперт
Join Date: Oct 2008
Location: Беларусь
Posts: 544
Версия vB: 3.8.x
Пол:
Reputation:
Professional 712
Репутация в разделе: 222
0
Quote:
Originally Posted by Ghost
есть. использовать для определения времени прочтения указанной темы таблицу vb_treadread - это раз...
Хм... А как я из таблицы vb_treadread могу определить время прочтения указанной темы именно этим юзером? Там по-моему такого параметра нет. lastpost и dateline - это два столбца даты. Но это не совсем то что надо. Первое это время последнего поста, второе - это... не знаю, мне кажется время создания темы.
Quote:
Originally Posted by Ghost
...
не учитывать сообщения/темы, созданные/обновленные ранее чем $vbulletin->options['markinglimit'] дней назад - это два.
Ну или если проще, то так:
Code:
SELECT value FROM `vb_setting` WHERE varname='markinglimit'
Это меня пока не интересовало, но за идею спасибо.
@Ghost
Гуру
Join Date: Feb 2008
Posts: 983
Версия vB: 3.8.1
Reputation:
Гуру 1011
Репутация в разделе: 893
1
Quote:
Originally Posted by CityCat
А как я из таблицы vb_treadread могу определить время прочтения указанной темы именно этим юзером?
А что там сложного? Есть три поля userid, threadid и readtime, т.е. id юзера, id темы и время прочтения соответственно.
Quote:
Originally Posted by CityCat
Это меня пока не интересовало
Зря. Иначе никак. Пометка прочтения темы сохраняется в указанной мной таблице, но информация хранится только для тех тем, время обновления которых больше $vbulletin->options['markinglimit']. Потом метка о прочтении удаляется, чтобы не хранить в БД кучу инфы для каждого пользователя и темы (1000 юзеров , 1000 тем - итого миллион записией в таблице) и уже никак нельзя проверить, читал юзер эту тему или нет.
Если тебе нужен sql-запрос, то будет он выглядеть вроде бы так:
Code:
SELECT thread.*
FROM vb_thread AS thread
LEFT JOIN vb_threadread AS threadread ON(thread.threadid=threadread.threadid AND threadread.userid=1)
WHERE (threadread.userid IS NULL AND ((UNIX_TIMESTAMP()-thread.lastpost)/86400)<=10)
OR (threadread.userid IS NOT NULL AND threadread.readtime<thread.lastpost);
т.е. я объединяю таблицы thread и threadread на основе совпадения threadid и равенства userid указанному значению ID пользователя (в данном случае - 1). "LEFT JOIN" - означает, что если в таблице threadread нет искомой записи, то будут присоеденины три поля NULL. после объединения я выполняю выборку по одному из условий: либо инфа о прочтении не найдена ("threadread.userid IS NULL") и тема обновлялась в течении последних 10 дней ("((UNIX_TIMESTAMP()-thread.lastpost)/86400)<=10" - у меня $vbulletin->options['markinglimit'] равен 10 дням), либо инфа найдена ("threadread.userid IS NOT NULL") и время прочтения темы меньше времени последнего ее обновления ("threadread.readtime<thread.lastpost"). вот как-то так...
Quote:
Originally Posted by CityCat
SELECT value FROM `vb_setting` WHERE varname='markinglimit'
не стоит выполнять этот запрос, если ты будешь вставлять запрос поиска непрочтенных в какой-либо скрипт форума, а лучше использовать значение переменной - не имеет смысла грузить базу дополнительным запросом для того, чтобы получить уже имеющееся значение.
@CityCat
Эксперт
Join Date: Oct 2008
Location: Беларусь
Posts: 544
Версия vB: 3.8.x
Пол:
Reputation:
Professional 712
Репутация в разделе: 222
0
Quote:
Originally Posted by Ghost
Если тебе нужен sql-запрос, то будет он выглядеть вроде бы так: