Forum Webscript.Ru

Программирование => PHP => Тема начата: hanslinger от 11 Октября 2003, 17:45:11

Название: Форум PHP+MySQL
Отправлено: hanslinger от 11 Октября 2003, 17:45:11
Хитрая для меня вещь: как для каждого пользователя записывать информацию по каждой теме, читал он ее или нет? Имею в виду сам механизм. Есть мысли по поводу текстового поля, в котором содержится текст вида "1 5 12 53" итд, где номера пользователей разделены пробелами. Должно же быть что-то проще и "не через это самое"?
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 12 Октября 2003, 15:26:28
должно быть.
отдальная таблица из трех полей - ид юзера, ид темы, время просмотра.
Название: Форум PHP+MySQL
Отправлено: Britva от 12 Октября 2003, 15:28:34
а почему бы не сделать это отдельной таблицой?
например, ThreadID, UserID, Time
Название: Форум PHP+MySQL
Отправлено: hanslinger от 12 Октября 2003, 17:10:27
Так это же получится огромная таблица!
Название: Форум PHP+MySQL
Отправлено: Yukko от 12 Октября 2003, 17:28:47
RomikChef
а зачем время? прочитал пользователь тред, сделали запись: ид_пользователя ид_треда, если ему важно только прочел или нет, ИМХО от одного поля можно избавиться.
Britva
а какая разница от того, что предложил RomikChef??? ThreadID и UserID в своем посте местами поменяй и все... :)
Название: Форум PHP+MySQL
Отправлено: Макс от 12 Октября 2003, 17:29:01
нет, в таблице будут только числа, а с такими mysql работает быстро
Название: Форум PHP+MySQL
Отправлено: Britva от 12 Октября 2003, 17:37:35
[off]
Цитировать
Yukko:
а какая разница от того, что предложил RomikChef??? ThreadID и UserID в своем посте местами поменяй и все...

м-дя, так и думал :-))) обрати внимание на время у обоих сообщений.
[/off]

Цитировать
hanslinger:
Так это же получится огромная таблица!

Так ведь и "1 2 3" - строка тоже получится большая :-)
Цитировать
Yukko:
а зачем время? прочитал пользователь тред, сделали запись: ид_пользователя ид_треда, если ему важно только прочел или нет, ИМХО от одного поля можно избавиться.

Если уж контролировать, то по полной :-))
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 12 Октября 2003, 18:19:32
Цитировать
Так это же получится огромная таблица!

hanslinger, вынужден тебя огорчить.
Если тебя не устраивает размер этой таблицы, то ты можешь забыть об идее отслеживать НОРМАЛЬНО все непрочитанные сообщения.
можешь тогда делать по-уродски, как это делается на этом форуме. Можешь наизобретать еще кучу кривых способов.

Юкко, ты меня радуешь.
Какое-то время ты еще можешь себя контролировать и выдавать нечто более-менее осмысленное, но потом расслабляешься, и тут-то вылезает твоя безмозглая сущность :-)
Название: Форум PHP+MySQL
Отправлено: Yukko от 12 Октября 2003, 19:00:35
Цитировать
RomikChef:
Юкко, ты меня радуешь.

Я буду стараться изо всех сил :) в смысле не расслабляться...
Название: Форум PHP+MySQL
Отправлено: hanslinger от 12 Октября 2003, 19:52:32
Спасибо всем. У меня еще появился вариант просто запиывать в сессию время прошлого посещения юзера и сравнивать с временем последнего добавленного в тему сообщения. Буду выбирать между двумя.
Еще раз спасибо.
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 12 Октября 2003, 20:23:58
Цитировать
hanslinger:
время прошлого посещения

