Перейти к контенту

Функция "кто в онлайн" online в ssi.php


Рекомендуемые сообщения

В моде last_posts который работает через ssi.php используется sql запрос к базе, который выдает последние сообщения форума.

 

Немного переделав его, я сделал вывод пользователей которые находятся в онлайне, но при этом у меня возникают следующие ошибки:

1 Когда в онлайне никого нет, выдает ошибку.

2 Когда проходит более 15-ти обещанных скрипту минут, Ники почему-то не пропадают, а остаются на главной страничке (никлуд которой производится непосредственно из ssi.php) и изчезают только после того, как кто либо не зайдет на форум и не обновит информацию.

Вот такие проблемы. Скажите что поправить. Вот код будущей модификации:

case 'stats':
 do_stats();
 break;

после этого добавьте

//
case 'online':
 do_online();
 break;
//

2 в этом же файле найдите

echo $to_echo;

exit();

}

после этого вставьте

//-------------------------------------------------
//  online
//-------------------------------------------------
function do_online() {
global $DB, $ibforums, $root_path, $templates_dir, $std, $INFO;
$prefix    =  $INFO['sql_tbl_prefix'];
$template = load_template("online.html");
  $to_echo = "";
     
$DB->query( "SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0'
ORDER BY `running_time` DESC LIMIT 0 , 15;");
if ( ! $DB->get_num_rows() )
{
 fatal_error("Пусто");
}

while( $out = $DB->fetch_row($query) ) {
 $member_id =$out['member_id'];
    $author             = $out['member_name'];
 $to_echo  .= parse_template( $template,array (
 'member_id' => $member_id,
 'author'     => $author,
 'profile_link'   => $ibforums->base_url."?act=Profile&CODE=03&MID=".$out['member_id'],	) );
}

// Parse template

echo "<table cellpadding='1' cellspacing='1' border='1' width='100%' style='font-family:Verdana;font-size:11px'>";
echo "<tr>";
echo "<td align='left'><b>Кто в онлайне</b></td>";
echo "</tr>";
echo "<tr>";
echo "<td align='left'>";

echo $to_echo;

echo "</td>";
echo "</tr>";
echo "</table>";


}

3 В папке ssi_templates форума, создайте файл online.html в который вставьте код:

<table style='border:1px;width:100%;font-family:Verdana;font-size:10px'>
<tr>
<td>
В онлайне: <a href="{profile_link}">{author}</a>
</td>
</tr>
</table>

4 вставьте нижний код, в ту часть сайте, в которую хотите вставить онлайн посетителей.

<?php include("http://localhost/forum/ssi.php?a=online"); ?>

 

Мод должен работать за исключением ошибок, описанных выше.

Жду помощи.

Ссылка на комментарий
Поделиться на других сайтах

1 Когда в онлайне никого нет, выдает ошибку.

Какую? Насколько я понял, ты сам в этом случае выдаёшь ошибку - вот она:

if ( ! $DB->get_num_rows() )
{
 fatal_error("Пусто");
}

 

2 Когда проходит более 15-ти обещанных скрипту минут, Ники почему-то не пропадают, а остаются на главной страничке (никлуд которой производится непосредственно из ssi.php)

Может, наоборот - инклуд ssi.php происходит со странички?

Кстати, что у тебя с запросом?

"SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0'
ORDER BY `running_time` DESC LIMIT 0 , 15;"

Ты здесь ограничиваешь не время, а число показываемых пользователей. Чтобы показать всех пользователей, но за 15 минут, тебе нужно делать что-то вроде

"SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0' AND s.running_time>" . (time() - 15*60) . "ORDER BY `running_time` DESC;"

 

изчезают только после того, как кто либо не зайдет на форум и не обновит информацию.

Это само собой, это логично. Форум ведь не планировщик, а обычный скрипт, поэтому информацию о сессиях он может обновить только, если кто-то его запустит (т.е. пользователь залезет на форум).

Если хочешь держать инфу актуальной, впиши в самом начале своей функции дополнительнный SQL-запрос, который будет стирать все старые сессии (по дефолту IPB стирает сессии через час после создания (running_time)).

 

По мелочи:

global $DB, $ibforums, $root_path, $templates_dir, $std, $INFO;

Зачем тебе здесь $INFO? Во-первых, сам $INFO['sql_tbl_prefix'] ты дальше нигде не используешь, во-вторых, в $ibforums уже есть массив $ibforums->vars, в котором содержатся все те же значения, что в $INFO.

$member_id =$out['member_id'];
    $author             = $out['member_name'];

Лишние действия. ;) Почему просто не написать

 $to_echo  .= parse_template( $template,array (
 'member_id' => $out['member_id'],
 'author'     => $out['member_name'],
 'profile_link'   => $ibforums->base_url."?act=Profile&CODE=03&MID=".$out['member_id'], ) );

