10

I know this is frequently asked, but I have looked all over the internet to find the mistake I'm making with the code I've used to send and receive data from AS3 to PHP and viceversa. Can you find the mistake? Here is my code:

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 inside of [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";    
?>

Thanks for your answers.

Julio Mendoza
  • 310
  • 1
  • 4
  • 11

3 Answers3

6

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

Updated the completed function... and corrected missing bracket.

Tom aka Sparky
  • 76
  • 1
  • 11
Jesse
  • 580
  • 4
  • 7
  • +1 that's exactly what I think the issue is (or at least one of them), the fact that he's accessing .done like it's property on the .data object, but in fact is not. –  Jul 29 '11 at 17:31
6

Your AS code seems to be right. So the problem might be in PHP. Please test first with this PHP file:

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

This should then let your movie trace "true". You then should debug your PHP. print_r($_POST); destroys your output of course. May be you did forget to remove this debugging statement :-)

@Jesse and @Ascension Systems, check the docs for URLVariables: http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/net/URLVariables.html

Kaken Bok
  • 3,395
  • 1
  • 19
  • 21
1

First of all, change this line of code:

trace(loader2.data.done);

to this:

trace(loader2.data);

You're outputting raw text from php, so your data object in flash is just gonna be raw text. It's not an object with .done attached to it. If you want to have a data structure then you need to create some XML or something inside PHP, print that out and then cast loader2.data as XML, like so:

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

However, if your XML is not formed correctly, you'll create an uncaught error in flash and crash your app, so make sure you use try/catch statements.