Время, когда юзер посещал ЧТО? Форум? Такая система применяется здесь.
То есть ,если он зашел, ничего не прочитал, и ушел, а потом зашел снова, то система благополучно считает, что он все прочел.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 13 Октября 2003, 08:15:36
Тогда я уже выбрал :).
Кстати, в phpBB тоже так сделано, кажется, как здесь?
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 13 Октября 2003, 10:01:21
да.
создатели популярных форумов не заморочиваются на эту тему.
Единственный известный мне форум, который 100% отслеживает обновление тем, стоит $600. это http://www.xpoint.ru
Кстати, благодаря этим 100% в нем реализованы некоторые уникальные фичи. Некоторые - и я горжусь этим - по моему предложению.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 13 Октября 2003, 22:08:37
А на xpoint тоже такая таблица, или по-другому сделано? Просто мне интересно, как еще можно. У меня фантазия кончилась :)
Спасибо за советы и за xpoint =)
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 13 Октября 2003, 22:27:44
я не знаю, какая таблица на икспойнте, но просто другого выхода-то нет!
Для того, чтобы отследить, читал человек тему или не читал, надо записать что?
ид темы - надо? Не обойтись. Надо же знать - какая тема?
ид человека надо? Как же без него?
время, когда читал - надо? А иначе обновления как отслеживать?
в таблицу ли, еще куда-то, но эти три параметра записать надо!

В икспойнте есть правда, одна фишка. там ведется архивирование тем. то есть, таблица просмотров не разрастается.
Но, правда, такое архивирование можно эмулировать и на обычном форуме.
Считать априори все темы старше 30 дней, к рпимеру - прочитанными.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 10:26:04
RomikChef
Время-то не обязательно. На каждый добавленный в топик пост стираешь все из этой таблицы для этого топика. На каждый просмотр - добавляешь строку с юзером. А время нафиг не надо. С другой стороны... если уж следить, так по полной :)))
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 10:37:25
x02x, еще раз влезешь в чужую тему, то я просто сотру твой вопрос.
На первый раз я за тебя новую тему создал.
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 11:02:19
hanslinger
В принципе, мысль интересная.
Я как-то привык, что на испойнте новые темы отличаются от обновленных.
Если подумать, то идея здравая. Если экономить производительность, то вполне себе разумная.
при добавлении сообщения сделать еще один запросик на удаление - несложно.

Но, с другой стороны, пропадают некоторые вкусные сервисы - например, переход прямиком к непрочитанному сообщению.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 13:52:31
RomikChef
извини, ты опять рассердишься, но именно от поля времени я и предлагал избавиться в начале разговора...
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 14:01:06
Нет, на правду я не рассержусь. Мне должно быть стыдно.
Но когда я думаю о том, что ты уцепишься за этот случай, то мне становится грустно.

Да и идея не такая уж и прекрасная, как кажется на первый взгляд.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 15:19:56
Цитировать
RomikChef:
новые темы отличаются от обновленных

У каждого топика есть время его создания правильно? отдельно вносим время последнего обновления... вновь созданная тема - тема у которой поле последненго обновления равно времени создания, таким образом разграничили... После обновления темы поступаем так, как предложил
hanslinger
Цитировать
RomikChef:
переход прямиком к непрочитанному сообщению.

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

Что-то в этом роде, если я где-то ошибся, поправь.
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 15:21:30
оно не одно - непрочитанное сообщение. их может быть несколько.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 15:34:31
Цитировать
RomikChef:
непрочитанное сообщение. их может быть несколько.

кажется, я догнал... а может и нет.
 
Если таблица Пользователи содержит поле твоего последнего визита, а она думаю содержит, и рядом с каждым сообщением, как, например, тут пишется время отправки сообщения (для этого есть поле в таблице Сообщения), то непрочитанные сообщения - все сообщения из топиков, которые обновили (т.е. для этого топика нет записи твой_ид_пользователя-ид_топика), которые попадают в промежуток между временем твоего последнего захода и текущим временем твоего нового захода...
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 15:36:31
по второму кругу пошли.
Цитировать
поле твоего последнего визита

визита куда?
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 15:42:59
Цитировать
визита куда?

Таблица пользователи:
|user_id|name|lastvisit|

каждый раз. когда ты запрашиваешь информацию с сервера, скрипт делает
1. забирает значение lastvisit запоминает
2. сравнивает его с текущим (выполняет какие-то действия)
3. обновляет lastvisit текущим временем.

