我有一个游戏,每10秒从MySQL数据库刷新一次信息。每次发生这种情况时都会调用一个JS函数。我无法获得执行的成功函数,我不知道为什么。控制台上也没有错误。
使用Javascript:
function refreshStats() {
console.log("number 1");
$.ajax({
url: "refreshData.php",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType : 'json',
data: { },
cache: false,
async: true,
success: function (msg) {
if(msg){
console.log("number 2");
var arr = JSON.parse(msg);
document.getElementById("interface_stats").innerHTML =
"Fatigue: " + arr[0];
}
}
});
}
PHP:
<?php
$username = $_POST['user'];
ini_set('display_errors', 1);
error_reporting(E_ALL);
$con = mysql_connect("localhost","redacted","redacted");
if (!$con)
{
die('SQL error! Aborting: ' . mysql_error($con));
}
$db = mysql_select_db("aftertheend",$con) or die("Database error! Aborting. Inform the admin.");
$query = "SELECT fatigue, food, water, radiation, condition FROM users WHERE username='TheMightyThor'";
$result = mysql_query($query, $con);
$data = mysql_fetch_row($result);
$stats = [
"fatigue" => $data[0],
"food" => $data[1],
"water" => $data[2],
"radiation" => $data[3],
"condition" => $data[4]
];
echo json_encode($stats);
?>
答案 0 :(得分:3)
我认为您的PHP返回错误,而不是您期望的JSON。由于您有dataType: 'json'
,jQuery会尝试解析响应,但失败了。当发生这种情况时,jQuery不会调用success
回调。
如果可以,请使用Firebug查看ajax调用返回的内容。另一种方法是暂时更改为dataType: 'html'
,然后将success
回调更改为:
success: function(msg) { alert(msg); }
希望当您看到返回的消息时,它将有助于识别问题。您应该做的一件事是添加代码来处理查询无法执行的情况以及没有从数据库中获取行的情况。您可以将以下代码添加到PHP文件中:
$result = mysql_query($query, $con);
if (!$result) {
die('Could not run query: ' . mysql_error($con));
}
if (mysql_num_rows($result) < 1) {
echo 'null';
exit;
}
$data = mysql_fetch_row($result);
但是Ajax调用也存在一些问题:
(1)您指定contentType: "application/json; charset=utf-8"
,但之后您没有发送JSON。你应该这样做:
data: JSON.stringify({}),
但是如果这样做,则无法使用$_POST
功能获取服务器上的数据。因此,您可能希望取消contentType
设置。有关详细信息,请参阅此SO answer。
(2)当您指定dataType: 'json'
时,JQuery将在调用成功回调之前解析对象的响应,因此msg
参数应该已经是一个对象。因此,您不应该致电JSON.parse(msg)
。
(3)您正在从PHP文件返回一个关联数组。这将转换为JavaScript对象,而不是数组。
我认为你应该尝试以下方法:
$.ajax('refreshData.php', {
type: 'post',
dataType: 'json',
data: { },
cache: false,
success: function (data) {
if (data) {
$('#interface_stats').html('Fatigue: ' + data.fatigue);
}
}
});