2013-11-10 6 views
1
<?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.

ответ

0

Для этого вы можете создать форму, указывающую на тот же URL.

<form action="<?= $_SERVER['REQUEST_URI'] ?>" method="post"> 
    Username: <input type="text" name="username" /> 
    <button type="submit">Send</button> 
</form> 

Когда форма отправлена, вы можете получить доступ к контенту ввода путем доступа $_POST['username']

if (isset($_POST['username'])) { 
    // your code here 
    echo 'Username: ' . $_POST['username']; 
} 
+0

Как получить доступ к тесту, если любой строка данных запроса соответствует представленному контенту? Кроме того, у моего php есть ошибка. – Minedude78910

+0

Да, почему вы поставили этот PHP-код внутри строки? ('$ string = ' GetPlayers())! == false):?>') –

+0

Я не знаю. Есть ли способ решить эту проблему без каруселей? – Minedude78910

Смежные вопросы