таким образом время последнего визита считается временем последнего обращения к скрипту... или не катит? если не катит то почему?
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 15:45:03
кажется понял... сейчас еще раз подумаю
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 15:47:02
ИМХО, катит нормал.
Название: Форум PHP+MySQL
Отправлено: NAS от 14 Октября 2003, 15:48:41
Вот тут (http://register.spectator.ru/14.10.2003/1) и тут (http://register.spectator.ru/14.10.2003/2) думают о том же и приходят к тем же выводам.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 15:55:49
Да нет... не совсем катит, немного криво получается, но даже из этого алгоритма все равно можно выжать непрочитанные топики, даже если ты зашел и не прочитал, со всеми непрочитанными сообщениями не покатит...
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 16:02:41
А непрочитанные сообщения ты не отследишь никак все равно. Если человек зашел в топик, значит можно считать, что он прочитал. А если не прочитал - его проблемы: нечего зря шастать :). А представь: там два, к примеру, непрочитанных сообщения. Может быть, он зашел и одно прочитал, а до второго скроллер не докрутил и вышел куда-нибудь в сторону оффлайна. Как ты это отследишь? Вот то-то же... есть, конечно, вариант: выводить по одному посту на страницу, но какой-то он не совсем удачный, наверное :)
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 16:09:11
Юкко, при таком подходе получается, что если я прочел одну ветку, я прочел ВСЕ.

hanslinger не надо юродствовать и придираться к словам.
Здесь и так слишком много непоняток, чтобы новые вносить.
прочитанные == отображенные на странице.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 16:16:58
Почему?
1) У нас есть lastvisit, сохраняемый в профайле пользователя.
2) Есть отдельная таблица, в которой записаны столбцы (минимальные): thread_id, user_id.
3) Делаем выборку из всех топиков, обновленных позже lastvisit и на которых наш user не был. Надо только подумать, как ее грамотно сделать. Я, кажется, почти придумал.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 16:18:59
Под словом "минимальные" я имел в виду: "минимум эти столбцы".
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 16:20:07
Цитировать
я прочел ВСЕ.

а вот и нет, ты прочел только те, которые занесены в таблицы ид_пользователя-ид-треда
те топики, которые ты не прочел, но они были изменены, у них будет дата обновления больше даты твоего последнего захода на форум, плюс по алгоритму hanslinger\'a :)  при обновлении топика, мы удаляем все пары ид_пользователя-ид_данного_топика т.е. для всех пользователей тред становится непрочитанным :) при его обновлении, если тред необновлялся и нет записи твой_ид-данный тред, то ты его не читал, если тред не обновлялся и есть запись твой_ид-данный_тред, то его уже читал...
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 16:24:26
Мне такой подход более чем нравится :)
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 16:25:50
NAS, спасибо за ссылку!
Название: Форум PHP+MySQL
Отправлено: NAS от 14 Октября 2003, 16:30:17
Цитировать
hanslinger:
1) У нас есть lastvisit, сохраняемый в профайле пользователя.
2) Есть отдельная таблица, в которой записаны столбцы (минимальные): thread_id, user_id.
3) Делаем выборку из всех топиков, обновленных позже lastvisit и на которых наш user не был. Надо только подумать, как ее грамотно сделать. Я, кажется, почти придумал.

Если lastvisit форума, то все равно будут пропущенные сообщения
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 16:37:06
Только те, которые были добавлены во время пребвыания пользователя на форуме, если я правильно понял... значит, делаем по-другому: В той нашей таблице три столбца thread_id|user_id|visittime. Здесь вроде ничего теряться не должно...
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 16:41:46
NAS
мы вроде уже сошлись на том, что при таком раскладе все сообщения отследить нельзя, и ветка незаметно перешла на обсуждение можно ли отследить таким образом непрочитанные треды... т.е. зная время захода пользователя на форум и имея таблицу которую предложили в начале, я утверждаю, что могу отследить непрочитанные треды, даже если пользователь зашел на форум, но ничего в тредах не читал. Как? я объяснил постом выше... а если в треде есть новые сообщения, то их количество будет => количеству сообщений со времени последнего визита до данного врмени.

Кажется так... если в рассуждениях есть ошибка, укажите.
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 17:26:00
Yukko, я тормоз, хе-хе :)

