将变量从JQUERY传递到PHP无法正常工作(未识别的索引)

时间:2017-12-10 21:54:28

标签: php jquery

我正在开发一个用php,jquery编写的游戏面板,并在服务器上使用BASH脚本(ubuntu)。我可以创建,停止,启动,重启和删除多种类型的游戏服务器。到目前为止一切都很好。

在过去的两天里,我一直在努力解决另一个问题,显示每个托管游戏服务器的控制台。在Ubuntu服务器上,我创建了一个BASH脚本,通过每次用户单击按钮时检索ID来启动和停止屏幕。在screen上,我使用-L命令创建了一个screenlog文件。从该日志文件我使用tail检索数据,然后我使用下面的代码每隔几秒更新一次文件:

 function Ajax()
    {
        var
            $http,
            $self = arguments.callee;

        if (window.XMLHttpRequest) {
            $http = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            try {
                $http = new ActiveXObject('Msxml2.XMLHTTP');
            } catch(e) {
                $http = new ActiveXObject('Microsoft.XMLHTTP');
            }
        }

        if ($http) {
            $http.onreadystatechange = function()
            {
                if (/4|^complete$/.test($http.readyState)) {
                    document.getElementById('ReloadThis').innerHTML = $http.responseText;
                    setTimeout(function(){$self();}, 1000);
                }
            };
            $http.open('GET', 'loadtxt.php' + '?' + new Date().getTime(), true);
            $http.send(null);
        }

    }

PHP代码:

<?php
include "SSH/Net/SSH2.php";
include "SSH/Net/ANSI.php";
include "dbconn.php";

echo $service = intval($_POST['pid']);

$ssh = new Net_SSH2("137.xxx.xxx.xxx");
@$ansi = new File_ANSI();
if (!$ssh->login('xxxxx', 'xxxxx')) {
    exit('Login Failed');
    }else{
      echo "Connected To Server!";
        $ssh->setTimeout(1);
        @$ansi->appendString($ssh->read());
        } 

    $filename = "/home/$service/screenlog.0";  
    $output = $ssh->exec('exec tail -n10 ' . $filename);
    echo str_replace(PHP_EOL, ' ', $output);   
    $ssh->disconnect()  
?>

我的问题从这里开始:每次用户点击一个名为“Console”的按钮时,我想使用模态窗口来显示控制台(如上所述)。这是我用于模态窗口的HTML代码:

 <div class="dialog" title="Basic dialog">
  <p><div id="console">
    <script type="text/javascript">
        setTimeout(function() {Ajax();}, 1000);
    </script>
    <div id="ReloadThis">Loading..</div>
  </div></p>
 </div>

和jquery代码:

      $( function() {
    $( ".dialog" ).dialog({

      autoOpen: false,
      show: {
        effect: "blind",
        duration: 1000
      },
      hide: {
        effect: "explode",
        duration: 1000
      }
    });

    $( ".consolebtn" ).on( "click", function() {
        var pid = $(this).data('pid');
        $.post( "loadtxt.php", { pid: pid });
    $( ".dialog" ).dialog( "open" );
    });
  } );

我正在使用这段代码来显示所创建的每个游戏服务器。

  <?php
  if($query->rowCount()):
   foreach($rows as $row){ ?>
     <tr>
       <td><?php echo $row['serviceID']; ?></td>
       <td><?php echo $row['clientID']; ?></td>
       <td><?php echo $row['serviceName']; ?></td>
       <td><?php echo $row['serviceType']; ?></td>
       <td><a data-pid = <?php echo $row['serviceID']; ?> class='startbtn' href= 'javascript:void(0)'><button>Start</button></a>&nbsp;&nbsp;
       <a class='stopbtn' data-pid=<?php echo $row['serviceID']; ?> href='javascript:void(0)'><button>Stop</button></a>
       &nbsp;<a data-pid = <?php echo $row['serviceID']; ?> class='restartbtn' href= 'javascript:void(0)'><button>Restart</button></a>&nbsp;
       <a data-pid = <?php echo $row['serviceID']; ?> class="consolebtn" href= 'javascript:void(0)'><button>Console</button></a>&nbsp;</td>
     </tr>
   <?php }  ?>
  <?php endif;  ?>

