Здравствуйте, гость ( Вход | Регистрация )

> Онлайн Статус Собственными Ручищами
Полезность материала
Понравилась статья?
Да [ 31 ] ** [72,09%]
Нет [ 1 ] ** [2,33%]
Многобукф [ 11 ] ** [25,58%]
Всего голосов: 43
Гости не могут голосовать 
Ozzy Osbourne
сообщение 23.10.2010, 21:09
Сообщение #1


*********

Grandmaster
Сообщений: 2.067
Регистрация: 5.8.2003
Группа: Пользователи
Наличность: 0
Пользователь №: 810
Возраст: 32



В связи с тем что вопрос создания статуса для сервера на сегодняшний день актуальный и в личку мне пришло пару сообщений по этому поводу - я расскажу вам как его создать своими ручищами при помощи mysql+php и чашки чая

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

В качестве сервера может выступать: ваш домашний компьютер, выделенный сервер (ddc) либо виртуальный сервер (vds/vps).
  1. Для начала установим apache+mysql на машину. Для этого мы будем использовать многофункциональный набор xampp (apache+mysql+php+perl). При его установке на нашу машину сразу станет нужный нам апач и mysql. Почитать подробнее можно на вики (http://ru.wikipedia.org/wiki/XAMPP)

    Заходим на официальный сайт в раздел Windows (http://www.apachefriends.org/en/xampp-windows.html) и качаем XAMPP Windows [EXE]

    После того как скачали - открываем и устанавливаем, к примеру на C:\xampp

    На рабочем столе находим ярлычек ”XAMPP Control Panel” и запускаем. Он нам открываем xampp панельку. Тыкаем на кнопку ”start” возле ”apache” и ”mysql”. Спустя пару секунд службы стартанут, а рядом станут активны кнопки ”admin”.

    (IMG:http://automum.od.ua/uosoft/1.jpg)

    Открываем браузер, вводим http://localhost/ в поле адреса, если на экране видим приветствие от xampp - значит пока что вы все сделали правильно.

  2. Теперь когда mysql и apache мы установили, следует научить сферу работать с базой. Для этого открываем sphere.ini и находим (или добавляем) следующий текст:

    Цитата
    // MySql configuration.
    MYSQL=1
    MySqlHost=localhost
    MySqlUser=root
    MySqlPassword=
    MySqlDatabase=sphere


    По умолчанию пользователь базы данных root с пустым паролем. В качестве названия базы данных я выбрал sphere, её мы создадим позже.

    Теперь запускаем сферу (spheresrv.exe). Если в логе сферы не видим ошибку ”MySQL connect fail” - значит подключение к базе прошло успешно. Закрываем сферу, она нам пока не нужна.

  3. В папке scripts находим файл sphere_serv_triggers.scp и открываем его блокнотом к примеру. Находим в нем функцию ”f_onserver_timer” и добавляем в конец:

    Цитата
    IF (<DB.Connected>==0)
    DB.Connect
    DB.Query "SET NAMES utf8"
    DB.Query "SET CHARACTER SET utf8"
    DB.Query "SET character_set_client='utf8'"
    DB.Query "SET character_set_connection='utf8'"
    DB.Query "SET character_set_results='utf8'"
    RETURN 0
    ENDIF

    DB.Execute "DELETE FROM clients"
    FOR i 0 <EVAL (<SERV.Clients>-1)>
    IF (<SERV.Client.<LOCAL.i>.IsOnline>==1)
    DB.Execute "INSERT INTO clients VALUES ("<SERV.Client.<LOCAL.i>.UID>","<SERV.Client.<LOCAL.i>.Name>","<SERV.Client.<LOCAL.i>.MEMORYFINDTYPE.memory_guild.LINK.ABBREV>",<SERV.Client.<LOCAL.i>.Karma>,<SERV.Client.<LOCAL.i>.Fame>,<SERV.Client.<LOCAL.i>.Kills>,<FVAL <SERV.Client.<LOCAL.i>.SkillTotal>>)""
    ENDIF
    ENDFOR


    Если функцию f_onserver_timer не нашли - ничего страшного, создайте её [FUNCTION f_onserver_timer] в конце файла (перед [eof]) и добавьте тот код что я написал выше.

    В двух словах расскажу что мы сделали. Мы определили функцию f_onserver_timer которая автоматически запускается сферой каждые N минут и проводит указанные действия. В данном случае функция проверяет есть ли подключение к базе, если есть: а) очищает таблицу clients. б) добавляет всех пользователей что сейчас онлайн в таблицу clients

    По умолчанию запуск f_onserver_timer в сфере отключен, поэтому открываем sphere.ini и находим:

    Цитата
    // Amount of minutes to call f_onserver_timer (0 disables this, default)
    TimerCall=0


    Я устанавливаю значение в 5 минут:

    Цитата
    // Amount of minutes to call f_onserver_timer (0 disables this, default)
    TimerCall=5


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

  4. Теперь нам понадобится создать эту самую базу ”sphere” и таблицу ”clients”. Запускаем с рабочего стола ярлычек ”Xampp Control panel” и нажимаем кнопку ”admin” рядом с ”mysql”. Нам открываем популярный инструмент для работы с базами - phpmyadmin

    (IMG:http://automum.od.ua/uosoft/2.jpg)

    Вводим название новой базы данных, а рядом обязательно указываем кодировку полей ”utf8_general_ci” (мы же умные люди и используем только utf8!) и нажимаем ”создать”.

    (IMG:http://automum.od.ua/uosoft/3.jpg)

    База создалась и появилась в левом меню. Кликаем по названию ”sphere (0)” и нам открывается страница таблиц этой базы. Естественно таблиц у нас там не каких еще нету. Так как у нас урок для новичков, рассказывать как в ручную создавать поля для таблицы и тп я не буду (хотя это достаточно просто), поэтому просто нажимайте кнопку ”SQL” в менюшке вверху и в появившемся окошке вводите следующий код:

    Цитата
    CREATE TABLE IF NOT EXISTS `clients` (
    `uid` varchar(255) NOT NULL,
    `name` varchar(255) NOT NULL,
    `ABBREV` varchar(255) NOT NULL,
    `karma` varchar(255) NOT NULL,
    `fame` varchar(255) NOT NULL,
    `kills` varchar(255) NOT NULL,
    `SkillTotal` varchar(255) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    Нажимаем ОК и наша таблица создана.

    Запускаем нашу сферу, конектимся к ней хотя бы одним чаром и идем курить на указанный ”TimerCall” минут. Только окошко с phpmyadmin не закрывайте, еще понадобится.

    Когда указанное время истекло и функция добавление чаров в базу уже отработала - открываем нами любимый phpmyadmin и тыкаем на название таблицы ”clients” (в левой части страницы), а затем на кнопочку ”обзор” - в правой верхней части страницы.

    (IMG:http://automum.od.ua/uosoft/5.jpg)

    (IMG:http://automum.od.ua/uosoft/6.jpg)

    Если все окей и данные в базу добавились - тогда вы их сразу там и увидите:

    (IMG:http://automum.od.ua/uosoft/4.jpg)

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

  5. В нашем случае ваш сайт это http://localhost/ (локальный) или <a href=\"http://ваш_реальный_ip\" target=\"_blank\"><a href="http://ваш_реальный_ip" target="_blank">http://ваш_реальный_ip</a></a> (доступный для всех юзеров интернета). Открываем папку где устанавливали xampp (C:\xampp ?), открываем там папку htdocs и удаляем все что там внутри.

    Создаем файлик index.php следующего содержания:

    Цитата
    <?php
    // тут я указал наши данные для подключения к mysql
    $link = mysql_connect('127.0.0.1', 'root', '');
    if (!$link) {
    die('Could not connect: ' . mysql_error());
    }
    // название нашей базы
    mysql_select_db("sphere");
    // далем запроса в базу на получение всех пользователей
    $result = mysql_query("SELECT * FROM `clients` WHERE 1");
    // тег pre - для красивого вывода
    echo '<h1>Статистика</h1><pre>';
    // пробегаем по полученному массиву где $row это текущий пользователь
    while ($row = mysql_fetch_assoc($result)) {
    // выводим данные пользователя на экран
    print_r($row);
    }
    // закрываем тег
    echo '</pre>';
    // закрываем соединение с базой
    mysql_close($link);


    Теперь открываем браузер, вводим <a href="http://ваш_реальный_ip" target="_blank"><a href="http://ваш_реальный_ip" target="_blank">http://ваш_реальный_ip</a></a> - и вуаля, статистика прямо у вас на экране.

    (IMG:http://automum.od.ua/uosoft/7.jpg)

    Вы наверное ждали статистику в красивой зеленой табличке, а получили просто данные на экран. Но ведь это самое главное! Теперь вы умеете доставать данные с базы, а оформить их по своему это 10 минут времени и знания хотя бы 1й главы html учебника. Лень? Окей, немного передохну и опубликую в этой статье пример файла index.php с оформлением данных в виде таблицы.

    А вот если статистики совсем нет - тогда читаем ответ ниже.


--------------------
Forest Wars
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
ImProV1zator
сообщение 10.11.2019, 3:10
Сообщение #2


*****

Journeyman
Сообщений: 346
Регистрация: 22.11.2009
Группа: Пользователи
Наличность: 0
Пользователь №: 12.232
Возраст: 20



Разобрался,всем спасибо
Код
<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql="SELECT name FROM clients ORDER BY name";

if ($result=mysqli_query($con,$sql))
  {
  // Return the number of rows in result set
  $rowcount=mysqli_num_rows($result);
  printf("Result set has %d rows.\n",$rowcount);
  // Free result set
  mysqli_free_result($result);
  }
mysqli_close($con);
?>


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 10.11.2019, 4:18
Сообщение #3


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8675
Пользователь №: 15.607



Цитата(ImProV1zator @ 10.11.2019, 1:10) *

Разобрался,всем спасибо
Код
<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql="SELECT name FROM clients ORDER BY name";

if ($result=mysqli_query($con,$sql))
  {
  // Return the number of rows in result set
  $rowcount=mysqli_num_rows($result);
  printf("Result set has %d rows.\n",$rowcount);
  // Free result set
  mysqli_free_result($result);
  }
mysqli_close($con);
?>



У тебя там count() не используется.

Код
SELECT COUNT(name) FROM clients;

Тебе вернется результат с 1 записью и 1 столбцом - количество записей в таблице clients.

То что ты сделал будет тоже работать. Но нахрена все имена из таблицы тащить и потом через пхп их считать, если можно просто попросить базу посчитать.

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

Цитата(ImProV1zator @ 10.11.2019, 0:51) *

Это как выбрать ячейки понятно
Код
SELECT COUNT(column_name)
FROM table_name
WHERE condition;


Не очень понятно как грамотно прописать where и echo, как вывести дальше?


WHERE не является обязательным.
Вот тут конкретный пример есть и можно посмотреть как работает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
DAMNED KING   Онлайн Статус Собственными Ручищами   23.10.2010, 21:09
DAMNED KING   Вопрос: Открываю http://мой_реальный_ип/ и вижу то...   23.10.2010, 21:21
DAMNED KING   Для вывода статуса в виде таблички - немного меняе...   23.10.2010, 21:34
Mirage   Тема нормальная. Только хотелось бы узнать в чем с...   24.10.2010, 16:14
DAMNED KING   Только хотелось бы узнать в чем существенные преи...   24.10.2010, 16:37
Destruction   Позволю себе не согласиться. Нагрузка будет выше ...   24.10.2010, 17:25
Mirage   MySQL хранит данные в файлах, если вы не знали. В...   24.10.2010, 20:39
Kanibal   Постоянно выскакивает вот это:   24.10.2010, 17:56
Soteric   Наверное запятая здесь на конце не нужна -- А э...   24.10.2010, 18:36
DAMNED KING   to Destruction Ох как я не люблю этот бредовый фл...   24.10.2010, 18:45
Kanibal   А это пчему выскакивает: :blink: ?   24.10.2010, 19:17
DAMNED KING   Почему то у тебя : Не отрабатывает. Сделай вот та...   24.10.2010, 19:19
Destruction   Я был вежлив.. и буду :) В ответ на твое мнение о...   24.10.2010, 23:02
DAMNED KING   Хватит засорять тему всяким бредом? Ага? Людей ко...   24.10.2010, 23:26
Warstone   Мда.. DAMNED KING, ты какой шард держишь-то? Мне п...   25.10.2010, 11:02
Phistan   DAMNED KING, советую не обращать на них внимания, ...   25.10.2010, 11:22
remiks   Очень полезный материал приношу свою благодарность...   25.10.2010, 14:24
Mirage   Поправьте меня если я ошибаюсь но мне кажется Dest...   25.10.2010, 15:10
DAMNED KING   Мда.. DAMNED KING, ты какой шард держишь-то? Мне ...   25.10.2010, 15:28
inkvizitor   MySQL query "INSERT INTO clients VALUES (...   28.3.2011, 11:18
Ozzy Osbourne   попробуй так: DB.Execute "INSERT INTO clients...   28.3.2011, 12:01
wap   LOL. :) У вас же скобки не хватает: <FVAL <S...   28.3.2011, 12:10
Ozzy Osbourne   LOL. :) У вас же скобки не хватает: <FVAL ...   28.3.2011, 12:14
inkvizitor   LOL. :) У вас же скобки не хватает: <FVAL ...   28.3.2011, 12:57
ImProV1zator   а как сюда впихнуть <FVAL <SERV.Client.<L...   15.7.2011, 12:38
ImProV1zator   пробавал вот так '<SERV.Client.<LOCAL.i...   16.7.2011, 20:39
ImProV1zator   разобрался '<db.escapedata <SERV.Client....   16.7.2011, 20:50
optima171   Ставлю ан 56б под хампп, но выдяёт ошибку когда за...   10.2.2012, 15:53
WRWR   CREATE TABLE IF NOT EXISTS `clients` ...   3.3.2013, 23:34
Ozzy Osbourne   Угу конечно, был молод и глуп :) Вобще если бы пи...   4.3.2013, 20:35
WRWR   только не координально а кардинально :)   5.3.2013, 2:56
fantasyuo   00:03:ERROR:(sphere_serv_triggers....   1.12.2014, 1:06
fantasyuo   00:03:ERROR:(sphere_serv_triggers...   23.1.2015, 17:11
Sirocco   UP из-за системы счисления, и/или версии сферы.   23.1.2015, 23:46
Llirik   Нет тут походу надо написать что-то типа: IF ...   28.6.2018, 1:20
ImProV1zator   В базу записывает чаров, но из базы php скрипт не ...   1.11.2019, 17:05
ImProV1zator   <?php $link = mysqli_connect('loc...   1.11.2019, 19:14
$yst3m_3rr0r   Давай на PDO перейдем ... более универсальна 1...   2.11.2019, 0:10
ImProV1zator   query("SELECT * FROM `clients` ORD...   2.11.2019, 3:27
Aimed   query("SELECT * FROM `clients` OR...   3.11.2019, 19:14
ImProV1zator   Что такое "движок сайта"? CMS (Content...   4.11.2019, 6:15
ImProV1zator   На Html таже самая ошибка...   4.11.2019, 10:02
Juzzver   И чем это тебе мешает? В phpMyAdmin зайди на сай...   4.11.2019, 11:40
ImProV1zator   На Dle не меняется кодировка,если ее поменять то в...   4.11.2019, 12:10
Aimed   Т.е. база данных это теперь движок сайта?)))) А ка...   4.11.2019, 14:04
ImProV1zator   Help не отображает статус база sphere, подбаза cli...   6.11.2019, 3:05
ImProV1zator   Может надо что то в .htacces прописать, чтобы php ...   6.11.2019, 5:34
ImProV1zator   Сделал сортировку по именам, но таблица сбивается ...   6.11.2019, 16:36
Aimed   1. Notice: Undefined index: Name in /home...   6.11.2019, 18:43
$yst3m_3rr0r   Сделал сортировку по именам, но таблица сбивается...   7.11.2019, 1:49
ImProV1zator   Ну, таблицу уже сам состряпаешь с помощью HTML ...   7.11.2019, 3:28
Aimed   Ну, таблицу уже сам состряпаешь с помощью HTML и ...   7.11.2019, 12:47
Aimed   бл** зачем редактировать сообщение...   6.11.2019, 20:20
ImProV1zator   Получилось только вот так: https://ibb.co/tMjXN8z   7.11.2019, 3:50
ImProV1zator   Сделал вертикальную таблицу <table> <t...   7.11.2019, 4:02
Juzzver   Сделал вертикальную таблицу https://ibb.co/YdkF3h...   7.11.2019, 22:41
$yst3m_3rr0r   Сделал вертикальную таблицу [url=https://ibb.co/Y...   8.11.2019, 3:06
ImProV1zator   Спасибо, но мне больше нравится вертикальный вариа...   9.11.2019, 2:25
$yst3m_3rr0r   А что б SQL селект написать и пыхой сгенерировать...   7.11.2019, 17:01
Juzzver   Попробуй выводить никнейм по буквам в столбик, т...   9.11.2019, 6:31
ImProV1zator   Попробуй выводить никнейм по буквам в столбик, т...   9.11.2019, 9:12
Aimed   Попробуй выводить никнейм по буквам в столбик, т...   9.11.2019, 14:12
ImProV1zator   У меня вопрос, как сделать чтобы выводилось число ...   9.11.2019, 9:42
alfapvp   Я смотрю многие тут ка кфраера сидят на форуме. ка...   9.11.2019, 22:14
Aimed   Я смотрю многие тут ка кфраера сидят на форуме. к...   9.11.2019, 23:00
ImProV1zator   Это как выбрать ячейки понятно SELECT COUNT(co...   10.11.2019, 2:51


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.4.2024, 5:10
Designed by Nickostyle