【问题标题】:AS3 & MySQL - Adding outputted string to variableAS3 & MySQL - 将输出字符串添加到变量
【发布时间】:2012-04-16 15:53:58
【问题描述】:

我很确定有一个非常简单的方法可以解决我的问题,但无论如何我会尽可能详细地解释。

基本上我使用 PHP 和 MySQL 使用 GET 将信息发送到我的 flash 文件。

使用 FlashVars,我设法获得了用户的“id”,我可以将我的问题/搜索发送到访问数据库并将信息返回到 html 页面的 PHP 脚本。

我现在想做的是将发送回 html 页面的信息添加到 flash 内的变量中,例如:

var usr_name = get_user_name(id) || 'Unknown'; // "Unknown" should just be for offline use.

但这只是返回“未知”

这是使用的函数:

        public function get_user_name(usr_id){
                loadData('search.php',"quest=name",'usr_id='+usr_id);
        }

private function loadData(page_Name='search.php',get1='g1=1',get2='g2=2',get3='g3=3'):void {
            var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
            var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3) ;
            trace(create_URL);

            _loader = new URLLoader();
            _request = new URLRequest(create_URL);          
            _request.method = URLRequestMethod.POST;
            _loader.addEventListener(Event.COMPLETE, onLoadData);
            _loader.addEventListener(IOErrorEvent.IO_ERROR, onDataFiledToLoad);
            _loader.addEventListener(IOErrorEvent.NETWORK_ERROR, onDataFiledToLoad);
            _loader.addEventListener(IOErrorEvent.VERIFY_ERROR, onDataFiledToLoad);
            _loader.addEventListener(IOErrorEvent.DISK_ERROR, onDataFiledToLoad);
            _loader.load(_request);
        }

public function onLoadData(e:Event):String {
            return(e.target.data);
        }

这一切似乎都很好,只是当我尝试不使用 or 语句(|| 'Unknown')时,我得到了这个错误:

TypeError: Error #2007: Parameter text must be non-null.
    at flash.text::TextField/set text()
    at App/frame1()

如果我只是在网络浏览器中输入 URL,我会得到输出的名称。

我不知道为什么会出现这样的问题。

谢谢 以利

【问题讨论】:

    标签: php mysql actionscript-3 flash


    【解决方案1】:
    public function onLoadData(e:Event):String {
    
                return(e.target.data);
            }
    

    如果您期望上述函数将响应字符串返回到变量中,那么您就错了。

    您必须让onLoadData 自己填充变量。试试这个方法:

    var usr_name = 'Unknown'; 
    
    get_user_name(id);
    
    
    function get_user_name(usr_id) {
    
        loadData('search.php',"quest=name",'usr_id='+usr_id);
    }
    
    function loadData(page_Name='search.php',get1='g1=1',get2='g2=2',get3='g3=3'):void {
    
        var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
        var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3);
        trace(create_URL);
    
        _loader = new URLLoader();
        _request = new URLRequest(create_URL);
        _request.method = URLRequestMethod.POST;
        _loader.addEventListener(Event.COMPLETE, onLoadData);
        _loader.addEventListener(IOErrorEvent.IO_ERROR, onDataFiledToLoad);
        _loader.addEventListener(IOErrorEvent.NETWORK_ERROR, onDataFiledToLoad);
        _loader.addEventListener(IOErrorEvent.VERIFY_ERROR, onDataFiledToLoad);
        _loader.addEventListener(IOErrorEvent.DISK_ERROR, onDataFiledToLoad);
        _loader.load(_request);
    }
    
    function onLoadData(e:Event) {
    
        usr_name = e.target.data;
    }
    

    【讨论】:

    • 所以这种方法有效,但由于加载和输出之间存在延迟,它会抓取 Unknown 然后一旦加载就会将其更改为名称,但已经为时已晚..
    • 显然会发生。您正在通过网络发出请求。不必为时已晚。只需确保在返回响应之前没有其他操作开始。
    【解决方案2】:

    好吧,粗略看一下您的代码,很明显您不知道 AS3 中 URL 请求的“异步”性质。

    当您执行_loader.load() 时,Flash 实际上会在不同的线程 上打开此管道,可以这么说。这可确保在加载 URL 请求时应用程序不会冻结。

    你只需要这样:

    public function get_user_name(usr_id){
        loadData('search.php',"quest=name",'usr_id='+usr_id);
    }
    
    private function loadData(page_Name='search.php',get1='g1=1',get2='g2=2',get3='g3=3'):void {
        var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
        var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3) ;
        trace(create_URL);
    
        _loader = new URLLoader();
        _request = new URLRequest(create_URL);          
        _request.method = URLRequestMethod.POST;
        _loader.addEventListener(Event.COMPLETE, onLoadData);
        _loader.addEventListener(IOErrorEvent.IO_ERROR, onDataFiledToLoad);
        _loader.addEventListener(IOErrorEvent.NETWORK_ERROR, onDataFiledToLoad);
        _loader.addEventListener(IOErrorEvent.VERIFY_ERROR, onDataFiledToLoad);
        _loader.addEventListener(IOErrorEvent.DISK_ERROR, onDataFiledToLoad);
        _loader.load(_request);
    }
    
    public function onLoadData(e:Event):String {
        usr_name = e.target.data || 'Unknown';
    }
    

    你这样称呼它

    var usr_name = "";
    get_user_name();
    

    我注意到您的代码不是强类型的。即您没有将数据类型分配给您的变量。这可能会导致问题并降低可读性。

    另外,最好删除所有添加的事件侦听器(使用removeEventListener),以便对加载程序进行垃圾回收。

    【讨论】:

    • 复制答案不是我们应该遵循的...只是我的想法。
    • 啊,但我没有重复你的答案。代码将显然是相同的,但是您刚刚提供了 OP,我已经解释了为什么它会以这种方式工作。总而言之,这不叫重复,所以你的论点是无效的……只是我的想法。
    猜你喜欢
    • 2014-02-18
    • 2015-09-05
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2017-04-03
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多