数据库中的每条记录都显示在页面上,有4个按钮:启动,停止,重启和控制台。 serviceID存储在每个按钮中,因此值通过PHP代码传输到服务器上的BASH脚本。但是,当jquery代码使用serviceID发送pid时,模式会显示一个错误,表示pid中的echo $service = intval($_POST['pid']);变量是一个未识别的索引。但变量实际上是发送的?我写了一个查询来测试它并且它有效:

try {
    $sql = "DELETE FROM services WHERE serviceID = :service";
    $query = $conn->prepare($sql);
    $query->bindParam(':service', $service);
    $query->execute();
} catch (PDOException $e) {
    echo 'Error delete';
    exit();

}

现在,当按下控制台按钮时,记录将被删除,并且模式窗口会出现与未识别索引相同的问题。使其工作的唯一方法是将实际ID放在loadtxt.php文件中,但这意味着它将永远不会自动为每个游戏服务器工作:

Modal window with the game console and pid error

我真的不知道如何解决这个问题。谁能给我一些建议?我刚开始使用PHP和Jquery,到目前为止,互联网是我最好的知识来源。

编辑:(因为我不确定我是否可以发布有关相关问题的其他帖子)

控制台显示效果很好。但我也想在模态中使用提交表单来引入命令。 html代码,在模态显示代码中:

  <form id="my_form_id">
    Command: <input type="text" name="screen_input" id="screen_input">
    <input type="submit" />
  <form>

这是我用来将用户输入传递到php文件的javascript代码:

            $(document).ready(function(){
            $('#my_form_id').on('submit', function(e){
                e.preventDefault();
                var screen_input = $('#screen_input').val();
                $.ajax({
                    type: "POST",
                    url: 'insert.php',
                    data: {screen_input: screen_input},
                    success: function(data){
                        alert(data);
                    }
                });
            });
        });

这是接收输入并将其发送到服务器上的游戏控制台的PHP:

<?php
//Extra Libs
include "SSH/Net/SSH2.php";
include "SSH/Net/ANSI.php";

$command = $_POST['screen_input'];

   $ssh = new Net_SSH2("137.74.106.13");
    @$ansi = new File_ANSI();
     if (!$ssh->login('test', 'Irefutabil1,.@')) {
     exit('Login Failed');
          }else{
           echo "Connected To Server!";
            $ssh->setTimeout(5);
             $ansi->appendString($ssh->read());
            }
        $command = preg_replace('/\s+/', '\ ', $command);
        echo $ssh->exec("screen -S service253 -p 0 -X stuff " . $command . "'^M'");
        $ssh->disconnect();
?>

如果我使用实际的serviceID,我可以轻松地向控制台发送输入。但是,我需要它为每个控制台窗口自动获取ID。我如何将serviceID和输入命令都发送到php文件,以便我可以运行BASH命令?

1 个答案:

答案 0 :(得分:1)

每隔几秒钟就会运行一次:

$http.open('GET', 'loadtxt.php' + '?' + new Date().getTime

对包含此内容的文件发出GET请求:

echo $service = intval($_POST['pid']);

每次执行此操作$_POST['pid']未定义并抛出错误。

你应该把它包装成条件:

if (!empty($_POST['pid'])) {
    echo $service = intval($_POST['pid']);
}

或者将其更改为echo $service = intval($_REQUEST['pid']);,以便可以使用GETPOST请求设置您的变量,然后在您的javascript中,在任何函数之外,将pid声明为全局变量像这样var pid;

现在pid全局可用,因此您的所有代码都可用。在您的onclick函数中,这将设置为服务ID的值,因此您可以更改此行以包含它:

$http.open('GET', 'loadtxt.php' + '?' + new Date().getTime(), true);
像这样:

$http.open('GET', 'loadtxt.php' + '?pid='+pid+'&s=' + new Date().getTime(), true);

现在,您的服务ID将通过您的设置和更新请求传递给服务器。