Отправка и получение данных от Flash AS3 до PHP

Я знаю, что это часто спрашивают, но я просмотрел по всему Интернету, чтобы найти ошибку, которую я делаю, с кодом, который я использовал для отправки и получения данных с AS3 на PHP и наоборот. Вы можете найти ошибку? Вот мой код:

AS3:

import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequestMethod;
import flash.events.Event;

submitbtn.addEventListener(MouseEvent.CLICK, sendData)

function sendData(event:MouseEvent):void
{
    var loader : URLLoader = new URLLoader;
    var urlreq:URLRequest = new URLRequest("http://[mydomain]/test.php");
    var urlvars: URLVariables = new URLVariables;
    loader.dataFormat = URLLoaderDataFormat.VARIABLES;
    urlreq.method = URLRequestMethod.POST;
    urlvars.uname = nametxt.text;
    urlvars.apellido = aptxt.text;
    urlvars.email = emtxt.text;
    urlvars.cedula = cctxt.text;
    urlvars.score = scoretxt.text;
    urlreq.data = urlvars;
    loader.addEventListener(Event.COMPLETE, completed);
    loader.load(urlreq);
}

function completed(event:Event): void
{
    var loader2: URLLoader = URLLoader(event.target);
    trace(loader2.data.done);
    resptxt.text = event.target.data.done;
}

PHP внутри [domain]/test.php:

<?php
    $username = $_POST["uname"];
    $apellido = $_POST["apellido"];
    $cedula = $_POST["cedula"];
    $email = $_POST["email"];
    $score = $_POST["score"];
    print_r($_POST);
    if (!($link=mysql_connect(databasemanager,username,password))) 
       { 
          echo "Error conectando a la base de datos."; 
          exit(); 
       } 
       if (!mysql_select_db(database,$link)) 
       { 
          echo "Error seleccionando la base de datos."; 
          exit(); 
       }
       try
       {
           mysql_query("insert into scores(name,lastName,email,document,score) values('$username','$apellido','$email','$cedula','$score')",$link);                
           print "done=true";          
       }
       catch(Exception $e)
       {
           print "done=$e->getMessage()";          
       }
       echo "done=true";    
?>

Спасибо за ваши ответы.

Ответ 1

Ваш код AS кажется правильным. Таким образом, проблема может возникать в PHP. Сначала проверьте этот файл PHP:

<?php
       echo "test=1&done=true";    
?>

Затем вы должны позволить вашему фильму трассировать "true". Затем вы должны отлаживать ваш PHP. print_r($_POST);, конечно, разрушает ваш вывод. Возможно, вы забыли удалить эту инструкцию для отладки: -)

@Jesse и @Ascension Systems, проверьте документы для URLVariables: http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/net/URLVariables.html

Ответ 2

Try

submitbtn.addEventListener(MouseEvent.CLICK, sendData);

function sendData(event:MouseEvent):void
  var urlreq:URLRequest = new URLRequest ("http://[mydomain]/test.php");
  urlreq.method = URLRequestMethod.POST; 

  var urlvars:URLVariables = new URLVariables(); 
  urlvars.uname = nametxt.text;
  urlvars.apellido = aptxt.text;
  urlvars.email = emtxt.text;
  urlvars.cedula = cctxt.text;
  urlvars.score = scoretxt.text;
  urlreq.data = urlvars;          

  var loader:URLLoader = new URLLoader (urlreq); 
  loader.addEventListener(Event.COMPLETE, completed); 
  loader.dataFormat = URLLoaderDataFormat.VARIABLES; 
  loader.load(urlreq); 
}

public function completed (event:Event):void{
  var variables:URLVariables = new URLVariables( event.target.data );
  resptxt.text = variables.done;
}

Обновлена ​​завершенная функция...

Ответ 3

Прежде всего, измените эту строку кода:

trace(loader2.data.done);

:

trace(loader2.data);

Вы выводите исходный текст из php, поэтому ваш объект данных во флэш-памяти просто будет сырым текстом. Это не объект с прикрепленным к нему. Если вы хотите иметь структуру данных, вам нужно создать какой-то XML или что-то внутри PHP, распечатать это, а затем лить loader2.data как XML, например:

var returnedData:XML = new XML(loader2.data);

Однако, если ваш XML-код не сформирован правильно, вы создадите неповрежденную ошибку во флэш-памяти и повредите ваше приложение, поэтому убедитесь, что вы используете инструкции try/catch.