Jump to content
Sign in to follow this  
e1mer

[PHP] Список персонажей в сети

Recommended Posts

Может кому пригодиться, кому надо допишет необходимый функционал для себя, в принципе этого скрипта должно хватить, чтоб понять "как там все устроено". Вперед! :smile:

 

Скрипт отображает ник, профессию.

<?php
	$host = "ХОСТ MSSQL";
	$user = "Пользователь MSSQL";
	$pass = "Пароль";
	
	@mssql_connect($host, $user, $pass) or die("Ошибка: Невозможно найти хост: {$host}!");
	
	$query = mssql_query("SELECT * FROM GameDB.dbo.character WHERE mem_addr > 1");

	if (mssql_num_rows($query) > 0)  {
		for ($i=1; $table = mssql_fetch_assoc($query); $i++) {
			$page .= "{$table['cha_name']}, {$table['job']} <br />";
		}
		$hide = "Имя игрока, профессия, карта <br />{$page}";
	} else { 
		$hide = "Нет игроков в сети!";
	}
	print_r($hide);
?>
Edited by e1mer
  • Like 1

Share this post


Link to post
Share on other sites

@e1mer

1) Вместо запроса

SELECT * FROM GameDB.dbo.character WHERE mem_addr > 1

лучше использовать

SELECT cha_name, job FROM GameDB.dbo.character WHERE mem_addr > 1

2) Можно добавить кеширование, чтобы часто не дергать базу данных

Share this post


Link to post
Share on other sites
В 16.04.2016 в 11:34, V3ct0r сказал:

@e1mer

1) Вместо запроса


SELECT * FROM GameDB.dbo.character WHERE mem_addr > 1

лучше использовать


SELECT cha_name, job FROM GameDB.dbo.character WHERE mem_addr > 1

2) Можно добавить кеширование, чтобы часто не дергать базу данных

как сделать чтоб показывало кто из GM или HD онлайн? знаю что надо что то менять в запросе который идет к базе но не особо шарю в PHP, буду очень благодарен если подскажете, заренее спасибо.

Share this post


Link to post
Share on other sites

Привет, @kiberhack!

 

Тут кроме знания PHP нужно знать SQL - язык структурированных запросов. Чтобы вытащить GM-персонажей, которые онлайн, можно использовать такой запрос:

SELECT c.cha_name FROM character AS c LEFT JOIN account AS a ON (a.act_id = c.act_id) WHERE c.mem_addr > 0 AND a.gm > 0

В связке с PHP это будет выглядеть например так:

<?php

// Данные для соединения с MSSQL-сервером
$db_host = 'AMD';
$db_user = 'MDuser';
$db_pass = 'maindevru';

// Подключаемся к MSSQL-серверу...
if (mssql_connect($db_host, $db_user, $db_pass) == false) {
	die('<b>Ошибка:</b> Невозможно подключиться к MSSQL-серверу!');
}

// Выбираем базу данных GameDB
if (mssql_select_db('GameDB') == false) {
	die('<b>Ошибка:</b> Не удалось открыть базу данных GameDB!');
}

// Делаем SQL-запрос к базе данных
$sql = 'SELECT c.cha_name FROM character AS c LEFT JOIN account AS a ON (a.act_id = c.act_id) WHERE c.mem_addr > 0 AND a.gm > 0';
$query = mssql_query($sql);
if ($query == false) {
	die('<b>Ошибка:</b> Не удалось выполнить SQL-запрос на получение списка онлайн GM-персонажей!');
}

// Формируем список персонажей
$cha_online = array();
while ($cha = mssql_fetch_object($query)) {
	$cha_online[] = $cha->cha_name;
}

// Закрываем соединение с MSSQL-сервером (необязательно)
mssql_close();

?>


<html>

	<head>
		<title>Список GM онлайн</title>
	</head>

	<body>
	
		<h1>Список GM онлайн</h1>
		
		<?php
			// Печатаем список персонажей
			foreach ($cha_online as $cha_name) {
				echo $cha_name . '<br />';
			}
		?>
		
	</body>
	
</html>

 

  • Like 2

Share this post


Link to post
Share on other sites
1 час назад, V3ct0r сказал:

Привет, @kiberhack!

 

Тут кроме знания PHP нужно знать SQL - язык структурированных запросов. Чтобы вытащить GM-персонажей, которые онлайн, можно использовать такой запрос:


SELECT c.cha_name FROM character AS c LEFT JOIN account AS a ON (a.act_id = c.act_id) WHERE c.mem_addr > 0 AND a.gm > 0

В связке с PHP это будет выглядеть например так:


<?php

// Данные для соединения с MSSQL-сервером
$db_host = 'AMD';
$db_user = 'MDuser';
$db_pass = 'maindevru';

// Подключаемся к MSSQL-серверу...
if (mssql_connect($db_host, $db_user, $db_pass) == false) {
	die('<b>Ошибка:</b> Невозможно подключиться к MSSQL-серверу!');
}

// Выбираем базу данных GameDB
if (mssql_select_db('GameDB') == false) {
	die('<b>Ошибка:</b> Не удалось открыть базу данных GameDB!');
}

