大家好,在此先感谢您的帮助。

我有一个使用共享对象和php中xml的3类测验。我不了解共享对象和xml方面。如果只有一名玩家参加,则测验会很好地进行。但是,如果我将其设置为使用externalinterface window.close登出,然后再次登录,它将保留该回合中的比分,而该比分早于该回合。实际分数正在数据库中更新就好了。但是,如果播放器重新登录,则共享对象尚未更新。如果浏览器关闭了一段时间,它就会这样做。我认为那是从数据库而不是共享对象中获取数据。

假设...玩家1在新游戏中得分200 ...总分现在是400。得分提交到数据库。
玩家1注销。
玩家2已登录。已经有一段时间没玩了。从数据库加载分数。
玩家2注销。
玩家1重新登录,但共享对象的得分从200之前开始加载。即使我(认为)正在使用xml ...加载得分,并在将得分提交数据库之前刷新共享对象!

PHP看起来像这样...

 if ($todo == "login") {

 $result = mysqli_query($connect, "SELECT * FROM $nameTable WHERE userpass = '$userpass'
 AND username = '$username' ");

   if (!$result) {
  $msg = ((is_object($connect)) ? mysqli_error($connect) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false));
  $string = 'valid=0&err=error query';
   } else {
    if (mysqli_num_rows($result)== 0) {
        $string = 'valid=0&err=no result';

    } else {


        header('Content-Type: text/xml');
        echo "<?xml version='1.0'?>";
        //echo "<".$nameTable.">";
            while ($data = mysqli_fetch_array($result))
            {
             echo "<player>";

             echo "<username>".$data['username']."</username>";
             echo "<userpass>".$data['userpass']."</userpass>";
             echo "<userscore>".$data['userscore']."</userscore>";
             echo "<cat1>".$data['cat1']."</cat1>";
            echo "<cat2>".$data['cat2']."</cat2>";
            echo "<cat3>".$data['cat3']."</cat3>";

            }//end while

        } //end if else result

   } //end if else !result
} //end if else login


AS3登录用户是这个...

         else if(e.currentTarget.name == "login_btn")
    {
        var us:String = mc_now.loginuser.text;
        var pa:String = mc_now.loginpass.text;
        if(us.length > 0 && pa.length > 0 ) getXML(filePHP+"?todo=login&username="+us+"&userpass="+pa, "login");
        positioningInterface(login, 0, 0);
    }


AS3中的LoadUser是这个...

function LoadUser(e:Event):void
{
    trace("LoadUser: user is loaded")

    xmlLoader.removeEventListener(Event.COMPLETE, LoadUser);

    myxml = new XML(e.target.data);

    //trace("len",myxml.username != undefined, myxml.length > 0);

    if(myxml.username != undefined) {

        positioningInterface(welcome, 0, 0);
        welcome.username_txt.text = myxml.username;
        welcome.msg1_txt.text = "Welcome Back";
        welcome.msg2_txt.text = "We hope you are enjoying playing this quiz!";
        welcome.displayscore.text = myxml.userscore;
        mySO.data.registered = isRegistered = true;


        nameActive = myxml.username;
        TotalScore = myxml.userscore;

        cat1 = myxml.cat1;
        cat2 = myxml.cat2;
        cat3 = myxml.cat3;

        mySO.data.cat1 = cat1;
        mySO.data.cat2 = cat2;
        mySO.data.cat3 = cat3;

        mySO.data.userSO = nameActive;
        mySO.data.TotalScore = TotalScore; /// TotalScore is the sum of the category scores

        mySO.flush();

        trace("LoadUser",mySO.data.userSO)

    } else
    {
        //if login failed, display login again, failed login text, clear text
        positioningInterface(login, 0, 0);
        login.loginuser.text = "Login Failed";
        setTimeout(function() {login.loginuser.text = "";login.loginpass.text = "";}, 1000);
    }


}

我认为getSO和fillSO是正确的。 varSend正在正确提交分数。
如前所述,一切正常,直到播放器退出。我尝试在注销时清除共享对象,以便新玩家登录(正常),但是如果第一个玩家在第二位玩家之后重新登录,则玩家1的SO尚未更新。该死的东西只会更新分数!似乎有些延迟。如前所述,如果浏览器关闭并且玩家第二天登录,那么它将从数据库中加载正确的分数。

我希望我有道理。我不知道我在做什么错。这让我疯狂!!

如果有帮助,请添加更多信息...

在游戏首次启动和接口初始化时检查共享对象...

    function checkingSO()
{

    if (mySO.data.registered || mySO.data.loggedOn)
    {
    isRegistered = mySO.data.registered = true;

    getSO();
    }

else
{
    trace("checkso: SO is empty");

    fillSO();
    }
}


获取共享对象...

    function getSO()

{
    nameActive = mySO.data.userSO;

    cat1 = mySO.data.cat1;
    cat2 = mySO.data.cat2;
    cat3 = mySO.data.cat3;

    TotalScore = sumAllScore();

    trace("getso |", "register:",isRegistered,"name:",mySO.data.userSO, "points cat:",cat1,cat2,cat3,cat4,cat5,cat6, "tot:",TotalScore);
}


并填充共享对象...

function fillSO()
{
    mySO.data.cat1 = cat1;
    mySO.data.cat2 = cat2;
    mySO.data.cat3 = cat3;

    TotalScore = sumAllScore();
    mySO.data.TotalScore = TotalScore;

    mySO.flush();

    trace("checkScore |", "register:",isRegistered,"name:",nameActive, "points cat:",cat1,cat2,cat3, "tot:",sumAllScore() ;
}


如前所述,我发现数组确实令人困惑。我将类别归类为一个可拆分的数组,但可以将它们分开,因为我不知道如何将数组放入数组中。 Akmozo的建议是我之前尝试过的,我认为这是解决我的问题的正确方法。但是被卡住了!

最佳答案

我认为缓存存在问题。向您的请求添加一个nocache-pseudo-var:

getXML(filePHP+"?todo=login&username="+us+"&userpass="+pa+"&nocache="+Math.random(),"login");

10-07 14:20