Тема: Кто на сайте
Хочу чтобы страуберри умела выводить список находящихся сейчас на сайте пользователей.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Хочу чтобы страуберри умела выводить список находящихся сейчас на сайте пользователей.
Лишняя нагрузка на сервер хостера, лишний траффик, кому важно, кому пофиг, сам сайт дольше грузиться будет.
А если плагином сделать? Включать, чтобы можно было, выключать. Кому надо - включит, кому не надо - нет.
в смысле, чтобы вообще любой юзер мог включать/выключать плагин?
Если так, то несмотря на мои скудные познания, я почему-то уверен, что сделать это будет еще сложней + у Strawberry появится уязвимость - по нажатию на ссылку включения/выключения запрос на это действие будет направляться в админку в обход пароля и прочих (установленных админом) систем безопасности.
Да не, пашто любой пользователь-то?
Я имею ввиду, пользователь страуберри - кому надо, кому не надо. Мне надо - я у себя включу. Aurum'у вот не надо, он и включать не будет.
кто он-лайн это вещь полезная, но насчет реализации в коде чё-та никто не берёться ![]()
по поводу выслушенного(прочтенного) выше: сделать как плагин или как не плагин это пох.. но возможность пользователю включить и выключить должна присутствовать. хотя бы при заходе на сайт у пользователя есть некии права к доступу в админку.... так вот можно дать права юзеру на просмотор "кто в он-лайне?" и сделать так что бы он сам мог включать и отключать для себя просмотр "кто в онлайн" или сделать это в кукках - при входе кидаються юзеру куки в них указана переменная. перед тем как выводить
<? if ($see_who_online) { echo who_on_line; }но дать возможность в профиле юзеру указать что он желает видеть кто он-лайн (после чего эта переменная в куку кидаться не будет) или как-нить так...
естественно что это будет влиять на запрос к БД, но разве на запросы к БД не влияет например мета-теги и т.п.?
а так не получиться?
здесь был неправильный кодUPD: не получиться
получиться так:
<?
if ($member['id']) {
$lv = time ();
$ido = $member['id'];
$sql->update(array(
'table' => 'users',
'where' => array("id = $ido"),
'values' => array('last_visit' => $lv)
));
}
echo '<b>Online:</b>';
$deadlinetime = time() - 300;
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
echo '<li>'.$v['username'].'</li>';
}
echo '</ul>';
}
?>UPD2: забыл! еще перед первым эхо нужно unset ($ido), ибо нужно.
Отредактировано goodboy (11 Nov 2006 15:41:45)
goodboy, переменную $id переименуй, она нужна скрипту.
А как вывести еще количество? Например имена есть, а количество ? Пользователей: 10
И возможно ли сделать так:
Гости: 20
Пользователи: 10
Отредактировано СвутЪ_ (13 Feb 2007 21:06:39)
СвутЪ_, вот в этой конструкции из поста #10:
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
echo '<li>'.$v['username'].'</li>';
}нужно добавить переменную-счетчик, чтобы было примерно так:
$ii = 0;
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
echo '<li>'.$v['username'].'</li>';
$ii++;
}тогда переменная $ii будет считать количество зарегистрированных пользователей. Для "гостей" этот метод не подойдет. Поможет такая функция (как-то раньше использовал):
function my_static() {
$data="online.dat";
$time=time();
$past_time=time()-300;
$readdata=fopen($data,"r") or die("Не могу открыть файл $data");
$data_array=file($data);
fclose($readdata);
if (getenv('HTTP_X_FORWARDED_FOR'))
$user = getenv('HTTP_X_FORWARDED_FOR');
else
$user = getenv('REMOTE_ADDR');
$d=count($data_array);
for($i=0;$i<$d;$i++)
{
list($live_user,$last_time)=explode("::","$data_array[$i]");
if($live_user!=""&&$last_time!=""):
if($last_time<$past_time):
$live_user="";
$last_time="";
endif;
if($live_user!=""&&$last_time!="")
{
if($user==$live_user)
{
$online_array[]="$user::$time\r\n";
}
else
$online_array[]="$live_user::$last_time";
}
endif;
}
if(isset($online_array)):
foreach($online_array as $i=>$str)
{
if($str=="$user::$time\r\n")
{
$ok=$i;
break;
}
}
foreach($online_array as $j=>$str)
{
if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;}
}
endif;
$writedata=fopen($data,"w") or die("Не могу открыть файл $data");
flock($writedata,2);
if($online_array=="") $online_array[]="$user::$time\r\n";
foreach($online_array as $str)
fputs($writedata,"$str");
flock($writedata,3);
fclose($writedata);
$readdata=fopen($data,"r") or die("Не могу открыть файл $data");
$data_array=file($data);
fclose($readdata);
$online=count($data_array);
return $online;
}Вызывать ее нужно так <?=my_static();?>, она покажет количество посетителей он-лайн (и гостей и пользователей).
Теперь, чтобы решить вашу задачу "дословно", можно сделать так:
echo 'Сейчас на сайте<br />';
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';У этого метода есть один минус - данные об общем количестве пользователей в он-лайн будут записываться в отдельный файл online.dat, но зато все будет работать!
Я так понял что полный код будет выглядеть так:
<?
if ($member['idd']) {
$lv = time ();
$ido = $member['idd'];
$sql->update(array(
'table' => 'users',
'where' => array("idd = $ido"),
'values' => array('last_visit' => $lv)
));
}
echo '<b>Пользователей:</b>';
$deadlinetime = time() - 300;
foreach ($users as $v) {
if ($v['last_visit'] >= $deadlinetime) {
echo '<br>'.$v['username'].'';
}
}
$ii = 0;
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
echo '<li>'.$v['username'].'</li>';
$ii++;
}
break;
}
}
foreach($online_array as $j=>$str)
{
if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;}
}
endif;
$writedata=fopen($data,"w") or die("Не могу открыть файл $data");
flock($writedata,2);
if($online_array=="") $online_array[]="$user::$time\r\n";
foreach($online_array as $str)
fputs($writedata,"$str");
flock($writedata,3);
fclose($writedata);
$readdata=fopen($data,"r") or die("Не могу открыть файл $data");
$data_array=file($data);
fclose($readdata);
$online=count($data_array);
return $online;
}
echo 'Сейчас на сайте<br />';
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';
?>Но он у меня почему-то не работает, выдаёт ошибку..
СвутЪ_, а функцию my_static куда дели? Какую ошибку выдает?
Да не внимательно посмотрел код ![]()
Сделал так:
<?
if ($member['idd']) {
$lv = time ();
$ido = $member['idd'];
$sql->update(array(
'table' => 'users',
'where' => array("idd = $ido"),
'values' => array('last_visit' => $lv)
));
}
echo '<b>Пользователей:</b>';
$deadlinetime = time() - 300;
foreach ($users as $v) {
if ($v['last_visit'] >= $deadlinetime) {
echo '<br>'.$v['username'].'';
}
}
$ii = 0;
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
echo '<li>'.$v['username'].'</li>';
$ii++;
}
function my_static() {
$data="online.dat";
$time=time();
$past_time=time()-300;
$readdata=fopen($data,"r") or die("Не могу открыть файл $data");
$data_array=file($data);
fclose($readdata);
if (getenv('HTTP_X_FORWARDED_FOR'))
$user = getenv('HTTP_X_FORWARDED_FOR');
else
$user = getenv('REMOTE_ADDR');
$d=count($data_array);
for($i=0;$i<$d;$i++)
{
list($live_user,$last_time)=explode("::","$data_array[$i]");
if($live_user!=""&&$last_time!=""):
if($last_time<$past_time):
$live_user="";
$last_time="";
endif;
if($live_user!=""&&$last_time!="")
{
if($user==$live_user)
{
$online_array[]="$user::$time\r\n";
}
else
$online_array[]="$live_user::$last_time";
}
endif;
}
if(isset($online_array)):
foreach($online_array as $i=>$str)
{
if($str=="$user::$time\r\n")
{
$ok=$i;
break;
}
}
foreach($online_array as $j=>$str)
{
if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;}
}
endif;
$writedata=fopen($data,"w") or die("Не могу открыть файл $data");
flock($writedata,2);
if($online_array=="") $online_array[]="$user::$time\r\n";
foreach($online_array as $str)
fputs($writedata,"$str");
flock($writedata,3);
fclose($writedata);
$readdata=fopen($data,"r") or die("Не могу открыть файл $data");
$data_array=file($data);
fclose($readdata);
$online=count($data_array);
return $online;
}
echo 'Сейчас на сайте<br />';
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';
?>Выдаёт ошибку : Parse error: parse error, unexpected $end in z:\home\clan.lh\www\index.php on line 605
605 Строка конец страницы "</body></html>"СвутЪ_, забыли скобку. Перед фрагментом
function my_static() {
$data="online.dat";забыли поставить
echo '</ul>';
}То есть код из поста #10 нужно было дословно вставить (но с изменениями относительно $ii), потом мою функцию, а потом "Сейчас на сайте". Успехов!
Если я залил это в блок через , то в какую деректорию я должен пропписывать online.dat ?
AndrewE, а он сам пропишется в папку рядом со страницей, из которой будет вызываться функция. Не обращайте внимание ![]()
чёт оно не работает... я зашел как Администратор.. и Пользователем пробовал... мне пишет Пользователей: 0, Гостей: 1..
Меня считает как за гостя..
Сделал так:
Сейчас на сайте: <?=my_static();?>
<?
if ($member['id']) {
$lv = time ();
$ido = $member['id'];
$sql->update(array(
'table' => 'users',
'where' => array("id = $ido"),
'values' => array('last_visit' => $lv)
));
}
$deadlinetime = time() - 300;
$ii = 0;
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
$ii++;
}
echo '</ul>';
}
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';
?>Вроде работает.
P.S. Можно было-бы использовать код счетчика из новой версии Strawberry 1.2 Beta 4, которую создал Miksar, но.... подробно объяснить что где и как может, наверное, только сам Miksar. Хотя, видать, скоро ПРИДЁТСЯ создавать новые сайты на основании его работы ![]()
У меня все просто, к тому же полно комментариев ))
Написал раньше код со своим видением статистики на сайте, а затем заметил, что он работает только для категорий, созданных на сайте.
А вот на отдельных файлах, где можно создать отдельную тематику... вышеуказанный код не работает - проблема с путями к online.dat. Не помогло и написание различных видов путей...
Пришлось искать сторонний взгляд на подсчёта всех на сайте.
Создал отдельную таблицу в базе
CREATE TABLE sessions
(
id INT NOT NULL AUTO_INCREMENT,
session_id TEXT NOT NULL,
last_time INT NOT NULL,
PRIMARY KEY (id)
);В шаблонную страницу вставил код:
Сейчас на сайте: <?php
// Включаем сессию
session_start();
// Текущее время
$current_time = time();
// Подключаемся к MySQL
mysql_connect('localhost', 'root', '12345');
mysql_select_db('test');
// Выбираем пользователя с такой-же ID-сессий, как сейчас
$res = mysql_query("SELECT * FROM sessions WHERE session_id = '". session_id() ."'");
// Если такого пользователя не существует, то нужно создать его
if (!mysql_num_rows($res)) {
mysql_query("INSERT INTO sessions (session_id, last_time) VALUES('". session_id() ."', '". $current_time ."')");
}
else {
$row = mysql_fetch_array($res);
// Обновляем таблицу
mysql_query("UPDATE sessions SET last_time = '". $current_time ."' WHERE session_id = '". session_id() ."'");
};
$online_time = time() - 300;
// Выбираем пользователей, активность которых была не позднее 5-ти минут назад
$res = mysql_query("SELECT * FROM sessions WHERE last_time > '". $online_time ."'");
print mysql_num_rows($res);
?>
</label>
<?
if ($member['id']) {
$lv = time ();
$ido = $member['id'];
$sql->update(array(
'table' => 'users',
'where' => array("id = $ido"),
'values' => array('last_visit' => $lv)
));
}
$deadlinetime = time() - 300;
$ii = 0;
foreach ($users as $v) {
echo '<ul>';
if ($v['last_visit'] >= $deadlinetime) {
$ii++;
}
echo '</ul>';
}
echo '<label class=label3>Пользователей: '.$ii.'</label><br />'; //Количество зарегистрированных
$jj = mysql_num_rows($res); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo '<label class=label3>Гостей: '.$kk.'</label><br />';
?>В блоке
mysql_connect('localhost', 'root', '12345');
mysql_select_db('test'); нужно написать свои данные к базе ![]()
Вышла этакая мутация счётчика всех, кто на сайте со счётчиком с Клубники.
P.S. Грубо всё и топорно, но работает ![]()
Отредактировано olafsen (28 Feb 2011 17:40:25)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться