我正在尝试使用 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);
最佳答案
不要这样做。您最好构建一个 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。现在您的代码很容易受到注入(inject)攻击。例如。考虑一下如果您的示例句子仅包含一个 '
会发生什么 - 您将产生一个 javascript 语法错误并杀死该代码块的其余部分。
关于javascript - 将信息从数据库加载到 Javascript 游戏中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530682/