Узнать время последней активности пользователя

Идеи для расширения функциональности phpBB 2.0.x
Аватара пользователя
SpLinter
phpBB 1.2.1
Сообщения: 22
Стаж: 18 лет 5 месяцев
Откуда: МСК

Узнать время последней активности пользователя

Сообщение SpLinter »

И снова приветствую.
Задался тут созданием такой таблички в которой бы указывалось сколько минут назад был пользователь.
Но в таблице phpbb_users есть только время последнего логона user_lastvisit, а это не совсем подходит, точнее совсем не подходит.

Есть ли в базе поле где хранится именно время последней активности пользователя. Или надо создавать свое поле вроде user_lastactivity и в хедер или футер страницы ставить запрос который бы это поле постоянно апдейтил?

Спасибо за советы ;)
Небо инопланетянам.
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

я люблю daft punk | новый sugoi.ru
Аватара пользователя
SpLinter
phpBB 1.2.1
Сообщения: 22
Стаж: 18 лет 5 месяцев
Откуда: МСК

Сообщение SpLinter »

VVVas
Спасибо помогло. Видимо не так искал.
Теперь не могу никак разобраться с временными поясами :(

код моего модуля:

Код: Выделить всё

<? 
$content="";
$DB->query( "SELECT username, user_id, user_timezone, session_time FROM phpbb_users LEFT JOIN phpbb_sessions ON phpbb_users.user_id=phpbb_sessions.session_user_id WHERE user_id>0 ORDER BY session_time DESC LIMIT 5;" );


while ( $row = $DB->fetch_row() )
{
     $last_seen = time() - $row['session_time'];
     $content .= $row['username'] . " " . date("H:i:s", $last_seen) . "<br>";
}

?>
в результате выполнения получаем:
ХХХ 03:00:00
YYY 03:01:25
ZZZ 03:03:45
AAA 03:17:48
BBB 03:24:44
Как избавиться от этой тройки в часах? Ума не приложу откуда тут отнять часовой пояс. Предполагаю что от часов, но вот только как?

З.Ы. Вопрос возможно тупой, но я только учусь.
Небо инопланетянам.
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

SpLinter писал(а):Как избавиться от этой тройки в часах?
А зачем вы на сервере поставили GMT+3? Поставьте нормальное время на сервере и всё будет жить.
я люблю daft punk | новый sugoi.ru
Аватара пользователя
SpLinter
phpBB 1.2.1
Сообщения: 22
Стаж: 18 лет 5 месяцев
Откуда: МСК

Сообщение SpLinter »

VVVas писал(а):А зачем вы на сервере поставили GMT+3? Поставьте нормальное время на сервере и всё будет жить.
Сервер крутится у меня на домашней машине, под 2003 виндой и апачем, часовой пояс был выставлен при установке сервера, вот так.

Ладно поставил там 0 GMT. =)
Хотя, конечно это не совсем выход.

Спасибо.
Небо инопланетянам.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16948
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1701 раз

Сообщение rxu »

SpLinter
Используйте функцию create_date из includes/functions.php, и будет Вам счастье.
Изображение
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

SpLinter писал(а):Хотя, конечно это не совсем выход.
Если вы так думаете, то советую прочитать определение функции time. Иначе вы ещё замучаетесь со времене при програмировании. И почитайте мануалы по настройке веб-серверов.
я люблю daft punk | новый sugoi.ru
Аватара пользователя
SpLinter
phpBB 1.2.1
Сообщения: 22
Стаж: 18 лет 5 месяцев
Откуда: МСК

Сообщение SpLinter »

rxu
VVVas
Спасибо. Будем обучаться дальше.
Небо инопланетянам.
Gosudar
phpBB 2.0.0
Сообщения: 227
Стаж: 19 лет 9 месяцев

Сообщение Gosudar »

держи готовую функцию, выводит примерно такую вот строку:
(6 недель, 2 дней, 2 часов, 53 минут назад)
Вот код:

Код: Выделить всё

