我正在从PHP向flash发送一些信息,并将一些不同的信息从PHP发送回flash。我将用户ID发送给PHP,并将XML变量和索引发送回Flash。
Flash代码:
var myLoader:URLLoader = new URLLoader();
var myRequest:URLRequest = new URLRequest(/*private info*/);
myRequest.method = URLRequestMethod.POST;
var memberInfo:URLVariables = new URLVariables();
memberInfo.member_id = 1817;
myRequest.data = memberInfo;
myLoader.addEventListener(Event.COMPLETE, onXMLLoad);
myLoader.load(myRequest);
function onXMLLoad(event:Event)
{
var newXML:XML = new XML(event.currentTarget.data.xml);
var index:int = new int(event.currentTarget.data.index);
}
PHP:
$xml = new DOMDocument("1.0");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$presets = $xml->createElement("presets");
$red = $xml->createElement("colors", "0xff0000");
$green = $xml->createElement("colors", "0x00ff00");
$blue = $xml->createElement("colors", "0x0000ff");
$presets->appendChild($red);
$presets->appendChild($green);
$presets->appendChild($blue);
$xml->appendChild($presets);
$index = 3;
echo $xml->saveXML();
echo $index;
当我这样做时,我收到此错误:
ReferenceError: Error #1069: Property xml not found on String and there is no default value.
我该如何解决这个问题?我认为它与XML实际上是一个字符串有关,但我不太确定。
以下是PHP的输出:
<?xml version="1.0"?>
<presets>
<colors>0xff0000</colors>
<colors>0x00ff00</colors>
<colors>0x0000ff</colors>
</presets> 3
注意: 如果我从PHP中删除索引变量,只需要&#34; xml&#34;作为唯一被发送到Flash的东西,我可以使用&#34; event.currentTarget.data&#34;来访问它。它会正常工作。
闪光:
var myLoader:URLLoader = new URLLoader();
var myRequest:URLRequest = new URLRequest(/*private info*/);
myRequest.method = URLRequestMethod.POST;
var memberInfo:URLVariables = new URLVariables();
memberInfo.member_id = 1817;
myRequest.data = memberInfo;
myLoader.addEventListener(Event.COMPLETE, onXMLLoad);
myLoader.load(myRequest);
function onXMLLoad(event:Event)
{
var newXML:XML = new XML(event.currentTarget.data);
}
PHP:
$xml = new DOMDocument("1.0");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$presets = $xml->createElement("presets");
$red = $xml->createElement("colors", "0xff0000");
$green = $xml->createElement("colors", "0x00ff00");
$blue = $xml->createElement("colors", "0x0000ff");
$presets->appendChild($red);
$presets->appendChild($green);
$presets->appendChild($blue);
$xml->appendChild($presets);
echo $xml->saveXML();
答案 0 :(得分:1)
问题在于PHP的输出。
显示的输出无效xml(因为最后的3
)。
这就是删除索引时它的工作原理。
要纠正它,要么将索引放在xml中(或许作为根presets
节点的属性),要么在将输出转换为AS3中的XML对象之前解析输出,如下所示:
var response:String = event.currentTarget.data;
var index:String = response.substr(response.lastIndexOf(">") + 1);
var newXML:XML = new XML(response.substring(0, response.lastIndexOf(">") + 1));
如果您希望能够将变量作为数据属性上的对象进行访问(例如event.currentTarget.data.xml
&amp; event.currentTarget.data.index
,那么您需要执行以下操作:
将URLLoader的dataFormat
属性设置为URLLoaderDataFormat.VARIABLES
,以便它知道如何解析响应。
从PHP发送一个url变量格式的字符串。因此,您对php的响应需要如下所示:
xml=<xml></xml>&index=3
用完整的xml替换<xml></xml>
。请注意,所有数据都需要遵循url变量格式规则,因此您可能需要在值上使用escape
(或PHP中为rawurlencode
)和unescape
(在AS3中)
这就是我认为php应该是这样的:
echo "xml=".$xml->saveXML();
echo "&index=".$index;
更容易,可能只是使用JSON并在PHP中创建一个对象并执行echo json_encode(obj)
,然后在flash中执行var response:Object = JSON.parse(event.currentTarget.data);