php - 在AS3中使用自定义类处理数据库查询

标签 php mysql actionscript-3 class urlvariables

我最近开始深入研究 AS3 中的自定义类(以磨练我的最佳实践编码习惯),并希望创建一个数据库类,该数据库类允许用户首先实例化一个类,该类包含类中方法所需的所有信息添加、删除、修改(等)MySQL 表中的行(通过 PHP)。当然,这涉及到使用URLRequest、URLLoader等。我的问题是,是否有人想出了一种方法,如何从专门包含 var 数据的方法返回数据,而不依赖于本质上调度事件的方法(然后必须创建一个监听器,而不是将其内置到类中)。例如,

var myDB:dataBase = new dataBase("dbase","table","username","pword");

//this creates an instance of a database class with methods like:

trace(myDB.fetch(1)); //gets first row of table as a delimited string

或者

if (myDB.delete(1)) {} 
//returns Boolean true if delete of row 1 was successful

我找到了下面的答案,其中包含创建返回事件的类的方法:

Combining URLRequest, URLLoader and Complete Event Listener In Actionscript 3.0?

但我希望该方法返回包含数据库数据或 bool 确认的字符串,而不是调度事件监听器。这是我制作的类(class)的示例:

package com.customClasses {
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequestMethod;
    import fl.events.DataChangeEvent;
    import flash.events.Event

    public class dataBase {
        public var dbs:String = "";
        public var usr:String = "";
        public var pwd:String = "";
        public var tab:String = "";
        var returnData:String = "";

    // Constructor
    public function dataBase(dbs:String, usr:String, pwd:String, tab:String) {
        this.dbs = dbs;
        this.usr = usr;
        this.pwd = pwd;
        this.tab = tab;
    }

    public function fetch(idn:uint, par:String):String { 
        var returnData:String = "blank";
        var vUrlReq:URLRequest = new URLRequest ("dBase.php");
        var vUrlVars:URLVariables = new URLVariables(); 

        function onLoadVarsComplete(event:Event): void {
            //retrieve success variable from our PHP script:
            if(event.target.data.msg == "success") {
                var rawData:URLVariables = new URLVariables( event.target.data );
                returnData = rawData.fromPHP;
            } else {
                returnData = "failed!";
            }
        }
        vUrlReq.method = URLRequestMethod.POST;    
        vUrlVars.dir=dbs; // name of table affected
        vUrlVars.alpha=usr; // username
        vUrlVars.beta=pwd;  // password
        vUrlVars.dbase=tab; // name of table affected
        vUrlVars.func="fetch"; // function for php script to use
        vUrlVars.idnum=idn; //if >0 search for record with that id
        vUrlReq.data = vUrlVars;
        var vLoader:URLLoader = new URLLoader (vUrlReq);
        vLoader.addEventListener("complete", onLoadVarsComplete);
        vLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
        vLoader.load(vUrlReq);

        return (returnData);
    }

returnData 返回“空白”...所以我意识到我的方法没有按预期工作。我还意识到 returnData 字符串存在一些范围问题,并且我正在使用嵌套函数(可能是禁忌)。不然还有什么想法吗?

最佳答案

要执行您想要的操作,您可以使用回调函数或 DataEvent听众,像这样:

DB.as:

package  {

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

    public class DB extends EventDispatcher {       

        public static const DATA_LOADED = 'data_loaded';

        public function DB() {
        }

        public function getDataUsingDataEvent(file_path:String):void {

            var url_loader:URLLoader = new URLLoader();
                url_loader.addEventListener(
                    Event.COMPLETE, 
                    function(e:Event):void
                    {
                        var event:DataEvent = new DataEvent(DATA_LOADED, true, false, url_loader.data);
                        dispatchEvent(event);
                    }
                )
                url_loader.load(new URLRequest(file_path));     
        }

        public function getDataUsingCallback(file_path:String, callback:Function):void {

            var url_loader:URLLoader = new URLLoader();
                url_loader.addEventListener(
                    Event.COMPLETE, 
                    function(e:Event):void 
                    {
                        callback(url_loader.data);
                    }
                )
                url_loader.load(new URLRequest(file_path));     
        }

    }

}

然后:

var db:DB = new DB();

    db.addEventListener(
        DB.DATA_LOADED, 
        function(event:DataEvent):void {
            trace(event.data);
        }
    )   
    db.getDataUsingDataEvent('file_path');

    db.getDataUsingCallback(
        'file_path', 
        function(data:String):void {
            trace(data);
        }
    )

希望能有所帮助。

关于php - 在AS3中使用自定义类处理数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532053/

相关文章:

php - mysql插入查询不工作

mysql - 使用 SQL 子查询或 JOIN 子句进行选择

actionscript-3 - actionscript 3 中的预加载器 - getDefinition() 上的引用错误

php - 为 MySQL 解析一个大的 XML 文件

javascript - PHP中的执行函数取决于Angular发送的whatsapp

mysql - 从单列中选择多个值

actionscript-3 - AS3 mp4 保存文件

apache-flex - Actionscript 3 中的外部配置文件

php - 如何修复 : The difference between the request time and the current time is too large

javascript - 代码工作正常。但是使用 Ajax 仅显示最后 5 条记录