当前位置: 动力学知识库 > 问答 > 编程问答 >

javascript - 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'];
}
分享给朋友:
您可能感兴趣的文章:
随机阅读: