MU Online • PHP • Desenvolvimento Web
Scripts Úteis PHP para Sites de MU Online
Veja exemplos práticos de PHP para consultar dados do MU Online,
montar rankings, verificar jogadores online, buscar personagens,
consultar resets e integrar informações da database ao seu website.
Nível: Intermediário
Categoria: Desenvolvimento
PHP + SQL Server
Aprendiz MU Online
Antes de usar os exemplos
Os scripts abaixo são exemplos didáticos para sites de MU Online.
Os nomes das colunas podem variar conforme sua Server File.
Em estruturas clássicas você pode encontrar tabelas como:
MEMB_INFO
MEMB_STAT
Character
Guild
GuildMember
AccountCharacter
warehouse
Importante
Nunca exponha usuário e senha do SQL diretamente em páginas públicas.
Centralize a conexão em um arquivo de configuração protegido.
1. Conexão com SQL Server
Em projetos antigos que utilizam extensões MSSQL, uma conexão
pode seguir uma estrutura semelhante a:
<?php
$host = '127.0.0.1';
$usuario = 'sa';
$senha = 'SUA_SENHA';
$database = 'MuOnline';
$conexao = mssql_connect(
$host,
$usuario,
$senha
);
if(!$conexao){
die('Erro ao conectar no SQL Server.');
}
if(!mssql_select_db($database, $conexao)){
die('Erro ao selecionar a database.');
}
?>
PHP moderno
Em servidores atuais, prefira drivers suportados como
SQLSRV ou PDO_SQLSRV. O exemplo acima é mais comum em
projetos legados.
2. Mostrar quantidade de jogadores online
Muitas Server Files registram o status da conta na tabela
MEMB_STAT.
<?php
$sql = "
SELECT COUNT(*) AS total
FROM MEMB_STAT
WHERE ConnectStat > 0
";
$query = mssql_query($sql);
$dados = mssql_fetch_assoc($query);
echo intval($dados['total']);
?>
Normalmente:
ConnectStat = 0
Offline
ConnectStat > 0
Online
3. Ranking de Resets
Caso sua Server File utilize ResetCount,
um ranking simples pode ser montado assim:
<?php
$sql = "
SELECT TOP 10
Name,
Class,
ResetCount,
cLevel
FROM Character
WHERE ctlcode = 0 OR ctlcode IS NULL
ORDER BY
ResetCount DESC,
cLevel DESC
";
$query = mssql_query($sql);
while($char = mssql_fetch_assoc($query)){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
echo ' - ';
echo intval(
$char['ResetCount']
);
echo '<br>';
}
?>
Confira seu campo de reset.
Algumas Server Files utilizam Resets, ResetsG, ResetCount
ou uma coluna personalizada.
4. Ranking por Level
<?php
$sql = "
SELECT TOP 10
Name,
Class,
cLevel,
Experience
FROM Character
WHERE ctlcode = 0 OR ctlcode IS NULL
ORDER BY
cLevel DESC,
Experience DESC
";
$query = mssql_query($sql);
while($char = mssql_fetch_assoc($query)){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
echo ' - Level ';
echo intval(
$char['cLevel']
);
echo '<br>';
}
?>
5. Buscar personagem pelo nome
Evite inserir diretamente dados recebidos pelo usuário dentro
da consulta SQL.
Em sistemas legados, no mínimo faça validação rigorosa antes
de utilizar o valor.
<?php
$nome = isset($_GET['nome'])
? trim($_GET['nome'])
: '';
if(!preg_match('/^[a-zA-Z0-9_-]{1,10}$/', $nome)){
die('Nome inválido.');
}
$nomeSql = str_replace(
"'",
"''",
$nome
);
$sql = "
SELECT
Name,
Class,
cLevel,
ResetCount
FROM Character
WHERE Name = '" . $nomeSql . "'
";
$query = mssql_query($sql);
$char = mssql_fetch_assoc($query);
if($char){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
}else{
echo 'Personagem não encontrado.';
}
?>
6. Mostrar classe do personagem
A coluna Class normalmente armazena um código
numérico.
Você pode converter o valor para um nome amigável:
<?php
function nome_classe($classe)
{
$classes = array(
0 => 'Dark Wizard',
1 => 'Soul Master',
16 => 'Dark Knight',
17 => 'Blade Knight',
32 => 'Fairy Elf',
33 => 'Muse Elf',
48 => 'Magic Gladiator',
64 => 'Dark Lord'
);
if(isset($classes[$classe])){
return $classes[$classe];
}
return 'Classe desconhecida';
}
echo nome_classe(
intval($char['Class'])
);
?>
Os códigos podem variar conforme Season e implementação.
7. Consultar VIP da conta
Em muitas Server Files, o nível VIP está armazenado em:
MEMB_INFO.AccountLevel
Exemplo:
<?php
$login = 'usuario';
$loginSql = str_replace(
"'",
"''",
$login
);
$sql = "
SELECT
AccountLevel,
AccountExpireDate
FROM MEMB_INFO
WHERE memb___id = '" . $loginSql . "'
";
$query = mssql_query($sql);
$conta = mssql_fetch_assoc($query);
if($conta){
echo 'VIP: ';
echo intval(
$conta['AccountLevel']
);
}
?>
8. Converter AccountLevel em nome do VIP
<?php
function nome_vip($nivel)
{
switch(intval($nivel)){
case 1:
return 'Silver';
case 2:
return 'Prata';
case 3:
return 'Gold';
default:
return 'Free';
}
}
echo nome_vip(
$conta['AccountLevel']
);
?>
Ajuste os nomes de acordo com os planos utilizados pelo seu servidor.
9. Mostrar personagens de uma conta
<?php
$login = 'usuario';
$loginSql = str_replace(
"'",
"''",
$login
);
$sql = "
SELECT
Name,
Class,
cLevel,
ResetCount
FROM Character
WHERE AccountID = '" . $loginSql . "'
ORDER BY Name ASC
";
$query = mssql_query($sql);
while($char = mssql_fetch_assoc($query)){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
echo '<br>';
}
?>
10. Mostrar personagem conectado
Algumas estruturas utilizam AccountCharacter.GameIDC
para registrar o personagem atualmente conectado.
<?php
$sql = "
SELECT
GameIDC
FROM AccountCharacter
WHERE Id = 'usuario'
";
$query = mssql_query($sql);
$dados = mssql_fetch_assoc($query);
if(
$dados &&
isset($dados['GameIDC']) &&
trim($dados['GameIDC']) != ''
){
echo htmlspecialchars(
$dados['GameIDC'],
ENT_QUOTES,
'UTF-8'
);
}else{
echo 'Nenhum personagem conectado.';
}
?>
11. Ranking de PK
Caso a sua tabela Character possua PkCount:
<?php
$sql = "
SELECT TOP 10
Name,
PkCount
FROM Character
WHERE ctlcode = 0 OR ctlcode IS NULL
ORDER BY
PkCount DESC
";
$query = mssql_query($sql);
while($char = mssql_fetch_assoc($query)){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
echo ' - PK: ';
echo intval(
$char['PkCount']
);
echo '<br>';
}
?>
12. Ranking semanal
Se a sua Server File possui uma coluna como
ResetsWeek:
<?php
$sql = "
SELECT TOP 10
Name,
ResetsWeek
FROM Character
WHERE ctlcode = 0 OR ctlcode IS NULL
ORDER BY
ResetsWeek DESC
";
$query = mssql_query($sql);
while($char = mssql_fetch_assoc($query)){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
echo ' - ';
echo intval(
$char['ResetsWeek']
);
echo '<br>';
}
?>
13. Ranking mensal
<?php
$sql = "
SELECT TOP 10
Name,
ResetsMonth
FROM Character
WHERE ctlcode = 0 OR ctlcode IS NULL
ORDER BY
ResetsMonth DESC
";
$query = mssql_query($sql);
while($char = mssql_fetch_assoc($query)){
echo htmlspecialchars(
$char['Name'],
ENT_QUOTES,
'UTF-8'
);
echo ' - ';
echo intval(
$char['ResetsMonth']
);
echo '<br>';
}
?>
14. Mostrar quantidade total de contas
<?php
$sql = "
SELECT COUNT(*) AS total
FROM MEMB_INFO
";
$query = mssql_query($sql);
$dados = mssql_fetch_assoc($query);
echo intval(
$dados['total']
);
?>
15. Mostrar quantidade total de personagens
<?php
$sql = "
SELECT COUNT(*) AS total
FROM Character
";
$query = mssql_query($sql);
$dados = mssql_fetch_assoc($query);
echo intval(
$dados['total']
);
?>
16. Escapar saída HTML
Nunca imprima nomes e outros textos vindos da database
diretamente dentro do HTML.
Utilize:
<?php
echo htmlspecialchars(
$texto,
ENT_QUOTES,
'UTF-8'
);
?>
Isso reduz problemas de HTML quebrado e ajuda a evitar
injeção de conteúdo no navegador.
17. Validar números antes de usar
Para IDs, níveis, resets ou outros valores numéricos:
<?php
$id = isset($_GET['id'])
? intval($_GET['id'])
: 0;
if($id <= 0){
die('ID inválido.');
}
?>
Nunca confie diretamente em parâmetros recebidos pela URL.
18. Não exiba erros SQL em produção
Durante desenvolvimento pode ser útil visualizar erros.
Em produção, isso pode revelar informações internas.
Evite mensagens contendo:
- IP do SQL Server;
- usuário SQL;
- nome de tabelas internas desnecessárias;
- caminhos físicos;
- senhas;
- detalhes de conexão.
19. Centralize consultas repetidas
Em vez de repetir a mesma consulta em várias páginas,
crie funções reutilizáveis.
<?php
function total_online()
{
$sql = "
SELECT COUNT(*) AS total
FROM MEMB_STAT
WHERE ConnectStat > 0
";
$query = mssql_query($sql);
if(!$query){
return 0;
}
$dados = mssql_fetch_assoc($query);
return intval(
$dados['total']
);
}
echo total_online();
?>
20. Boas práticas para PHP em sites MU Online
- centralize a conexão com SQL;
- não exponha credenciais;
- valide dados recebidos por GET e POST;
- escape conteúdo antes de imprimir;
- evite consultas SQL desnecessárias;
- limite rankings com TOP;
- não permita que usuários comuns editem dados administrativos;
- mantenha backups da database;
- use HTTPS;
- prefira drivers SQL atuais quando possível.
Perguntas frequentes
PHP consegue acessar a database MuOnline?
Sim, desde que o servidor PHP possua um driver compatível
com o SQL Server e as credenciais tenham permissão na database.
Qual tabela mostra jogadores online?
Em muitas Server Files clássicas é utilizada a tabela
MEMB_STAT e o campo ConnectStat.
Qual campo usar para ranking de reset?
Depende da Server File. Pode ser ResetCount, Resets,
ResetsG ou outro campo personalizado.
É seguro utilizar usuário SA no site?
Não é o ideal. Prefira criar um usuário SQL específico
com apenas as permissões necessárias para o website.
Esses scripts funcionam em qualquer Season?
Não necessariamente. As tabelas e colunas podem variar,
então os exemplos devem ser adaptados à estrutura da sua database.
Conclusão
PHP pode ser utilizado para integrar praticamente todas as
informações principais de um servidor MU Online ao website,
desde rankings até status online e dados de personagens.
O mais importante é entender a estrutura real da sua database,
validar todas as entradas e evitar consultas inseguras.
Com uma base organizada, esses scripts podem servir como ponto
de partida para rankings, painéis de usuário, sistemas VIP,
páginas de personagens e diversas outras ferramentas.