Цитировать
hanslinger:
Время-то не обязательно. На каждый добавленный в топик пост стираешь все из этой таблицы для этого топика. На каждый просмотр - добавляешь строку с юзером

Этот метод не покатит, и обсуждать его бессмысленно :-)
вообще, никак не покатит.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 17:29:10
RomikChef извини, и я тогда тормоз, я не понимаю, почему не покатит, никто не говорит использовать только одну! таблицу для определения прочитанных топиков, насчет сообщений я давно уже согласился, что это невозможно :)
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 17:32:06
А почему бы и не одну использовать? Я тормоз тоже :) Но топики-то отслеживаются нормально!
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 18:23:59
а сколько таблиц ты хочешь, Юкко?
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 18:33:49
RomikChef
Смотри,
таблица Пользователи там мы храним время последнего захода каждого пользователя.
таблица Треды, там два поля, которые нас интересуют, есть все равно, один время создания, второй время изменения (можно время только изменения и булевое поле 0/1 изменен или нет, если 0, то тогда время изменения автоматически равно времи создания)
и таблица, которую предложили в начале где храним ид_пользователя и ид_темы, которую он просмотрел...

Т.е. поля во всех таблицах и так стандартные, но если нам не важно точное количество ответов в треде после последнего туда захода, а важно только читал тред или нет (новые сообщения в треде), то мы избавляемся от одного поля в последней таблице, т.е. время прочтения данного треда пользователем.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 18:40:22
Yukko
Так мы же получим количество ответов, отталкиваясь от времени его последнего посещения! Сообщения со временем, большим этого, и будут нашими. А читал тред или нет, узнаем из отдельной таблицы. Но, по-моему, мой метод проще.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 18:44:31
hanslinger
читай тред с самого начала, я написал, чему буде равняться количество непрочитанных сообщений...
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 18:44:39
так.
я заморочился по поводу времени последнего визита.
А оно тут никаким боком.

Значтак.
в теме новое сообщение.
записей в таблице нет.
Его просмотрели два человека.
в таблице две записи.
в тему добавили сообщение.
записи стираем.
еще трое просмотрели.
три записи.

суть в том, что мы стираем все упоминания о треде в тот момент, когда туда добавляется новая запись?

"пометить, как прочитанное" - работает...

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

еще мысли будут?
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 14 Октября 2003, 18:47:19
Количество непрочитанных при таблице из двух полей мы не получим. НИКАК.
абстрактное время посещения одного из тредов никак нам не поможет.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 19:03:48
RomikChef:
так, я, кажется, тоже заморочился... :)

Цитировать
RomikChef:
тут приходит злобный, хе-хе, модератор, и удаляет новое сообщение

да, вот тут накладочка... согласен.

Все остальное расписано верно :)

Цитировать
RomikChef:
Количество непрочитанных при таблице из двух полей мы не получим

с этим я согласен уже давно :)

Общий вывод: можно улучшить работу, например, данного форума, и сэкономить на одном поле, добавив только таблицу из двух полей...
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 19:21:17
Я так и не понял, почему не получим, ведь у нас есть lastvisit.
А вообще, одно и то же перемалываем уже сколько...
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 19:23:57
Цитировать
Если таблица Пользователи содержит поле твоего последнего визита, а она думаю содержит, и рядом с каждым сообщением, как, например, тут пишется время отправки сообщения (для этого есть поле в таблице Сообщения), то непрочитанные сообщения - все сообщения из топиков, которые обновили (т.е. для этого топика нет записи твой_ид_пользователя-ид_топика), которые попадают в промежуток между временем твоего последнего захода и текущим временем твоего нового захода...

Вот я об этом говорю. Уже который раз. И все катит.
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 19:45:52
hanslinger
объясняю отдельно почему не покатит, ты зашел на форум и ушел, время lastvisit изменилось? да. но ты ничего не прочитал... теперь смотри дальше, для каждого форума мы знаем 100% только, что в нем есть новая для данного пользователя информация. Определяем мы это по отсутствию записи вида
ид_пользователя|ид_треда
в специальной таблице.  