Сэкономишь процессорное время. :D

Ссылка на комментарий
Поделиться на других сайтах

Немного подправил

//-------------------------------------------------
//  online
//-------------------------------------------------
function do_online() {
global $DB, $ibforums, $root_path, $templates_dir, $std;
$template = load_template("online.html");
  $to_echo = "";
     
$DB->query( "SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0' AND s.running_time" . (time() - 15*60) . "ORDER BY `running_time` DESC;");

while( $out = $DB->fetch_row($query) ) {
 $to_echo  .= parse_template( $template,array (
 'member_id' => $out['member_id'],
    'author'     => $out['member_name'],
 'profile_link'   => $ibforums->base_url."?act=Profile&CODE=03&MID=".$out['member_id'],	) );
}

echo "<table cellpadding='1' cellspacing='1' border='1' width='100%' style='font-family:Verdana;font-size:11px'>";
echo "<tr>";
echo "<td align='left'><b>Кто в онлайне</b></td>";
echo "</tr>";
echo "<tr>";
echo "<td align='left'>";

echo $to_echo;

echo "</td>";
echo "</tr>";
echo "</table>";


}

С ошибкой я конечно скосячил, и префикс убрал, но твой запрос выдает ошибку такую:

mySQL error: You have an error in your SQL syntax near 'BY `running_time` DESC' at line 3

А насчет sql запроса, чтобы обновлял сессии подскажи подробнее, фантазии не хватает =)

Ссылка на комментарий
Поделиться на других сайтах

AND s.running_time" . (time() - 15*60) . "ORDER BY `running

Неправильно. В этом куске должно быть:

AND s.running_time > " . (time() - 15*60) . " ORDER BY `running

Вот тебе и ошибка в синтаксисе MySQL.

 

А насчет sql запроса, чтобы обновлял сессии подскажи подробнее, фантазии не хватает =)

Что-то вроде DELETE FROM ibf_sessions WHERE running_time < час_назад :D Час_назад сам посчитаешь.

Ссылка на комментарий
Поделиться на других сайтах

Не совсем понял как получился запрос с 15-ю минутами отображения на форуме, если сессии всеравно стираются по прошествии 15-ти минут(900сек). Но всетаки оно работает! Все отображается корректно, скрипт показывает всех посетителей, зашедших на форум и гуляющим по нему, если после их ухода не прошло 15-ти минут. Вот код вставки в ssi.php

//-------------------------------------------------
//  online
//-------------------------------------------------
function do_online() {
global $DB, $ibforums, $root_path, $templates_dir, $std;
$template = load_template("online.html");
  $to_echo = "";
     
$DB->query( "DELETE FROM ibf_sessions WHERE running_time < " . (time() - 900) . "");
     
$DB->query( "SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0' AND s.running_time > " . (time() - 15*60) . " ORDER BY `running_time` DESC;");

while( $out = $DB->fetch_row($query) ) {
  $to_echo  .= parse_template( $template,array (
  'member_id' => $out['member_id'],
    'author'     => $out['member_name'],
  'profile_link'   => $ibforums->base_url."?act=Profile&CODE=03&MID=".$out['member_id'],	) );
}
echo $to_echo;
}

Если нет косяков, то можно заливать мод. Да? Или как?!=) Он вообще нужен кому? Кстати огромное спасибо Игсу, без него бы я долго разбирался с этой порнографией).

Ссылка на комментарий
Поделиться на других сайтах

Link

