Link Опубликовано 28 Июля 2004 Жалоба Поделиться Опубликовано 28 Июля 2004 В моде 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"); ?> Мод должен работать за исключением ошибок, описанных выше.Жду помощи. Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 30 Июля 2004 Жалоба Поделиться Опубликовано 30 Июля 2004 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'], ) );Сэкономишь процессорное время. Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 31 Июля 2004 Автор Жалоба Поделиться Опубликовано 31 Июля 2004 Немного подправил//------------------------------------------------- // 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 запроса, чтобы обновлял сессии подскажи подробнее, фантазии не хватает =) Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 31 Июля 2004 Жалоба Поделиться Опубликовано 31 Июля 2004 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 < час_назад Час_назад сам посчитаешь. Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 1 Августа 2004 Автор Жалоба Поделиться Опубликовано 1 Августа 2004 Не совсем понял как получился запрос с 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; }Если нет косяков, то можно заливать мод. Да? Или как?!=) Он вообще нужен кому? Кстати огромное спасибо Игсу, без него бы я долго разбирался с этой порнографией). Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 1 Августа 2004 Жалоба Поделиться Опубликовано 1 Августа 2004 Link Дык а зачем ты сессии стираешь? ИМХО, пусть все-таки этим делом сам форум занимается, ты просто условие поставь, чтоб не попадали лишние сессии в отображении. Так-то вроде ничего страшного, но все же. Если я правильно помню, сессии теперь раз в час убиваются, наверное не зря... Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 1 Августа 2004 Жалоба Поделиться Опубликовано 1 Августа 2004 $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 s2. 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' не работает вообще вообщем меняйте знаки больше на меньше и наоборот... Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 2 Августа 2004 Жалоба Поделиться Опубликовано 2 Августа 2004 winnie Так... просвещаю :1. во первых зачем надо делать алиас базе?Правильно. Привычка. поле 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' не работает вообщеЭто почему это оно не работает? Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 2 Августа 2004 Жалоба Поделиться Опубликовано 2 Августа 2004 theIggs Так... просвещаю: спасибо.. признаю свои ошибки как то не разобравшись сказал, НО теперь я подготовилси и так.. 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 Это ещё почему это? :\во первых лишний запрос - бесполезная трата времени- пусть форум занимается удалением/вставкой в своих базах нам это в данном случае ну вообще не нужно! Пользователи в онлайне ....остальное в принципе повторение выше сказанногоЕще раз спасибо за направление на путь истинный Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 2 Августа 2004 Жалоба Поделиться Опубликовано 2 Августа 2004 winnie не все работают на MySQL - думать будут почему не работает код.. ругать будут создателя..Это правильное замечание, но этим грешит и сам Мэтт... вообще говоря не знаю чего вы так долго думали почему не взяли готовый запрос из форума..Ой, и здесь 2.0 ИМХО не стоит игнорировать такие - очевидно полезные моменты.Да обычно моды пишут без особой интеграции с фичами форума... нехватка времени, всё такое. Хотя по сути - ты полностью прав.во первых лишний запрос - бесполезная трата времени- пусть форум занимается удалением/вставкой в своих базах нам это в данном случае ну вообще не нужно!Спорный вопрос... Вообще, идеалом для чистки таблиц от старых записей является IPBшный планировщик...Хотя твоё замечание принято. Еще раз спасибо за направление на путь истинныйТебе спасибо. Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 2 Августа 2004 Жалоба Поделиться Опубликовано 2 Августа 2004 ОФФ за это я перестаю уважать MySQL - пропускает очевидные ошибкиОфф. Он еще подзапросы не держит, хранимые процедуры и триггеры с генераторами... Так что о серъезности сей разработки нужно очень хорошо подумать . Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 2 Августа 2004 Жалоба Поделиться Опубликовано 2 Августа 2004 d1pro, зато он быстрый.А насчёт "очевидных ошибок" - ну да, если вы привыкли программить на яве, то конечно, а по мне дак PHP-подход рулит... Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 2 Августа 2004 Автор Жалоба Поделиться Опубликовано 2 Августа 2004 Смена скобок вобще ошибки сплошные выдает. И тупят сесси, когда скрипт стинает сессию, все пользователи превращаются в гостей, и приходится по новой заходить. Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 2 Августа 2004 Жалоба Поделиться Опубликовано 2 Августа 2004 Смена скобок вобще ошибки сплошные выдает. И тупят сесси, когда скрипт стинает сессию, все пользователи превращаются в гостей, и приходится по новой заходить.зы.. каких скобок? наверное знаков "больше" и "меньше" - так я же признал своюб ошибку - надо оставить все как есть, просто запрос с удалением сессий вообще убрать- вам он ни к чему Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 3 Августа 2004 Автор Жалоба Поделиться Опубликовано 3 Августа 2004 Тогда ники будут висеть час если я правильно понялСтати посетители больше в гостей не превращаются, это глюк был Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 3 Августа 2004 Жалоба Поделиться Опубликовано 3 Августа 2004 Link Почему это? Ты просто корректные условия выставь старые сессии будут просто игнорироваться... По идее... Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 3 Августа 2004 Автор Жалоба Поделиться Опубликовано 3 Августа 2004 Вапще прикол, убил удаление сэссий, но условие другое поставил, работает.Код тут://------------------------------------------------- // 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; }Критикуйте =) Ссылка на комментарий Поделиться на других сайтах Прочее
svetic24 Опубликовано 15 Августа 2004 Жалоба Поделиться Опубликовано 15 Августа 2004 А можеш написать готовый мод, чтобы все уже работало? Ссылка на комментарий Поделиться на других сайтах Прочее
TAPAKAH2 Опубликовано 15 Августа 2004 Жалоба Поделиться Опубликовано 15 Августа 2004 Да не помешалобы ! Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 16 Августа 2004 Автор Жалоба Поделиться Опубликовано 16 Августа 2004 23-го добавлю мод, ссылку кину и описалово. Ссылка на комментарий Поделиться на других сайтах Прочее
Link Опубликовано 24 Августа 2004 Автор Жалоба Поделиться Опубликовано 24 Августа 2004 Добавил в архив, смотрите там. Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения