解决方案:
基本上,没有一个。 $ _Sock是一个资源,因此不能通过json_encode()传递。不幸的是,连接是通过$ .post建立的,这意味着它不能跨多个页面保存(除非像Jon建议的那样使用应用程序服务器。)
每次建立连接都没有特别的不便;它只是一种可以容忍的烦恼。我将不得不依赖于每次重新建立连接的模型,以便通过RCON服务器发送命令。
感谢Ryan和Jon的巨大帮助!
原帖:
我尝试了dataType: 'json'
,$.parseJSON()
和Header("Content-type: application/json")
,但是当我尝试返回json_encode()
数组或对象时,我遇到了这个错误:
Warning: json_encode(): type is unsupported, encoded as null
这是JavaScript $ .post:
$.post("rcon.php",
{
ip:server.ip,
port:server.rcon.port,
pwd:server.rcon.pwd
},
function(data){
alert(data);
$("#output").val($("#output").val()+data+"\n");
});
...这里是返回数据的PHP:
$r = new minecraftRcon($rconServer, $rconPort, $rconPass);
if ($r->Auth()) { $response = "Authenticated."; } else { $response = "Authentication failed."; }
echo json_encode($r);
我已经在这里待了3个小时。我根本不明白我需要做些什么才能让它发挥作用。我试过gettype
,它确认数据确实是一个对象。 json_encode
应该接受它,但它“不受支持”。请帮忙 - 我失去了理智。
的var_dump($ R):
<pre class='xdebug-var-dump' dir='ltr'>
<b>object</b>(<i>minecraftRcon</i>)[<i>1</i>]
<i>public</i> 'Password' <font color='#888a85'>=></font> <small>string</small><font color='#cc0000'>'derp'</font> <i>(length=4)</i>
<i>public</i> 'Host' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'localhost'</font> <i>(length=9)</i>
<i>public</i> 'Port' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'25575'</font> <i>(length=5)</i>
<i>public</i> '_Sock' <font color='#888a85'>=></font> <b>resource</b>(<i>4</i><font color='#2e3436'>,</font> <i>stream</i>)
<i>public</i> '_Id' <font color='#888a85'>=></font> <small>int</small> <font color='#4e9a06'>1</font>
</pre>
这基本上就是我要做的事情:
以上所有内容都将通过一个.php页面完成,输出会被警告并打印到textarea(有时根本不起作用。)
答案 0 :(得分:2)
如documentation所述,您无法使用json_encode
对资源类型进行编码。当前代码尝试执行此操作,因为类minecraftRcon
公开其值为资源的属性$_Sock
。
然而,目前尚不清楚为什么你的JS / PHP代码不能整体运作。由于您无法从PHP访问(或甚至查看)任何“内部”资源值,因此几乎可以肯定您并未尝试从JS执行此操作,因此虽然警告有效并且您应该修复它,但它可能不会对你目前的问题充满信心。
答案 1 :(得分:0)
您不能直接在json_encode()
中编码对象。
您需要将对象转换为数组,您可以使用以下内容:
$data = get_object_vars($r)
编码$data