Консультация № 55193
12.09.2006, 19:39
0.00 руб.
0 2 2
У меня есть каркас форума (www.box.h10.ru/forum).
В статистике этого форума необходимо указать количество человек, находящихся в данный момент на форуме, хотелось бы ещё указать их логины(имена). Я на форуме использую авторизацию по средствам сессий.
/* Я думал, что количество зарегистрированный пользователей находящихся в текущий момент времени можно определить при помощи конструкции sizeof($_SESSION); так я думал, когда читал книгу летом, а когда на практике это применил, то оказалось, что в массиве хранится информация только по текущему конкретному пользователю, а не о всех текущих пользователях. Я вошел на форум с 3-х различных браузеров под тремя различными логинами, а результат sizeof($_SESSION)==1;(если хранить там login) . */



Приложение:
//forum.php<table width=100% height=40 valign="top" class="basic" cellspacing=2 cellpadding=8> <tr> <td> Список форумов </td> </tr> <tr> <td> <?//mysql_connect("localhost","root") or die("Ошибка!");//$db="forum";//mysql_select_db($db) or die("Не найдена выбранная б.д."); $result=mysql_query(‘SELECT forum_id,forum_name FROM forums ‘)or die("Не получилось"); for($data=array();$row=mysql_fetch_assoc($result); $data[]=$row); ?> <table class="basic" align=center width=80%> <tr> <?if($_SESSION[‘name‘]=="root"){echo "<td width=1>ID</td>";}?> <td>Форум</td><td width=1>Тем</td><td width=1>Сообщений</td> </tr> <?//$topic_value=mysql_query("SELECT * FROM topics WHERE "); for($i=0;$i<sizeof($data);$i++){$mmm=0;echo "<tr>"; foreach($data[$i] as $a=>$b) { if($mmm<1) {if($_SESSION[‘name‘]=="root"){echo "<td>$b</td>";} echo("<td><img src=images/str.gif> <a href=‘topic.php?f=$b‘>"); $mmm++; $DD=$b;} else { $topic_value=mysql_query("SELECT * FROM topics WHERE forum_id=$DD"); $topic_value=mysql_num_rows($topic_value); $content_value=mysql_query("SELECT contents.topic_id FROM topics, contents WHERE topics.forum_id=$DD AND contents.topic_id=topics.topic_id"); $content_value=mysql_num_rows($content_value); echo("$b </a></td><td align=center>$topic_value</td><td align=center>$content_value</td> ");} }echo"</tr>";}?> </td> </tr></table> </td> </tr></table>
<table class="basic" width=100% > <tr> <td> Статистика форума </td> </tr> <tr> <td><?$ALL_messages=mysql_query("SELECT topic_id FROM contents"); $ALL_messages=mysql_num_rows($ALL_messages);echo "<h6>Всего сообщений на форуме ".$ALL_messages." (в том числе c удалённых тем)</h6>";$ALL_users=mysql_query("SELECT * FROM user"); $ALL_users=mysql_num_rows($ALL_users);echo "<h6>Всего зарегистрировавшихся на форуме ".$ALL_users." </h6>";echo "!!!Сейчас на форуме ".(sizeof($_SESSION))/(2)." человек(а)
";print_r($_SESSION);?> </td> </tr></table><?if($_SESSION[‘name‘]==‘root‘){echo "<center>Создать очередной форум: <form action=scripts/root.php>Имя <input type=text name=namef><input type=hidden name=action value=create_forum> <input type=submit value=‘создать‘></form>";} ?><?if($_SESSION[‘name‘]==‘root‘){echo "<center>удалить форум: <form action=scripts/root.php>ID <input type=text name=id><input type=hidden name=action value=delete_forum> <input type=submit value=‘удалить‘></form>";} ?>

Обсуждение

Неизвестный
12.09.2006, 21:12
общий
это ответ
Здравствуйте, PetrKi.!
Объясню общий принцип, как считаются пользователи на форумах. При входе пользователя сведение (например, его имя и время входа) об этом заносится в таблицу БД (в вашем случае MySQL). Далее, при обращении к любой странице форума эта информация обновляется - устанавливается текущее время для этого пользователя. И вот, когда надо вывести информацию о пользоателях в онлайне, просто выбирается эта таблица. Чтобы исключить пользователей, которые уже возможно ушли со страниц форума, проверяется по времени, чтобы промежуток между последним простмотром и текущим временем не превышал, к примеру, 10 минут.
Вот и весь ответ ;)
Если будут дополнительные вопросы, можно обратиться в личку.
Неизвестный
13.09.2006, 13:49
общий
это ответ
Здравствуйте, PetrKi.!

Вот кусочек скрипта, который делает нужное вам:

session_start();
define("MAX_IDLE_TIME", 3);
function getOnlineUsers(){
if ( $directory_handle = opendir( session_save_path() ) ) {
$count = 0;
while ( false !== ( $file = readdir( $directory_handle ) ) ) {
if($file != ‘.‘ && $file != ‘..‘){
if(time()- fileatime(session_save_path() . ‘‘ . $file) < MAX_IDLE_TIME * 60) {
$count ;
}
} }
closedir($directory_handle);
return $count;
} else {
return false;
}}
echo ‘Пользователей онлайн: ‘ . getOnlineUsers() . ‘;

P.S. Это скрипт с WOWeb.ru, автор - Динман Максим, хотя этой статьи там может уже и не быть.
Форма ответа