Дык а зачем ты сессии стираешь? ИМХО, пусть все-таки этим делом сам форум занимается, ты просто условие поставь, чтоб не попадали лишние сессии в отображении. Так-то вроде ничего страшного, но все же. Если я правильно помню, сессии теперь раз в час убиваются, наверное не зря...

Ссылка на комментарий
Поделиться на других сайтах

$DB->query( "SELECT s.member_name, s.member_id, s.running_time FROM ibf_sessions s WHERE s.member_id != '0' AND s.running_time > " . (time() - 15*60) . " ORDER BY `running_time` DESC;");

 

запрос с кучей не нужного и бесполезного

1. во первых зачем надо делать алиас базе?

FROM ibf_sessions s

2.

WHERE s.member_id != '0'

поле member_id в базе ibf_sessions типа integer -числовое (по крайней мере в версии 2.0), а вы его с текстом сравниваете..

надо

WHERE s.member_id != 0

то есть 0(ноль) без кавычек

 

зы кстати либо я что то не понимаю либо...

$DB->query( "DELETE FROM ibf_sessions WHERE running_time < " . (time() - 900) . "");

здесь вы удаляете ссессии которым МЕнЬШЕ 15 минут жизни (во первых не ваше это дело заниматься удалением сессий, во вторых юзверей трете из онлайна;) они конечно вернуться при обновлении странички, но все же...)

потом вы

$DB->query( "SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0' AND s.running_time > " . (time() - 15*60) . " ORDER BY `running_time` DESC;");

выбираете все сессий у которых время жизни сессии БОЛЬШЕ 15 минут и условие s.member_id != '0' не работает вообще

вообщем меняйте знаки больше на меньше и наоборот:)

... :D

Ссылка на комментарий
Поделиться на других сайтах

winnie

Так... просвещаю ;) :

1. во первых зачем надо делать алиас базе?

Правильно. Привычка. :D

поле member_id в базе ibf_sessions типа integer -числовое (по крайней мере в версии 2.0), а вы его с текстом сравниваете..

MySQL понимает и так, и так.

здесь вы удаляете ссессии которым МЕнЬШЕ 15 минут жизни

Зайди в ibf_sessions, ознакомься с сутью поля running_time. Это НЕ промежуток - это время начала сессии. Значит, running_time < time() - 900 --> это все сессии СТАРШЕ 15 минут.

во первых не ваше это дело заниматься удалением сессий

Это ещё почему это? :\

во вторых юзверей трете из онлайна они конечно вернуться при обновлении странички, но все же...)

Пользователи в онлайне показываются по дефолту за 15 минут, так что никого мы не трём. Те, кто 15 минут назад был, так и так считаются ушедшими.

Кроме того, я говорил выше тереть сессии возрастом старше ЧАСА...

выбираете все сессий у которых время жизни сессии БОЛЬШЕ 15 минут

См. выше. Здесь мы выбираем сессии, время жизни которых МЕНЬШЕ 15 минут.

и условие s.member_id != '0' не работает вообще

Это почему это оно не работает?

Ссылка на комментарий
Поделиться на других сайтах

theIggs

Так... просвещаю:

:D спасибо.. признаю свои ошибки как то не разобравшись сказал, НО теперь я подготовилси;)

 

и так..

 

MySQL понимает и так, и так.

ОФФ за это я перестаю уважать MySQL - пропускает очевидные ошибки, советую все же для большей читабельности кода писать

s.member_id != 0

то есть без кавычек.. не все работают на MySQL - думать будут почему не работает код.. ругать будут создателя..

 

Зайди в ibf_sessions, ознакомься с сутью поля running_time.

познакомился.. и правда запрос в принципе правильный, НО позвольте мне за мою провинность его улучшить:)..

вообще говоря не знаю чего вы так долго думали почему не взяли готовый запрос из форума..:)

 

   $cut_off = $ibforums->vars['au_cutoff'] * 60;
	 $time    = time() - $cut_off;
	 $qe      = "";
	 if ( $ibforums->member['id'] )
	 {
   $qe = "member_id !=".intval($ibforums->member['id'])." AND ";
	 }
	 
	 $DB->simple_construct( array( 'select' => 'id, member_id, member_name, login_type, running_time, member_group',
           'from'   => 'sessions',
           'where'  => $qe." running_time > $time",
           'order'  => "running_time DESC"
        )      );
	 
	 
	 $DB->simple_exec();

