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

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

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


gigabar.png.c3c21d2a586d5395019e41be9510900b.png

По всем вопросам, обращайтесь [email protected]

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 сказал:

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

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

 

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


gigabar.png.c3c21d2a586d5395019e41be9510900b.png

По всем вопросам, обращайтесь [email protected]

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...