// Делаем SQL-запрос к базе данных
$sql = 'SELECT c.cha_name FROM character AS c LEFT JOIN account AS a ON (a.act_id = c.act_id) WHERE c.mem_addr > 0 AND a.gm > 0';
$query = mssql_query($sql);
if ($query == false) {
	die('<b>Ошибка:</b> Не удалось выполнить SQL-запрос на получение списка онлайн GM-персонажей!');
}

// Формируем список персонажей
$cha_online = array();
while ($cha = mssql_fetch_object($query)) {
	$cha_online[] = $cha->cha_name;
}

// Закрываем соединение с MSSQL-сервером (необязательно)
mssql_close();

?>


<html>

	<head>
		<title>Список GM онлайн</title>
	</head>

	<body>
	
		<h1>Список GM онлайн</h1>
		
		<?php
			// Печатаем список персонажей
			foreach ($cha_online as $cha_name) {
				echo $cha_name . '<br />';
			}
		?>
		
	</body>
	
</html>

спасибо

 

Share this post


Link to post
Share on other sites

Код у Макса в порядке, ничего лишнего, молодец!

Но замечания Виктора, конструктивны. Нет смысла выдергивать из БД не нужную информацию.

Share this post


Link to post
Share on other sites
12 часа назад, Chudik сказал:

Код у Макса в порядке, ничего лишнего, молодец!

 

Вот про что я тебе писал в соседней теме:

@mssql_connect($host, $user, $pass) or die("Ошибка: Невозможно найти хост: {$host}!");

Я даже не узнаю в чем проблема, когда скрипт не будет работать (@ перед вызовом функции). Зато ничего лишнего!

 

		for ($i=1; $table = mssql_fetch_assoc($query); $i++) {
			$page .= "{$table['cha_name']}, {$table['job']} <br />";
		}

Здесь прекрасно подойдет цикл while. Тут не нужен счетчик. Тоже ничего лишнего.

Share this post


Link to post
Share on other sites
7 часов назад, V3ct0r сказал:

Я даже не узнаю в чем проблема, когда скрипт не будет работать (@ перед вызовом функции).

Не правда. Ты увидишь "Ошибка: Невозможно найти хост: айпи сервера". Но не увидишь системных ошибок. Что в принципе, эстетично.

 

А цикл и счетчик, это выбор каждого. Мелочь. Как ты мне и писал в соседней теме. Главное ведь - работает.

Share this post


Link to post
Share on other sites
Цитата

Не правда. Ты увидишь "Ошибка: Невозможно найти хост: айпи сервера". Но не увидишь системных ошибок. Что в принципе, эстетично.

Что если я введу неверный пароль? Скрипт "найдет хост" и подключится, но MSSQL сервер вернет ошибку аутентификации. Так что "Ошибка: Невозможно найти хост: айпи сервера" ни о чем не говорит. Чтобы было эстетично, я отключу вывод системных ошибок на боевой машине в настройках PHP.

Share this post


Link to post
Share on other sites

Столкнулся с популярной проблемой. Вывод никнеймов персонажей показывает "?????" вместо русского ника.

Полазал, поискал на сторонних форумах. Не помогло.

Подскажите плиз)

Share this post


Link to post
Share on other sites
2 minutes ago, Graf said:

Столкнулся с популярной проблемой. Вывод никнеймов персонажей показывает "?????" вместо русского ника.

Полазал, поискал на сторонних форумах. Не помогло.

Подскажите плиз)

On 8/23/2016 at 12:07 PM, V3ct0r said:

@BotPRO, @kiberhack

Как вариант можно заменить SQL-запрос на


$sql = 'SELECT CONVERT (nvarchar(255), c.cha_name) COLLATE CYRILLIC_GENERAL_CI_AS AS cha_name, a.gm  FROM character AS c LEFT JOIN account AS a ON (c.act_id = a.act_id) WHERE c.mem_addr > 0 AND a.gm > 0';

 

 

onlinehdgm.png

Share this post


Link to post
Share on other sites
17 hours ago, Graf said:

Оно не работает. Я тестировал)

Что конкретно не работает?

Share this post


Link to post
Share on other sites
7 часов назад, V3ct0r сказал:

Что конкретно не работает?

Я меняю

SELECT cha_name, job FROM GameDB.dbo.character WHERE mem_addr > 1

На

SELECT CONVERT (nvarchar(255), c.cha_name) COLLATE CYRILLIC_GENERAL_CI_AS AS cha_name, a.gm FROM character AS c LEFT JOIN account AS a ON (c.act_id = a.act_id) WHERE c.mem_addr > 0 AND a.gm > 0

И русские символы не отображаются

Share this post


Link to post
Share on other sites
7 часов назад, Graf сказал:

Я меняю

SELECT cha_name, job FROM GameDB.dbo.character WHERE mem_addr > 1

На

SELECT CONVERT (nvarchar(255), c.cha_name) COLLATE CYRILLIC_GENERAL_CI_AS AS cha_name, a.gm FROM character AS c LEFT JOIN account AS a ON (c.act_id = a.act_id) WHERE c.mem_addr > 0 AND a.gm > 0

И русские символы не отображаются

Кодировку исполняемого файла смени.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×