то есть здесь мы привязываемся к глобальной переменной определенной в админке - од получается более гибким.. ИМХО не стоит игнорировать такие - очевидно полезные моменты.

заметьте здесь условие member_id != (числу) без кавычек... здесь правда выбираются все юзвери кроме вас ну можно просто для экспорта можно заменить s.member_id != 0 ХОТЯ так мы не видим гостей - что тоже думаю не верно гости прописываются в базе ibf_sessions с member_id == 0

 

Это ещё почему это? :\

во первых лишний запрос - бесполезная трата времени- пусть форум занимается удалением/вставкой в своих базах нам это в данном случае ну вообще не нужно!

 

 

Пользователи в онлайне ....

остальное в принципе повторение выше сказанного:)

Еще раз спасибо за направление на путь истинный;)

Ссылка на комментарий
Поделиться на других сайтах

winnie

не все работают на MySQL - думать будут почему не работает код.. ругать будут создателя..

Это правильное замечание, но этим грешит и сам Мэтт... :)

вообще говоря не знаю чего вы так долго думали почему не взяли готовый запрос из форума..

Ой, и здесь 2.0 :D

ИМХО не стоит игнорировать такие - очевидно полезные моменты.

Да обычно моды пишут без особой интеграции с фичами форума... нехватка времени, всё такое. Хотя по сути - ты полностью прав.

во первых лишний запрос - бесполезная трата времени- пусть форум занимается удалением/вставкой в своих базах нам это в данном случае ну вообще не нужно!

Спорный вопрос... Вообще, идеалом для чистки таблиц от старых записей является IPBшный планировщик...

Хотя твоё замечание принято. ;)

Еще раз спасибо за направление на путь истинный

Тебе спасибо. :)

Ссылка на комментарий
Поделиться на других сайтах

ОФФ за это я перестаю уважать MySQL - пропускает очевидные ошибки

Офф. Он еще подзапросы не держит, хранимые процедуры и триггеры с генераторами... Так что о серъезности сей разработки нужно очень хорошо подумать :D.

Ссылка на комментарий
Поделиться на других сайтах

d1pro, зато он быстрый.

А насчёт "очевидных ошибок" - ну да, если вы привыкли программить на яве, то конечно, а по мне дак PHP-подход рулит...

Ссылка на комментарий
Поделиться на других сайтах

Смена скобок вобще ошибки сплошные выдает. И тупят сесси, когда скрипт стинает сессию, все пользователи превращаются в гостей, и приходится по новой заходить.
Ссылка на комментарий
Поделиться на других сайтах

Смена скобок вобще ошибки сплошные выдает. И тупят сесси, когда скрипт стинает сессию, все пользователи превращаются в гостей, и приходится по новой заходить.

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

Ссылка на комментарий
Поделиться на других сайтах

Тогда ники будут висеть час если я правильно понял

Стати посетители больше в гостей не превращаются, это глюк был

Ссылка на комментарий
Поделиться на других сайтах

Link

Почему это? Ты просто корректные условия выставь старые сессии будут просто игнорироваться... По идее...

Ссылка на комментарий
Поделиться на других сайтах

Вапще прикол, убил удаление сэссий, но условие другое поставил, работает.

Код тут:

//-------------------------------------------------
//  online
//-------------------------------------------------
function do_online() {
global $DB, $ibforums, $root_path, $templates_dir, $std;
$template = load_template("online.html");
  $to_echo = "";

$DB->query( "SELECT s.member_name, s.member_id, s.running_time
FROM ibf_sessions s
WHERE s.member_id != '0' AND s.running_time > " . (time() - 900) . " ORDER BY `running_time` DESC;");

while( $out = $DB->fetch_row($query) ) {
 $to_echo  .= parse_template( $template,array (
 'member_id' => $out['member_id'],
    'author'     => $out['member_name'],
 'profile_link'   => $ibforums->base_url."?act=Profile&CODE=03&MID=".$out['member_id'],	) );
}
echo $to_echo;
}

Критикуйте =)

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...
  • 2 недели спустя...
Гость
Эта тема закрыта для публикации сообщений.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.