1

我制作了一个用于显示用户统计图的表格。用户需要选择月份和年份,然后将显示图表。

我用 AJAX 做了这个并做出了 JSON 响应。

这是我的 JavaScript 代码:

//Show statistic
$('.statistic_submit').click(function(){
    if ($('#month').val() == 'none' || $('#year').val() == 'none') {
        $("#dialog_empty").dialog( "open" );
        return false;
    }

    var form = $('#statistic_view');  
    var data = form.serialize(); 

    $.ajax({
        url: "include/scripts/user_statistic.php",
        type: "POST",
        data: data,
        dataType: 'json',
        success: function (reqCode) {
            console.log(reqCode);
            if (reqCode['error_code'] == 1) {
                //Generate diagram  
                $(".done").html( 
                    '<p class="bold center">' + reqCode['month'] + ' ' + reqCode['year'] + '</p>' +
                    '<canvas id="cvs" width="650" height="250">[No canvas support]</canvas>'
                );  

                var data_string = jQuery.parseJSON(reqCode['data_string']);
                var labels_tooltip = jQuery.parseJSON(reqCode['labels_tooltip']);
                var labels_string = reqCode['labels_string'];

                var chart = new RGraph.Line('cvs', data_string);
                    chart.Set('chart.tooltips', labels_tooltip);
                    chart.Set('chart.tooltips.effect', "expand");
                    chart.Set('chart.background.grid.autofit', true);
                    chart.Set('chart.gutter.left', 35);
                    chart.Set('chart.gutter.right', 5); 
                    chart.Set('chart.hmargin', 10);
                    chart.Set('chart.tickmarks', 'circle');
                    chart.Set('chart.labels', labels_string);
                    chart.Draw();

                $('.done').fadeOut('slow'); 
                $('.done').fadeIn('slow');
            }
            if (reqCode['error_code'] == 2) {
                //No values found
                $('.done').fadeOut('slow');
                $("#dialog_error").dialog( "open" );
            }
        }
    });
    return false;
});

这是我的 user_statistic.php 的提取:

$data = array();
$sql = "SELECT
                Anzahl
            FROM
                 Counter
            WHERE
                 YEAR(Datum) = '".$year."' AND
                 MONTH(Datum) = '".$month."'";

    if (!$result = $db->query($sql)) {
        return $db->error;
    }

    $row = $result->fetch_assoc();
    $data = (int)$row['Anzahl'];

$response['error_code'] = '1'; 
    $response['data_string'] = "[" . join(", ", $data) . "]";
    $response['labels_string'] = "['" . join("', '", $labels) . "']";
    $response['labels_tooltip'] = "['" . join("', '", $data) . "']";
    $response['month'] = $month_name[$month];
    $response['year'] = $year;

    echo json_encode($response);

这个 reqCode 响应:

error_code "1"
data_string "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 0, 26, 1, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0]"  
labels_string "['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31']" 
labels_tooltip "['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '3', '2', '2', '0', '26', '1', '5', '3', '1', '1', '0', '0', '0', '0', '0', '0']" 
month "Mai" 
year 2012

这就是 .log 所说的:

JSON.parse: unexpected character!

我发现 data_string 工作正常。由于“..”,labels_string 和 labels_tooltip 是问题所在。唯一的问题是图表需要'..'。

我是 JavaScript 和 Ajax/JSON 的新手,所以我不知道如何处理这个问题。在 php 中,我会使用一个数组 [][] 并创建一个循环。例如:

echo "[";
for ($i; $i<= ..;$i++) {
  echo "'".reqCode['labels_string'][$i]."', ";
}
echo"]";

有什么建议吗?

4

1 回答 1

2

问题来自解析单引号'。JSON 使用双引号"来设置字符串值。因此,您的有效字符串化 JSON 响应应如下所示"[\"1\",\"2\", ...]",而您的响应"['1','2', ...]"不正确。

事实上,我不明白你为什么要这样做:

$response['data_string'] = "[" . join(", ", $data) . "]";

如果你最终使用json_encode($response).

实际上,即使某些元素包含其他数组,PHP 函数json_encode()也会成功地将您的数组字符串化。$response

所以,你可以简单地使用

$response['data_string'] = $data;

然后,在客户端,将不需要使用parseJSON方法解析字符串。您只需要这样获取它:

var data_string = reqCode['data_string'];

如果您需要传递$data带有字符串元素的数组,您可以创建一个新数组或使用类似的东西:

array_filter($data, create_function('$x', 'return strval($x)'));
于 2012-05-25T12:27:44.587 回答