Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 11.06.2011, 20:44   #1
Заблокирован
 Разведчик
Аватар для Я убью:Frost:DD
 
Я убью:Frost:DD на правильном пути
Регистрация: 06.06.2011
Сообщений: 20
Популярность: 74
Сказал(а) спасибо: 65
Поблагодарили 32 раз(а) в 22 сообщениях
 
Post Реализация системы онлайн-оффлайн с использованием XmlHttpRequest

Привет всем Сегодня я решил рассказать вам о своем способе реализации системы онлайн-оффлайн на форумах сайтов. Не секрет, что при написании самодельных форумных движков, наиболее серьезные проблемы вызывает система онлайн-оффлайн. Сам долго думал, как же реализовать эту систему... Были мысли создания базы онлайн-юзеров, которые бы периодически очищались, заполнялись снова, снова очищались и так далее. Но, во-первых, такая система сложна, во-вторых, она непродуктивна, имеет довольно высокий процент ошибки. Но спустя некоторое время мне в голову пришла мысль, как все это сделать проще и качественнее. Как говорится, все идеальное просто. Ну, это было предисловие.

Перейдем непосредственно к теме обсуждаемого вопроса

Предполагается, что у наших пользователей в куках записано их собственное id (идентификатор). Куки проходят валидацию при открытии страницы на предмет соответствия их правильным кукам, хранящимся в БД по принципу сравнения с помощью функции mysql_fetch_array, далее при успешной авторизации открывается возможность проводить операции с куками. Таким образом, при подстановке в куки хакерского деструктивного запроса, валидация путем сравнения входящих кук и настоящих, хранящихся в базе, не пройдет, и авторизация в целом успешной не будет =). А у нас все процессы идут в случае успешной авторизации. Таким образом, возможность SQL-инъекции по кукам в данном случае не проходит. Но это особенности движка, теперь перейдет непосредственно к реализации системы онлайн-оффлайн

Она проста, но эффективна. Отражает наиболее точное положение статуса пользователей на данный момент.

Сначала создаем файл online.php со следующим содержанием
php highlight:
<?php
include "auth.php"; /* вставляем скрипт авторизации, в котором содержится заодно и параметры подключения к БД MySQL. При неудачной авторизации переменная $p=0, при удачной не равна нулю */
if($p!=0) //используем скрипт только для авторизованных пользователей
{
$id=$_COOKIE['id']; //берем куки пользователя
mysql_query("UPDATE users SET online='0' WHERE id='$id'"); //заносим в базу то, что пользователь вышел в онлайн.
}
?>
Теперь нам надо создать скрипт offline.php, содержание будет почти идентично за исключением одного момента.
php highlight:
<?php
include "auth.php"; /* вставляем скрипт авторизации, в котором содержится заодно и параметры подключения к БД MySQL. При неудачной авторизации переменная $p=0, при удачной не равна нулю */
if($p!=0) //используем скрипт только для авторизованных пользователей
{
$id=$_COOKIE['id']; //берем куки пользователя
mysql_query("UPDATE users SET online='1' WHERE id='$id'"); //заносим в базу то, что пользователь вышел в оффлайн.
}
?>
Спешу отметить, что в базе колонка id и оnline должна иметь тип INT (целочисленное значение).

Теперь нам надо организовать вызов скриптов по определенным событиям, а именно при загрузке и выгрузке страницы. Поможет нам в этом метод XmlHttpRequest, который осуществляет фоновый обмен информацией между клиентом и сервером.

Делаем файл onoff.js со следующим содержанием
code:
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function online() {
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', 'online.php', true);
xmlhttp.send(null);
}
function offline() {
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', 'offline.php', false);
xmlhttp.send(null);
}
Теперь вставляем этот скрипт в код нашей страницы
html highlight:
<script src='onoff.js' type='text/javascript'></script>
И делаем обработчик вобытия
php highlight:
<?php
if($p!=0)
{
echo "<body onload='online()' onunload='offline()'>";
}
else
{
echo "<body>";
}
?>
В принципе, чтобы не загружать этими onload'ами и онанлоадами страницу, можно установить обработчики в скрипте с помощью jQuery. Но можно и так.

Теперь небольшой кусок кода, который будет определять статус пользователя при отображении у того постов на форуме

php highlight:
<?php
/* $id - переменная, содержащая идентификатор пользователя, написавшего пост. Берется из базы данных. Опустим этот момент, потому как он зависит от различий между форумными движками */
$uselect=mysql_query("SELECT online FROM users");
$myresul=mysql_result($uselect, $id-1); //выбираем из базы инфу о статусе пользователя
if($uselect==0)
{
echo "<img src='online.jpg'>";
}
else
{
echo "<img src='offline.jpg'>";
}
?>
Есть один момент: при загрузке страницы скрипт выполняется в асинхронном режиме "за кулисами", незаметно для пользователя. А при выходе в синхронном, то есть браузер "подвисает" где-то на треть секунды, пока идет запрос на сервер. Можно сделать также асинхронно, но тогда браузер закроется моментально. У меня возникает настойчивое ощущение, что при закрытии браузера и отправке запроса в асинхронном режиме запрос просто не успеет сформироваться и отправиться, а вкладка/браузер закроются. Так что я пока делаю синхронно. Да и вообще, подвисание видно только на хроме, опера и мозилла закрывают моментально, хотя скрипт срабатывает все равно.

Вот в принципе и все, товарищи. Конечно, полная работоспособность системы возникает при подстановки и отрегулировании под конкретный форумный движок. Но главное, что я показал принцип реализации, так как это самое важное. Важнее всего разработать принцип, а реализовать всегда можно =)
  Ответить с цитированием
Пользователь сказал cпасибо:
ololoshnik212 (11.06.2011)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите розобратся с использованием скриптов ctac2208 Общение и обсуждение 0 05.02.2011 03:20
[Статья] Для новичков!!!Полезная информация!!!Перед использованием читов и т.д=))) rinar Общение и обсуждение Perfect World 5 16.07.2010 17:39
Проблема с использованием пакет-хака tuch1 Общение и обсуждение, архив Lineage 2 11 19.07.2009 20:53

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 12:25.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net