126

Re: php + sql чат

DimkaDimka сказал:

как же все таки отследить, что человек вышел из чата, не нажав exit?

С помощью JavaScript создаем таймер на 15 минут  после каждого добавленного сообщения и по истечении этого таймера выполняем запрос к серверу на удаление сессии и записи в БД, а так же переводим пользователя на страницу регистрации, то есть отсоединяем от чата. За минуту до истечения можно выводить в браузере соответствующее предупреждение о скором закрытии сессии. Почти все выполняется на стороне клиента, то есть в браузере, поэтому разбирайтесь с JavaScript и jQuery.

127 (изменено: DimkaDimka, 2011-04-08 07:26:45)

Re: php + sql чат

то есть, как я понял, после отправки сообщения на сервер сразу же посылается запрос об удалении ника из бд (который сработает только через время таймера - таймер видимо у сервера, а не у клиента)?

как то не очень понятно... например: вот создадите вы таймер на 10 минут, который по истечении этого времени отправит в бд ваш ник. прошло 5 минут. вы закрыли браузер и выключили компьютер. неужели через 5 минут ваш ник добавится в бд?)

128

Re: php + sql чат

DimkaDimka сказал:

таймер видимо у сервера, а не у клиента)?

Нет, таймер у клиента, это JavaScript таймер и по истечении времени он отсылает запрос на удаление пользователя из БД и очистку сессии.

К этому же относится: при добавлении пользователя в БД удалять из нее же всех с истекшим временем от последнего сообщения; если сессия не пуста, но в БД пользователей запись о нем удалена, то сессию очищать.

129

Re: php + sql чат

как я понимаю, нужно несколько обновить метод отправки сообщений:

$('.post').click(function(){
                
            var boxval = $("#content").val();
            var dataString = 'msg=' + encodeURIComponent(boxval);
            if(boxval.length > 0){
                if(boxval.length<200){
                    $("#flash").show();
                    $.ajax({
                        type: "POST",
                        url: "chatajax.php",
                        data: dataString,
                        success: function(html){
                            $("ol#update").append(html);
                            $("ol#update li:last").fadeIn(500);
                            $('#content').val('');
                            $('#content').focus();
                            $("#flash").hide();
                        }
                    });
                }
            
            }
            return false;
        });

не направите, так сказать?

130

Re: php + sql чат

DimkaDimka сказал:

как я понимаю, нужно несколько обновить метод отправки сообщений

А что вы делаете? Не вижу никаких изменений в коде.

131

Re: php + sql чат

все же не понимаю: если будет запущен таймер, а далее закрыт браузер - таймер сработает?!

132 (изменено: DimkaDimka, 2011-04-10 01:18:36)

Re: php + sql чат

в общем сделал так:
в <head>  добавил var u=0;
отправку сообщений дополнил:

$('.post').click(function(){
            
            clearInterval(u);
            var boxval = $("#content").val();
            var dataString = 'msg=' + encodeURIComponent(boxval);
            if(boxval.length > 0){
                if(boxval.length<200){
                    $("#flash").show();
                    $.ajax({
                        type: "POST",
                        url: "chatajax.php",
                        data: dataString,
                        success: function(html){
                            $("ol#update").append(html);
                            $("ol#update li:last").fadeIn(500);
                            $('#content').val('');
                            $('#content').focus();
                            $("#flash").hide();
                        }
                    });
                    
                    function exit15() {
                        window.location="exit.php"; 
                    }
                    u=setTimeout(exit15, 5000)
                }
            
            }
            return false;
        });

то есть получился редирект на exit.php через 5 секунд (ну естесственно сделаю побольше).
так вот вопрос:есть ли смысл в этом редиректе? напишу я сообщение, закрою браузер. удалюсь ли я из списка "онлайн"?
попробовал - не удаляюсь.

133

Re: php + sql чат

Все верно, только функцию exit15() лучше вынести из события click() и необходимо сбрасывать таймер перед его установкой.

window.clearTimeout(u);
u = window.setTimeout(exit15, 5000);

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

Теперь сделайте дублирующую проверку на стороне сервера. У вас есть механизм загрузки посетителей чата, добавьте в него проверку времени последнего сообщения пользователя (по сессии) и если время истекло, то удалите запись о нем из таблицы пользователей, очистите сессию и переведите пользователя на страницу регистрации.

134

Re: php + sql чат

вынес функцию из клика (вставил ее сразу после определения u)
я так подумал, что этот таймер не должен человека выкидывать из чата, а должен минут через 5 вывести сообщение, мол "вы сейчас в режиме "отошел", через 10 минут будете кикнуты".
ну и добавил этот таймер в загрузку последних 20 сообщений (просто получается, что зайдя в чат и ничего не написав - кикнут никогда не будешь, а теперь нормально)
ну и видимо таймер на стороне сервера уже будет кикать, так?

135

Re: php + sql чат

DimkaDimka сказал:

ну и видимо таймер на стороне сервера уже будет кикать, так?

Не понял про "кикать", это слово мне неизвестно. smile

