0

私の問題には非常に簡単な修正があると確信していますが、とにかくできるだけ詳しく説明します。

基本的に、MySQL で PHP を使用して、GET を使用してフラッシュ ファイルに情報を送信します。

FlashVars を使用して、これでユーザーの 'id' を取得できました。質問/検索を PHP スクリプトに送信して、データベースにアクセスし、情報を html ページに返すことができます。

私が今やりたいことは、htmlページに送り返された情報を、たとえばフラッシュ内の変数に追加することです:

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 を Web ブラウザに入力するだけで、名前が出力されます。

なぜこれがこのような問題なのかわかりません。

ありがとうエリ

4

2 に答える 2

0

コードをざっと見ただけで、AS3 の URL リクエストの「非同期」の性質を理解していないことは明らかです。

すると、Flash は実際にこのパイプラインを別のスレッド_loader.load()で開きます。これにより、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また、ローダーがガベージ コレクションされるように、追加したすべてのイベント リスナーを削除した方がよいでしょう (使用)。

于 2012-04-16T17:54:40.570 に答える
0
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;
}
于 2012-04-16T17:12:35.523 に答える