есть тред, который создан в 10.00
в нем сообщения со временем создания
10.00
12.00
13.00
ты зашел на форум, но ничего не читал (ни один тред!) в 13.00 и ушел
за это время созданны сообщения в
15.00
16.00
17.00
18.00
потом зашел в 19.00 считал время своего последнего посещения, оно будет равняться 13.00
вычисляешь количество непрочитанных сообщений, путем выборки сообщений в треде которые созданны во временных рамках 13.00-19.00 таких сообщений получится 4, а реально ты не читал те сообщения, которые были созданы до твоего первого прихода т.е. еще в количестве 3 штуки, таким образом количество непрочтенных сообщений всегда больше либо равно тому количеству сообщений, которые ты вычислил предложенным тобой способом.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 19:49:22
Простите дуру грешную, забываю все об этом. Тогда http://forums.webscript.ru/showthread.php?s=&postid=91241#post91241. Я писал. Об этом говоришь? Тогда все должно получаться, ведь для каждого топика в отдельности время записывается. И если зашел, значит читал. Все. Вроде я разобрался с окончательной моделью. Или что-то я недопонял?
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 20:00:14
Цитировать
hanslinger:
из всех топиков

так я кажется догнал и тебя... тут смешался разговор, отдельно вели разговор про топики, а отдельно вели разговор про сообщения.
Топики можно определить, что они непрочитанные! сообщения нет...
т.е. согласно того, что я тебе нарисовал постом (сообщением) выше, топик будет считаться непрочитанным по-любому, но количество сообщений ты не посчитаешь, потому что для каждого сообщения (гипотетически) для каждого треда(практически), надо сохранять время, когда его человек читал последний раз. Т.е. в 19.00 ты зашел, но так как для того треда нет вообще записи, что ты его посещал, тогда все! сообщения будут новыми, но теперь представь схему, что ты зашел на приведенный выше тред в 11.00, т.е. прочитал одно сообщение, потом пришел в 13.00 и не прочитал ничего, а потом пришел в 19.00.
Представил?
теперь для того, чтобы узнать СКОЛЬКО СООБЩЕНИЙ ты не прочитал (не факт а количесво) тебе надо знать время КОГДА_ТЫ_ЧИТАЛ_ДАННЫЙ_ТРЕД оно равняется 11.00, и оно же отличается от времени КОГДА_ТЫ_ПОСЛЕДНИЙ_РАЗ_ПОСЕТИЛ_ФОРУМ, оно равняется 13.00
Для того чтобы хранить время, КОГДА_ТЫ_ЧИТАЛ_ДАННЫЙ_ТРЕД, надо еще одно поле, на чем мы захотели сэкономить :) и успешно сэкономили за счет потери некоторой функциональности.
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 20:50:17
Гм. Я, кажется, тебя тоже догнал. А может быть, сделать таблицу "thread_id|user_id|time" и не стирать значения, а проверять, есть ли строчка вообще. Если есть, тогда сверять время визита на топик и время последнего поста в нем, а если нет, то просто записывать? Так разве плохо? Или я опять что-то упустил? :)
Название: Форум PHP+MySQL
Отправлено: Yukko от 14 Октября 2003, 20:57:28
hanslinger
умотал... можно и так и так... прочитай топик с самого первого поста очень внимательно :) там тебе Бритва и Ромик сразу сказали, что можно сделать такую таблицу!!! это потом у нас уже зашел спор, который вылился в 2 страницы обсуждения и только из-за того, что, например, кому-то захотелось сэкономить на одном поле...
Название: Форум PHP+MySQL
Отправлено: hanslinger от 14 Октября 2003, 21:04:34
Да. Точно. Просто я тогда не так воспринял немного :)

Кстати, с кого началось обсуждение сэкономленного поля? =))))
Название: Форум PHP+MySQL
Отправлено: Меняздесьдавнонет от 15 Октября 2003, 09:26:50
офигенный тред.
как бы его в избранное занести? ;-)
Название: Форум PHP+MySQL
Отправлено: NAS от 15 Октября 2003, 10:54:05
Цитировать
RomikChef:
как бы его в избранное занести? ;-)

Идем в избранное и жмем кнопку править :)