0

我正在尝试使用 Ajax 从数据库中提取 HTML 5 游戏的信息。正如您从下面的代码中看到的,我想在 PHP 中回显 JavaScript,以便它将存储在数据库中的变量推送到数组“rawVocab”和“optionVocab”中。但是当我检查这些数组的长度时,我发现它们是空的。

此外,console.log("Satus code: ", request.getStatus(), " - ", request.getStatusText());似乎没有调用此行。我的 eval() 实现可能有问题……不确定。

顺便说一句,我的代码使用了 Google Closure 库。

var rawVocab = new Array();
var optionVocab = new Array();

var request = new goog.net.XhrIo();

goog.events.listen(request, "complete", function(){

    if (request.isSuccess()) {

        response = request.getResponseText();
        eval(response);

        // print confirm to the console
        console.log("Satus code: ", request.getStatus(), " - ", request.getStatusText());

    } else {

        // print error info to the console
        console.log(
        "Something went wrong in the ajax call. Error code: ", request.getLastErrorCode(),
        " - message: ", request.getLastError()
        );

    }

});

request.send("load_vocab.php");

这是 load_vocab.php ......

$data = array();

try {
    $conn = new PDO('mysql:host=localhost;dbname=tygrif_school', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $conn->prepare('SELECT word, translation, example_sentence_1 FROM vocabulary_game WHERE game_type = :game_type');
    $stmt->execute(array('game_type' => 'target'));

    while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
       $data['rawVocab'][] = $row;
    }

    $stmt = $conn->prepare('SELECT word, translation, example_sentence_1 FROM vocabulary_game');
    $stmt->execute(array());

    while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
        $data['optionVocab'][] = $row;
    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

echo json_encode($data);
4

2 回答 2

2

不要这样做。您最好构建一个 PHP 数组,然后通过 JSON 将其发送到客户端,例如

$data = array();

SELECT word, translation, example_sentence_1 FROM ...

while ($row = $stmt->fetch()) {
   $data['rawvobab'][] = $row;
}

SELECT ...

while (...) {
    $data['optionVocab'][] = $row;
}

echo json_encode($data);

使用 json_encode确保您发送给客户端的“代码”在语法上是有效的 Javascript。现在你的代码很容易受到注入攻击。例如,考虑一下如果您的例句甚至包含一个单句会发生什么'- 您将产生一个 javascript 语法错误并杀死该代码块的其余部分。

于 2013-07-08T15:44:28.063 回答
0

json_encode 方法很好,但请注意某些 PHP 版本中的错误,其中 json_encode(array(1.2)) 可能根据区域设置返回 '[1,2]' 而不是正确的 '[1.2]'。但是,如果您从未在代码或任何库中调用 setlocale(),那么您可能是安全的。

我写了一个“minijson”(现在功能齐全)——https://fusionforge.org/plugins/scmgit/cgi-bin/gitweb.cgi?p=fusionforge/fusionforge.git;a=blob;f=src / common/include/minijson.php;h=c9020f4e7b826a88851b1149ddeb10a682f777c9;hb=HEAD——它修复了这些问题,并适用于没有 json_encode 的旧 PHP 版本(其许可证也有问题,这就是它现在从发行版中删除的原因)。

于 2013-07-08T15:50:51.650 回答