简体   繁体   中英

How can I call an on page PHP function by pressing a button?

<?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';
  }
 ?> 

Is my code. Basically what I am trying to do is query my Minecraft server. Check if a player is online by the text form on button click, and if not, deliver a message that says the player is not online, otherwise, keep the person logged in as they browse the site (dunno how to do this either...) The external query file is:

<?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 );
}
}

I would like to solve this in any way that I can. Thanks in advance and ask any questions you need :D.

You can create a form pointing to the same URL to accomplish that.

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

When the form is sent, you can access your input content by accessing $_POST['username']

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM