将数据从Flash AS3发送到PHP并接收数据

10

我知道这个问题经常被问到,但我已经在互联网上搜索了很久,试图找到我在使用的代码中发送和接收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;
}

[domain]/test.php 中的 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";    
?>
谢谢你的回答。

2
请提供至少关于出错的具体信息。 - Kaken Bok
尝试在浏览器中直接运行您的PHP代码,将POST变量替换为GET以便于轻松测试。我怀疑您会在那里发现一个错误。 - shanethehat
这个 resptxt.text = event.target.data.done; 的结果是什么? - The_asMan
3个回答

6

尝试

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;
}

更新了已完成的函数...并更正了缺失的括号。


+1,这正是我认为的问题所在(或者至少之一),他像访问.data对象的属性一样访问.done,但实际上并不是。 - user562566

6

您的 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

发现 loader.dataFormat = URLLoaderDataFormat.VARIABLES;,加1分。 - shanethehat
你关于 print_r($_POST); 是正确的,那就是错误所在!!!感谢大家的回答,我会记住它们的。 - Julio Mendoza

1

首先,更改这行代码:

trace(loader2.data.done);

转换为:

trace(loader2.data);

你正在从PHP输出原始文本,因此你在Flash中的数据对象只是原始文本。它不是一个带有.done属性的对象。如果你想要一个数据结构,那么你需要在PHP中创建一些XML或其他东西,将其打印出来,然后将loader2.data强制转换为XML,像这样:

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

然而,如果您的XML格式不正确,将会在Flash中创建一个未捕获的错误并崩溃您的应用程序,因此请确保使用try/catch语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接