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 では、array[][] を使用してループを作成します。例えば:

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 に答える