Не можете получить доступ к XML-переменной в PHP из Flash?

1

Я отправляю некоторую информацию с PHP на флеш-память и отправляю другую информацию из PHP обратно в flash. Я отправляю идентификатор пользователя на 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 и просто "xml" как единственное, что отправляется на Flash, я могу получить к ней доступ с помощью "event.currentTarget.data", и он будет работать нормально.

Вспышка:

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
    Вы пробовали установить заголовок php как xml? header( "content-type: application/xml; charset=ISO-8859-15" );
  • 0
    Только что попробовал это, так же как заголовок ("content-type: text / xml"), оба сгенерировали ту же ошибку, что и раньше :(
Показать ещё 4 комментария
Теги:
actionscript-3
flash

1 ответ

1
Лучший ответ

Проблема заключается в вашем выходе из PHP.

Выведенный результат недействителен xml (из-за 3 в конце).

Вот почему он работает, когда вы удаляете индекс.

Чтобы исправить это, либо поместите индекс в xml (как атрибут корневого узла presets возможно), либо проанализируйте вывод перед преобразованием его в объект XML в AS3, например:

        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 и event.currentTarget.data.index, вам необходимо сделать следующее:

  1. Установите свойство dataFormat URLLoader в URLLoaderDataFormat.VARIABLES, чтобы он знал, как анализировать ответ как таковой.

  2. Отправьте с PHP строку с переменными в формате url. Таким образом, ваш ответ от php должен выглядеть следующим образом:

    xml=<xml></xml>&index=3
    

    Где <xml></xml> заменяется полным xml. Имейте в виду, что все данные должны будут следовать правилам форматирования переменных URL- rawurlencode, поэтому вам может понадобиться использовать escape (или rawurlencode в PHP) и 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);

  • 0
    Поэтому, возможно, я неправильно интерпретирую использование loader.data во флэш-памяти. Если у меня есть две переменные, которые я хочу отправить из PHP во Flash, одна из которых является объектом XML (xml), а другая - целым числом (индексом), могу ли я получить доступ к этим элементам отдельно через Flash? (то есть, event.currentTarget.data.xml , event.currentTarget.data.index ). Я ограничен только доступом к loader.data в целом?
  • 0
    Спасибо. Я помню сейчас, видя такие вещи. Я бы повторил это из PHP способом, похожим на echo "$xml=$xml->saveXML()"; ?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню