使用回调时映射加载错误

时间:2014-05-06 02:16:07

标签: javascript php jquery html5 callback

我正在使用melonJS,HTML5,CSS3和PHP开发RPG。

当我加载游戏并登录时,它应该从数据库中读取我的统计数据(级别,经验等)。

当我第一次加载游戏时,我得到一个空白屏幕:

enter image description here

错误:

Uncaught melonJS: level mymap2<br />
<font size='1'><table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-si...<omitted>...nd     
at   melonJS-0.9.11-min.js:13

错误发生在melonJS-0.9.11-min.js:13,所以我不确定在哪里调试。


如果我刷新,它加载就好了:

enter image description here

这让我相信存在缓存错误,或者我正在使用加载当前级别的回调在加载其余标记后返回级别名称。

要登录,我正在使用典型会话,然后设置标题,以便在他们成功登录后重新定位到游戏。

在准备好文档时,我将$ .get发送到PHP文件以加载地图:

$(document).ready(function() {  
$.get("php/CRUD.php", {"_functionToRun" : "getLevel"},
    function (returned_data) {
        game.data.currentLevel = returned_data;
    }
);

在CRUD.php中,我这样做:

else if ($functionToRun == "getLevel") {
    $qry = 
        'SELECT levelname 
        FROM userstats
        WHERE id_user_fk ="' . $_SESSION['userid'] . '"';
        $result = $mysqli->query($qry) or die(mysqli_error($mysqli));

    while ($row = $result->fetch_assoc()) {
        $message = $row['levelname'];
    }               
}
echo $message;

应该发生什么 获取地图后,melonJS会加载地图:

game.PlayScreen = me.ScreenObject.extend({

    //Do this on state change
    onResetEvent: function() {
        //load user data with query to database (CRUD.php)
        me.levelDirector.loadLevel(game.data.currentLevel);

为什么game.data.currentLevel有时会以HTML格式返回,并在其他时间加载地图?

由于


编辑:

好的,我已经弄明白为什么它有时会输出HTML ...我需要将其解析为JSON。

jQuery:在doc ready上,我只需加载所有用户统计信息并将其推送到数组中。我使用$ .getJSON而不是$ .get

$.getJSON("php/CRUD.php", {"_functionToRun" : ""},
    function (returned_data) {
        var exp = returned_data.experience,
            levelname = returned_data.levelname,
            player = returned_data.username_fk;

        game.data.dataArray.push(exp, levelname, player);
    }
);

PHP:现在我只获取所有列并回显json_encode($ row):

else {
    $qry = 
        'SELECT * 
        FROM userstats
        WHERE id_user_fk ="' . $_SESSION['userid'] . '"';

    $result = $mysqli->query($qry) or die(mysqli_error($mysqli));

    while ($row = $result->fetch_assoc()) {
        echo json_encode($row);
        exit;
    }   
}

melonJS:现在我使用levelname属性传入数组:game.data.dataArray 1

game.PlayScreen = me.ScreenObject.extend({

onResetEvent: function() {
    log(game.data.dataArray[1]);
    me.levelDirector.loadLevel(game.data.dataArray[1]); 

当我刷新时,记录(game.data.dataArray [1]);输出“mymap2。”

当我重新登录时,出现以下错误:

undefined utilities.js:230
Uncaught TypeError: Cannot read property 'toString' of undefined 

1 个答案:

答案 0 :(得分:0)

根据您的调查结果,似乎可能未设置$_SESSION['userid']值,导致查询在第一次调用时失败。它也可能是完全不同的东西,您发布的错误似乎不是完整的消息。

您应该能够使用浏览器工具(F12)查看对CRUD.php页面发出的请求,以及实际响应的内容,从而产生更完整的错误。 < / p>

无论如何,您应该更好地处理错误,而不是简单地使用die()电话。 die()不仅为用户提供他们不需要/不想要的信息,而且还不是一种非常好的方法来捕获,记录或处理错误以用于调试目的,正如您现在所发现的那样。

所以而不是:

$result = $mysqli->query($qry) or die(mysqli_error($mysqli));

考虑将错误记录到您选择的日志(通常是文件)并返回一些内容供客户端解析

$result = $mysqli->query($qry);
if($result === FALSE)
{
  // Log error using $mysqli->errno and $mysqli->error
  $message "ERROR"; // Or throw exception, then catch later on
}
else
{
  // Continue on from here. with data retrieval.
  while ($row = $result->fetch_assoc()) {
      $message = $row['levelname'];
  }
}

然后你可以检查你的JS是否返回ERROR,并相应地处理它。