通过PHP从MySQL检索信息到AS3

时间:2013-03-29 18:47:58

标签: php mysql actionscript-3 flash

我目前正在做一个在TutsPlus上找到的教程。 本教程是通过PHP将信息从AS3保存到MySQL,然后检索此信息。

到目前为止,它有效。我可以输入用户名和分数,保存到数据库。但是有一个问题,我希望能够在表格中显示所有名称和分数,而不必搜索名称,然后找到该特定用户的分数。

保存信息的代码(可以使用),如下所示。

package {

import flash.display.*; 
import flash.events.*;
import flash.net.*;

public class register extends MovieClip {

    public function register ():void {

        register_button.buttonMode = true;


        register_button.addEventListener(MouseEvent.MOUSE_DOWN, checkForm);

        username_text.text = "";
        userbio_text.text = "";

    }

    public function checkForm (e:MouseEvent):void {

        if (username_text.text != "" && userbio_text.text != "") {

            sendForm();

        } else {

            result_text.text = "PLEASE ENTER A NAME";

        }

    }

    public function sendForm ():void {

        /*
        we use the URLVariables class to store our php variables 
        */

        var phpVars:URLVariables = new URLVariables();

        phpVars.username = username_text.text;
        phpVars.userbio = userbio_text.text;

        /*
        we use the URLRequest method to get the address of our php file and attach the php vars.
        */

        var urlRequest:URLRequest = new URLRequest("localhost/php/register.php");

        /*
        the POST method is used here so we can use php's $_POST function in order to recieve our php variables.
        */

        urlRequest.method = URLRequestMethod.POST;

        /*
        this attaches our php variables to the url request
        */

        urlRequest.data = phpVars;      

        /*
        we use the URLLoader class to send the request URLVariables to the php file
        */

        var urlLoader:URLLoader = new URLLoader();
        urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;

        /*
        runs the function once the php file has spoken to flash
        */

        urlLoader.addEventListener(Event.COMPLETE, showResult);

        /*
        we send the request to the php file
        */

        urlLoader.load(urlRequest);

    }

    /*
    function to show result
    */

    public function showResult (e:Event):void {

        result_text.text = "" + e.target.data.result_message;

    }

}

}

从这里,我可以转到另一个应用程序并搜索用户名,然后显示该用户得分。代码如下:

package actions {


import flash.display.MovieClip;
import flash.events.*;
import flash.net.*;
import flash.text.*;

public class main extends MovieClip {

    public function main ():void {



        submit_button.buttonMode = true;


        submit_button.addEventListener(MouseEvent.MOUSE_DOWN, checkLogin);


        username.text = "";

    }



    public function checkLogin (e:MouseEvent):void {



            if (username.text == "") {

            username.text = "Enter your username";

            } 


        else {


            processLogin();

        }

    }

    public function processLogin ():void {


        var phpVars:URLVariables = new URLVariables();


        var phpFileRequest:URLRequest = new URLRequest("http://xx.xx.xx.uk/~bf93fv/Source%202/php/controlpanel.php");


        phpFileRequest.method = URLRequestMethod.POST;


        phpFileRequest.data = phpVars;


        var phpLoader:URLLoader = new URLLoader();
        phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES;           
        phpLoader.addEventListener(Event.COMPLETE, showResult);

        phpVars.systemCall = "checkLogin";
        phpVars.username = username.text;


        phpLoader.load(phpFileRequest);

    }


    public function showResult (event:Event):void {

        result_text.autoSize = TextFieldAutoSize.LEFT;

        result_text.text = "" + event.target.data.systemResult;

    }

}

}

controlpanel.php文件分别显示用户名和分数:

<?php
include_once "connect.php";
$username = $_POST['username'];
if ($_POST['systemCall'] == "checkLogin") {
$sql = "SELECT * FROM users WHERE username='$username'";
$query = mysql_query($sql);
$login_counter = mysql_num_rows($query);
if ($login_counter > 0) {
    while ($data = mysql_fetch_array($query)) {
        $userbio = $data["user_bio"];
        print "systemResult=$username Scored $userbio";
    }
}
else {
    print "systemResult=The login details dont match our records.";
}
}
?>

为了将数据库中的所有信息都查看到表中,有没有人知道任何简单的方法?

2 个答案:

答案 0 :(得分:2)

您可能希望在PHP代码中改进一些东西(AS3更好)。

  • 使用PDO代替适用于特定DBMS的函数。这样做的原因是它是便携式的(在某种程度上)。比方说,如果你想将数据库从MySQL移动到Postgres,你必须重写更少的代码,否则你将不得不重写。 PDO还提供了一些消毒输入的方法。它不是防弹 - 仍然没有更好。 PDO被认为是良好的实践&#34;,因此您将学会立即编写好的代码,而不是首先编写新的代码,然后发现如何正确地执行它。如果您正在考虑一个非常原始的任务(例如单个选择),那可能会稍微冗长一些,但只要您的任务变得稍微复杂一点,它就变得非常值得花时间。

  • 在SQL查询中,除非进行测试/调试,否则永远不要使用select *。这种懒惰最终会让你失去很多问题。通过这样做,您将很难在以后维护您的代码,有效地将其转换为&#34;编写一次 - 逃避&#34;之类的事情。再次,作为一个简单的概念证明,没关系, - 长期解决方案 - 不好。如果您仍然模糊我想说的话:明确列出所有列名称

  • 使用include / require及其_once系列作为长期解决方案是一个坏主意。再次,可以进行简单的测试 - 从长远来看不好。好的程序是用函数/类编写的,并使用__autoload()或使用自动加载类的能力的框架。这使得更大的应用程序更易于管理,更易于导航和理解,包括web。

  • 您必须清理来自您的网络应用程序用户的输入,即{not} $_POST['key']。至少编写一个函数来检查密钥是否存在以及它是否具有预期的格式。


