2

我在很多地方都在使用我的 MySQL 数据库中用 PHP 编码的 JSON 对象,没有任何问题。我现在正在尝试在语法中使用 COUNT(column) 从结果集中创建一个,我认为它导致了问题,但我不知道如何解决它。

我的JS看起来像这样......

createTeacherStatsTab = function(){
    $('#main').append('<div id="teacherStatsTab></div>"');
    $.getJSON("php/countMarkingPerTeacher.php", function(data) {
        $.each(data, function(key, val) {
            $('#teacherStatsTab').append(val.teacher + ' : ' + val.count(teacher));
        });
    });
}

我的PHP看起来像这样......

$result = mysql_query("
SELECT teacher, COUNT(teacher) 
FROM Assessment
GROUP BY teacher
ORDER BY COUNT(teacher) DESC
");

$rows = array();
while($r = mysql_fetch_assoc($result)) {
$rows[] = $r;
}
print json_encode($rows);

回来的数据是这样的……

[
{
teacher: "SDe",
COUNT(teacher): "413"
},
{
teacher: "OJe",
COUNT(teacher): "297"
},
{
teacher: "AMi",
COUNT(teacher): "257"
},
{
teacher: "ASt",
COUNT(teacher): "218"
},
{
teacher: "VJa",
COUNT(teacher): "194"
},
{
teacher: "SLa",
COUNT(teacher): "125"
},
{
teacher: "MCr",
COUNT(teacher): "99"
}
]

感觉这可能与 GROUP BY 剥离 ID 或其他什么有关?

有人可以帮忙吗?

谢谢!

4

4 回答 4

3

我认为该对象不允许在其属性上加上括号,因此当您调用时,val.count(teacher)您会尝试调用该对象的不存在count方法val。尝试调用val["count(teacher)"],或者只是更改属性名称。

于 2012-11-10T13:07:54.363 回答
2

总体而言,问题在于json_encode似乎返回了无效的 JSON。您的对象键包含()哪些是对象键的无效字符(除非它们包含在如下示例中的字符串中)。

[{
    "teacher": "SDe",
    "COUNT(teacher)": "413"
}, {
    "teacher": "OJe",
    "COUNT(teacher)": "297"
}, {
    "teacher": "AMi",
    "COUNT(teacher)": "257"
}, {
    "teacher": "ASt",
    "COUNT(teacher)": "218"
}, {
    "teacher": "VJa",
    "COUNT(teacher)": "194"
}, {
    "teacher": "SLa",
    "COUNT(teacher)": "125"
}, {
    "teacher": "MCr",
    "COUNT(teacher)": "99"
}]

最简单的解决方法是为您的COUNT(teacher)列设置别名:

$result = mysql_query("
SELECT teacher, COUNT(teacher) AS count
FROM Assessment
GROUP BY teacher
ORDER BY COUNT(teacher) DESC
");

这应该将您的 JSON 呈现为

[{
    teacher: "SDe",
    count: "413"
}, {
    teacher: "OJe",
    count: "297"
}, {
    teacher: "AMi",
    count: "257"
}, {
    teacher: "ASt",
    count: "218"
}, {
    teacher: "VJa",
    count: "194"
}, {
    teacher: "SLa",
    count: "125"
}, {
    teacher: "MCr",
    count: "99"
}]

这是有效的 JSON(无需对键进行字符串化),并且您现有的功能应该可以正常工作(更改val.count(teacher)为之后val.count):

createTeacherStatsTab = function () {
    $('#main').append('<div id="teacherStatsTab></div>"');
    $.getJSON("php/countMarkingPerTeacher.php", function (data) {
        $.each(data, function (key, val) {
            $('#teacherStatsTab').append(val.teacher + ' : ' + val.count);
        });
    });
}
于 2012-11-10T13:58:31.310 回答
1

这是因为 JS 将您的属性访问解释为一个函数调用,因为括号:

val.count(teacher)

我猜最简单的解决方案是给你的COUNT()结果一个别名:

$result = mysql_query("
SELECT 
  teacher, 
  COUNT(teacher) AS teacher_count
FROM Assessment
GROUP BY teacher
ORDER BY COUNT(teacher) DESC
");

并像这样访问它:

$('#teacherStatsTab').append(val.teacher + ' : ' + val.teacher_count);
于 2012-11-10T13:15:33.767 回答
-2

你得到 json.so 的数组,所以你必须得到第零个元素,而不是你必须迭代它,所以你必须这样做

$.getJSON("php/countMarkingPerTeacher.php", function(data) {
    var myData = data[0];
    $.each(myData, function(key, val) {
        $('#teacherStatsTab').append(val.teacher + ' : ' + val.count(teacher));
    });
});

如果您的 json 采用这种格式,那么您的代码就会起作用

{
teacher: "SDe",
COUNT(teacher): "413"
},
{
teacher: "OJe",
COUNT(teacher): "297"
},
{
teacher: "AMi",
COUNT(teacher): "257"
},
{
teacher: "ASt",
COUNT(teacher): "218"
},
{
teacher: "VJa",
COUNT(teacher): "194"
}
于 2012-11-10T13:05:50.130 回答