<?php
// Edit this ->
define('MQ_SERVER_ADDR', 'XX.XXX.XXX.XXX');
define('MQ_SERVER_PORT', 25565);
define('MQ_TIMEOUT', 1);
// Edit this <-
// Display everything in browser, because some people can't look in logs for errors
Error_Reporting(E_ALL | E_STRICT);
Ini_Set('display_errors', true);
require __DIR__ . '/status/MinecraftQuery.class.php';
$Timer = MicroTime(true);
$Query = new MinecraftQuery();
try
{
$Query->Connect(MQ_SERVER_ADDR, MQ_SERVER_PORT, MQ_TIMEOUT);
}
catch(MinecraftQueryException $e)
{
$Exception = $e;
}
$Timer = Number_Format(MicroTime(true) - $Timer, 4, '.', '');
?>
<link href="css/bootstrap.css" rel="stylesheet" media="screen">
<div class="spanx"><p>
<h1>Login</h1>
Username:<br />
<input type="text" name="username" style="height: 30px; style="width: 220px; value="" />
<br/>
<button>Submit</button>
<?php // Example from PHP.net
$string = '<?php if(($Players = $Query->GetPlayers()) !== false): ?>
<?php foreach($Players as $Player): ?>';
if(stristr($string, 'Thisshouldbethestringfromthetextbox') === FALSE) {
echo 'Player is not online';
}
?>
Это мой код. В основном то, что я пытаюсь сделать, это запросить мой сервер Minecraft. Проверьте, находится ли игрок в интерактивном режиме с помощью текстовой формы при нажатии кнопки, а если нет, доставьте сообщение, в котором говорится, что игрок не подключен к сети, в противном случае держите его вошедшим в систему, когда они просматривают сайт (не знаю, как это сделать). .) внешний файл запроса:Как я могу вызвать функцию PHP на странице, нажав кнопку?
<?php
class MinecraftQueryException extends Exception
{
// Exception thrown by MinecraftQuery class
}
class MinecraftQuery
{
/*
* Class written by xPaw
*
* Website: http://xpaw.ru
* GitHub: https://github.com/xPaw/PHP-Minecraft-Query
*/
const STATISTIC = 0x00;
const HANDSHAKE = 0x09;
private $Socket;
private $Players;
private $Info;
public function Connect($Ip, $Port = 25565, $Timeout = 3)
{
if(!is_int($Timeout) || $Timeout < 0)
{
throw new InvalidArgumentException('Timeout must be an integer.');
}
$this->Socket = @FSockOpen('udp://' . $Ip, (int)$Port, $ErrNo, $ErrStr, $Timeout);
if($ErrNo || $this->Socket === false)
{
throw new MinecraftQueryException('Could not create socket: ' . $ErrStr);
}
Stream_Set_Timeout($this->Socket, $Timeout);
Stream_Set_Blocking($this->Socket, true);
try
{
$Challenge = $this->GetChallenge();
$this->GetStatus($Challenge);
}
// We catch this because we want to close the socket, not very elegant
catch(MinecraftQueryException $e)
{
FClose($this->Socket);
throw new MinecraftQueryException($e->getMessage());
}
FClose($this->Socket);
}
public function GetInfo()
{
return isset($this->Info) ? $this->Info : false;
}
public function GetPlayers()
{
return isset($this->Players) ? $this->Players : false;
}
private function GetChallenge()
{
$Data = $this->WriteData(self :: HANDSHAKE);
if($Data === false)
{
throw new MinecraftQueryException('Offline');
}
return Pack('N', $Data);
}
private function GetStatus($Challenge)
{
$Data = $this->WriteData(self :: STATISTIC, $Challenge . Pack('c*', 0x00, 0x00, 0x00, 0x00));
if(!$Data)
{
throw new MinecraftQueryException('Failed to receive status.');
}
$Last = '';
$Info = Array();
$Data = SubStr($Data, 11); // splitnum + 2 int
$Data = Explode("\x00\x00\x01player_\x00\x00", $Data);
if(Count($Data) !== 2)
{
throw new MinecraftQueryException('Failed to parse server\'s response.');
}
$Players = SubStr($Data[ 1 ], 0, -2);
$Data = Explode("\x00", $Data[ 0 ]);
// Array with known keys in order to validate the result
// It can happen that server sends custom strings containing bad things (who can know!)
$Keys = Array(
'hostname' => 'HostName',
'gametype' => 'GameType',
'version' => 'Version',
'plugins' => 'Plugins',
'map' => 'Map',
'numplayers' => 'Players',
'maxplayers' => 'MaxPlayers',
'hostport' => 'HostPort',
'hostip' => 'HostIp'
);
foreach($Data as $Key => $Value)
{
if(~$Key & 1)
{
if(!Array_Key_Exists($Value, $Keys))
{
$Last = false;
continue;
}
$Last = $Keys[ $Value ];
$Info[ $Last ] = '';
}
else if($Last != false)
{
$Info[ $Last ] = $Value;
}
}
// Ints
$Info[ 'Players' ] = IntVal($Info[ 'Players' ]);
$Info[ 'MaxPlayers' ] = IntVal($Info[ 'MaxPlayers' ]);
$Info[ 'HostPort' ] = IntVal($Info[ 'HostPort' ]);
// Parse "plugins", if any
if($Info[ 'Plugins' ])
{
$Data = Explode(": ", $Info[ 'Plugins' ], 2);
$Info[ 'RawPlugins' ] = $Info[ 'Plugins' ];
$Info[ 'Software' ] = $Data[ 0 ];
if(Count($Data) == 2)
{
$Info[ 'Plugins' ] = Explode("; ", $Data[ 1 ]);
}
}
else
{
$Info[ 'Software' ] = 'Vanilla';
}
$this->Info = $Info;
if($Players)
{
$this->Players = Explode("\x00", $Players);
}
}
private function WriteData($Command, $Append = "")
{
$Command = Pack('c*', 0xFE, 0xFD, $Command, 0x01, 0x02, 0x03, 0x04) . $Append;
$Length = StrLen($Command);
if($Length !== FWrite($this->Socket, $Command, $Length))
{
throw new MinecraftQueryException("Failed to write on socket.");
}
$Data = FRead($this->Socket, 2048);
if($Data === false)
{
throw new MinecraftQueryException("Failed to read from socket.");
}
if(StrLen($Data) < 5 || $Data[ 0 ] != $Command[ 2 ])
{
return false;
}
return SubStr($Data, 5);
}
}
Я хотел бы решить эту проблему каким-либо образом, что я могу. Заранее благодарим и задаем любые вопросы, которые вам нужны: D.
Как получить доступ к тесту, если любой строка данных запроса соответствует представленному контенту? Кроме того, у моего php есть ошибка. – Minedude78910
Да, почему вы поставили этот PHP-код внутри строки? ('$ string = ' php if (($ Players = $ Query-> GetPlayers())! == false):?>') –
Я не знаю. Есть ли способ решить эту проблему без каруселей? – Minedude78910