现在,您的实际问题是,发送数据。

  • 您只需发送您在PHP中获得的原始SQL输出 - 将为您的服务器提供重新编码所有内容的问题。适用于非常简单的情况,但随着更复杂的任务变得更加复杂。这也是不常见的,所以你会发现人们不知道如何处理它。 (没有技术限制,它只是一个真正的历史文物)。

  • 有许多流行的格式可以被各种应用程序消化,而不是必需的Flash。那些包括XML,JSON,Protobuf。还有一些更特别的PHP,如serialize()生成的PHP。如果沿着这条路走下去,我强烈建议你坚持使用JSON。 XML可能是一种更为成熟的技术,但JSON具有内置的基本类型系统的优势(而在XML中它是另一层,除了其他东西没有在Flash中实现 - 我&#39;我在谈论XSL)。

  • 有AMF(ActionScript消息格式) - 它是Flash的理想选择。 PHP也非常清楚如何生成它(有几个流行的实现)。与JSON或XML相比,此格式更紧凑。它具有更强的表达能力(可以描述循环依赖关系,多对多关系,具有引入自定义类型的过程,自定义[de]序列化例程)。除非您使用自定义序列化例程,否则它也是自描述的。如果您不打算稍后将应用程序迁移到JavaScript,这是最佳选择,因为JavaScript在使用二进制数据时遇到问题。在那里解析这种格式是不可能的。

  • Protobuf也是一个可行的选择。这是Google设计的数据交换格式。它在精神上与AMF类似,但它可能不是自我描述的。它依赖于应用程序来了解如何从中生成自定义对象。但是,它有一个表单,可以用JavaScript解析(虽然你失去了紧凑性的好处)。


您的ActionScript代码:如果您选择AMF,则需要查看NetConnection课程。我建议你看看AMFPHP项目 - 它也有例子。或者,Zend Framework具有Zend_Amf库用于此目的。但是在开始时使用整个框架可能会让人势不可挡。

如果你使用XML - 那么它就是一个内置的XML类,网上有数百万个关于如何使用它的例子。

如果你使用JSON,那么不久之前还有一个内置的类。但在有一个之前,有几个库可以解析它。

在GoogleCode上曾经有一个项目用于Flash中的Protobuf支持,但它需要相当多的无罪释放和手工劳动才能开始。


最后,这里提到的事情索引:

http://php.net/manual/en/book.pdo.php - PDO

http://php.net/manual/en/function.json-encode.php - PHP中的JSON

http://php.net/manual/en/book.dom.php - PHP中的XML (如果考虑PHP,则没有就哪个XML库更好达成一致意见。我可能会坚持这个,但是ymmv)。 < / p>

http://www.silexlabs.org/amfphp/ - PHP中的AMF

http://framework.zend.com/manual/1.12/en/zend.amf.html Zend_Amf库

http://code.google.com/p/protobuf-actionscript3/ ActionScript中的Protobuf

https://github.com/drslump/Protobuf-PHP PHP Protobuf (对不起,从来没用过这个,但看起来不错)

http://www.blooddy.by/en/crypto/适用于旧版Flash播放器 - 此库拥有我所知的最佳JSON解码器。

答案 1 :(得分:0)

最好的方法是(我认为)使用XML。

在PHP端,脚本输出一个包含所有用户的XML文档:

$sql = "SELECT * FROM users "; // add order statement if needed
$query = mysql_query($sql);
$login_counter = mysql_num_rows($query);

$xml = array('<?xml version="1.0" encoding="UTF-8"?><users>');

if ($login_counter > 0) {

    while ($data = mysql_fetch_array($query)) {  

        $xml[] = '<user name="'.$data['username'].'" bio="'.$data["user_bio"].'" />';
    }

}
else {
    // do nothing
    // you will handle it on the flash side by checking the length of user nodes list
}
$xml[] = '</users>';
header('Content-Type:text/xml');
die(implode('', $xml));

这将输出一个XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<users>
 <user name="..." bio="..." />
 <user name="..." bio="..." />
 [...]
</users>

(PHP上有类,比如SimpleXML,以更清洁的方式处理XML)

AS Side:

您可以借助XML / XMLList类轻松浏览/显示闪存方面的数据

只需调整URLLoaderDataFormatTEXT并将数据转换为完整事件处理程序中的XML:

var xml:XML = new XML(event.target.data);

然后迭代用户元素以显示它们:

var users:XMLList = xml.user;
var user:XML;

for (user in users) {
 trace('name->' + user.attribute('name') );
 trace('bio->' + user.attribute('bio') );

}