if( !function_exists('period') )
	{
		function period($date) // borrowed from birthday mod
		{
			global $lang;

			$years = floor($date/31536000);
			$date = $date - ($years*31536000);
			$weeks = floor($date/604800);
			$date = $date - ($weeks*604800);
			$days = floor($date/86400);
			$date = $date - ($days*86400);
			$hours = floor($date/3600);
			$date = $date - ($hours*3600);
			$minutes = floor($date/60);

			$result = (( $years ) ? $years .' '. (( $years == '1' ) ? $lang['Bla_year'] : $lang['Bla_years']) .', ' : '').
			(( $years || $weeks ) ? $weeks .' '. (( $weeks == '1' ) ? $lang['Bla_week'] : $lang['Bla_weeks']) .', ' : '').
			(( $years || $weeks || $days ) ? $days .' '. (( $days == '1' ) ? $lang['Bla_day'] : $lang['Bla_days']) .', ' : '').
			(( $years || $weeks || $days || $hours ) ? $hours .' '. (( $hours == '1' ) ? $lang['Bla_hour'] : $lang['Bla_hours']) .', ' : '').
			(( $years || $weeks || $days || $hours || $minutes ) ? $minutes .' '. (( $minutes == '1' ) ? $lang['Bla_minute'] : $lang['Bla_minutes']) : '');
			return $result;
		}
	}
Это в lang_main:
$lang['Bla_year'] = 'год';
$lang['Bla_years'] = 'лет';
$lang['Bla_week'] = 'неделя';
$lang['Bla_weeks'] = 'недель';
$lang['Bla_day'] = 'день';
$lang['Bla_days'] = 'дней';
$lang['Bla_hour'] = 'час';
$lang['Bla_hours'] = 'часов';
$lang['Bla_minute'] = 'минута';
$lang['Bla_minutes'] = 'минут';
И далее :
'LAST_PERIOD' => period(time() - $you_time))

думаю разберёшься
Аватара пользователя
SpLinter
phpBB 1.2.1
Сообщения: 22
Стаж: 18 лет 5 месяцев
Откуда: МСК

Сообщение SpLinter »

Gosudar
Спасибо, но мне не для форума надо, а для портала в который интегрирован форум.

Вот такая у меня получилась функция

Код: Выделить всё

<? 
$content="";

$DB->query( "SELECT username, user_id, user_lastvisit, user_timezone, session_time
FROM phpbb_users LEFT JOIN phpbb_sessions ON phpbb_users.user_id=phpbb_sessions.session_user_id
WHERE user_id<>-1 ORDER BY session_time DESC, user_lastvisit DESC LIMIT 5" );

$content .= "	<tr>
					<td width=\"100%\">
						<table border=\"0\" width=\"100%\" cellpadding=\"1\" cellspacing=\"1\">";

while ( $row = $DB->fetch_row() )
{
	$u_name = $row['username'];
	$last_seen = gmdate("H:i:s", (time() - max($row['user_lastvisit'],$row['session_time'])));
	$content .="			<tr>
								<td align=\"left\" class=\"tdblock\">" .
									$u_name .
								"</td>
								<td align=\"left\" class=\"tdblock\">" .
									$last_seen .
								"</td>
							</tr>";
}

$content .="			</table>
					</td>
				</tr>";
?>
Но только не хорошо то, что когда истекает время сессии запись о ней удаляется из базы. И, соответственно, получается что у нас время последней активности пользователя приравнивается к времени его последнего логона. Как бы это обойти?

Проблема со временем решилась банальным использованием gmdate(), вместо date(). =)

Всем спасибо.

Добавлено спустя 11 часов 28 минут 8 секунд:

Небольшое дополнение. Чтобы не показывались пользователи которые скрывают свое присутствие на форуме, в запрос в условия выбора надо добавить user_allow_viewonline=1.
Вот так например:
$DB->query( "SELECT username, user_id, user_lastvisit, user_timezone, session_time
FROM phpbb_users LEFT JOIN phpbb_sessions ON phpbb_users.user_id=phpbb_sessions.session_user_id
WHERE (user_id<>-1 AND user_allow_viewonline=1) GROUP BY session_time, user_lastvisit ORDER BY session_time DESC, user_lastvisit DESC LIMIT 5" );
Может кому-то пригодится.

З.Ы. Этот модуль, приведенный выше, написан под MKPortal 1.1.1.
Небо инопланетянам.

Вернуться в «Запросы модов для phpBB 2.0.x»