А про сторону сервера я уже написал выше.

136

Re: php + sql чат

кикать - выкинуть из чата)

137

Re: php + sql чат

тоесть в online.php   SELECT добавить в if
в нем делать проверку на время. если меньше 15 минут - отвправить ник в div, а если больше - удалить из бд.
я все правильно понял?

138

Re: php + sql чат

DimkaDimka сказал:

тоесть в online.php   SELECT добавить в if
в нем делать проверку на время. если меньше 15 минут - отвправить ник в div, а если больше - удалить из бд.
я все правильно понял?

Вроде правильно. Пока не сделаете - не разберетесь.

139

Re: php + sql чат

в табице "online" хранится только время входа пользователя.
тоесть надо подключаться еще и к таблице "chat" и искать последнее сообщение от $_SESSION['name'] ? не подскажите, как сделать SELECT последнего сообщения по никнейму?

140

Re: php + sql чат

DimkaDimka сказал:

в табице "online" хранится только время входа пользователя.

Если нет необходимости хранить время входа пользователя, то лучше при добавлении сообщения менять значение времени в таблице online на время последнего сообщения, тогда не придется делать выборку из двух таблиц. Это самый простой вариант.

В любом случае, выбрать время последнего сообщения по имени можно так (проверяйте запросы в phpMyAdmin).

SELECT `time` FROM `online` WHERE `user` = "имя" ORDER BY `time` DESC LIMIT 1;

141

Re: php + sql чат

вы как всегда правы! при входе в таблицу online будет записано текущее время, а далее менять время на время последнего сообщения
тогда вообще не нужно будет подключаться к таблице 'chat'

142

Re: php + sql чат

дописал в chatajax.php строку:

 $sql1 = 'UPDATE `online` SET `time` = date() WHERE `user` = "' . addslashes($_SESSION['name']) . '"';

в таблице "online" поле time имеет тип timestamp

не подскажите, как дату добавить в таком же формате?

143

Re: php + sql чат

написал так:

$sql1 = 'UPDATE `online` SET `time` = CURRENT_TIMESTAMP() WHERE `user` = "' . addslashes($_SESSION['name']) . '"';
    mysql_query($sql1);

вроде работает

144

Re: php + sql чат

опять не очень понимаю
запрос в online.php:

$sql = 'SELECT `user` FROM `online`;';
if ($result = mysql_query($sql)) {
    while ($row = mysql_fetch_assoc($result)) {
        print '<li class="box" >'
            .   '&nbsp;&nbsp;<b><FONT color="#3A3A80">' . htmlspecialchars($row['user']) . '</FONT></b>
            </li>' . "\n";
    }
    }

из таблицы мы получаем только 'user', следовательно надо получать еще и время.
далее проверяем разницу с текущим временем и делаем выводы.
но опять же, закрыв браузер - из таблицы online удаляться же ничего не будет?

145

Re: php + sql чат

Попробуйте задействовать такой запрос.

SELECT COUNT(*) AS `count` FROM `online` WHERE `user` = "' . addslashes($_SESSION['name']) . '"
AND NOW() > DATE_ADD(`time`, INTERVAL 5 MINUTE)';

Если count вернет значение больше нуля, значит надо перенаправить пользователя на скрипт выхода. Обратите внимание, что перенаправить надо через отправку JavaScript.

На всякий случай отмечу, что функции CURRENT_TIMESTAMP() и NOW() - синонимы.

146 (изменено: DimkaDimka, 2011-04-10 23:42:15)

Re: php + sql чат

так опять же, закрыв браузер - пользователя никто никуда не переправит! его ник так и будет висеть "онлайн".

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

рассмотрим ситуацию: вы зашли в чат, написали сообщение в 18:00 и занялись своими делами. через 10 минут всплывает окно, мол "вы в режиме "отошел" ". ну вы не долго думав закрыли браузер. ваш ник до сих пор висит у всех пользователей в "онлайне".
еще через 5 минут У МЕНЯ запускается online.php, из таблицы "online" берется ВАША строка, сверяем время с текущим. разница больше 15 минут. удаляется ВАША запись из таблицы "online" и div. для всех пользователей вы уже "оффлайн".
далее ВЫ снова заходите в чат, происходит проверка на наличие вашей записи в таблице "онлайн". ну и так как ее нет - вас перекидывает на страницу авторизации.
значит необходимо добавить: таймер на перекидывание через 15 минут на страницу авторизации (для случаев, если вы НЕ закрыли браузер, а просто ничего не делаете в чате);

147

Re: php + sql чат

DimkaDimka сказал:

так опять же, закрыв браузер - проверки то никакой не произойдет?

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

148

Re: php + sql чат

этот форум и существует для подсказок)

149

Re: php + sql чат

а такой вопрос: можно ли сделать независимый скрипт, который постоянно запускается на сервере и не зависит от клиентов?
или это уже из уровня фантастики?)

150

Re: php + sql чат

DimkaDimka сказал:

можно ли сделать независимый скрипт, который постоянно запускается на сервере и не зависит от клиентов?

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