【问题标题】:How to correctly passed php mysql data to ChartJs如何正确地将 php mysql 数据传递给 ChartJs
【发布时间】:2017-04-06 09:59:24
【问题描述】:

我希望能够使用 ChartJs 生成条形图和饼图。我正在使用 php 和 mysql 来获取数据。我要制作的条形图是一个图表,它显示了男性或女性学生的统计数据以及学生总数。这是我希望结果如何显示的示例:

它可能不完全一样,但我觉得它给出了一个想法。我的代码有问题,我似乎不明白,因为我是 ChartJs 的新手,只是尝试一下,因为 morris.js 没有得到完全支持。这是我的代码的样子:

HTML

<div class="box box-success">
        <div class="box box-header with-border">
          <h3 class="box-title">Student Chart</h3>
          <div class="box-tools pull-right">
            <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
            </button>
            <button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
          </div>
          <div class="box-body">
            <canvas id="mycanvas" style="height:230px;"></canvas>
          </div>
        </div>

脚本:

$.ajax({
      url: 'data.php',
      type: 'GET',
      success:function(data){
        console.log(data);

        var male = [];
        var female = [];

        for(var count in data){
          male.push(data[count].male);
          female.push(data[count].female);
        }

        var chartdata = {
            labels: male,
            datasets: [
              {
                label: 'Student Gender',
                backgroundColor: 'rgba(200, 200, 200, 0.75)',
                borderColor: 'rgba(200, 200, 200, 0.75)',
                hoverbackgroundColor: 'rgba(200, 200, 200, 1)',
                hoverborderColor: 'rgba(200, 200, 200, 1)',
                data:female
              }
            ] 
        };

        var ctx = $('#mycanvas');

        var barGraph = new Chart(ctx, {
          type:'bar',
          data: chartdata
        });
      },
      error:function(data){
        console.log(data);
      }
    });

数据.php

$query = "SELECT  
            SUM(CASE WHEN gender = 'Male' THEN 1 ELSE 0 END) as Male,
            SUM(CASE WHEN gender = 'Female' THEN 1 ELSE 0 END) as Female
          FROM students";

$output = array();

if ($result = mysqli_query($connection, $query)) {
    # code...
    foreach ($result as $row) {
        # code...
        $output[] = $row;
    }
} else {
    die("There was a problem". mysqli_error($connection));
}

echo json_encode($output);

这是我从控制台得到的结果:

[{"男":"5","女":"2"}]

将感谢有关如何改进它并为饼图做同样的建议的建议。

根据我所做的,这是我的图表的显示方式:

注意请忽略照片上的频率。

【问题讨论】:

    标签: javascript php mysql charts chart.js


    【解决方案1】:

    建议您将 sql 查询更改为以下。

    $query = "select gender,count(gender) as count from students group by gender";
    $output = array();
    
    if ($result = mysqli_query($connection, $query)) {
        # code...
        foreach ($result as $row) {
            # code...
            $output[] = $row;
        }
    } else {
        die("There was a problem". mysqli_error($connection));
    }
    
    echo json_encode($output);
    

    脚本:

    $.ajax({
          url: 'data.php',
          type: 'GET',
          success:function(data){
            console.log(data);
    
            var gender = [];
            var sum = [];
    
            for(var count in data){
              gender.push(data[count].gender);
              sum.push(data[count].total);
            }
    
            var chartdata = {
                labels: gender,
                datasets: [
                  {
                    label: 'Student Gender',
                    backgroundColor: 'rgba(200, 200, 200, 0.75)',
                    borderColor: 'rgba(200, 200, 200, 0.75)',
                    hoverbackgroundColor: 'rgba(200, 200, 200, 1)',
                    hoverborderColor: 'rgba(200, 200, 200, 1)',
                    data:sum
                  }
                ] 
            };
    
            var ctx = $('#mycanvas');
    
            var barGraph = new Chart(ctx, {
              type:'bar',
              data: chartdata
            });
          },
          error:function(data){
            console.log(data);
          }
        });
    

    【讨论】:

    • 我采用了我的代码来匹配你的代码,这是我从控制台得到的结果:[{"gender":"Female","total":"2"},{" gender":"Male","total":"5"}] 但图表仍然显示相同。
    • 我已经更新了代码,因为您将“总计”作为第二个字段..现在检查..
    【解决方案2】:

    我意识到问题出在我的脚本上。非常感谢@milan kumar 帮助查询。缺少的是我发送给 ajax 的数据类型的规范。我所要做的就是在成功函数之前添加值为'json'的dataType,它可以完美地工作。代码应该是这样的:

    脚本:

    $.ajax({
          url: 'data.php',
          type: 'GET',
          // this was what I needed to make it work.
          dataType: 'json',
          success:function(data){
    
            var gender = [];
            var sum = [];
    
            for(var i in data){
              gender.push(data[i].gender);
              sum.push(data[i].total);
            }
    
            var ChartData = {
                labels: ['Student Gender'],
                datasets: [
                  {
                    label: gender[0],
                    fillColor: "rgba(210, 214, 222, 1)",
                    strokeColor: "rgba(210, 214, 222, 1)",
                    pointColor: "rgba(210, 214, 222, 1)",
                    pointStrokeColor: "#c1c7d1",
                    pointHighlightFill: "#fff",
                    pointHighlightStroke: "rgba(220,220,220,1)",
                    data:sum[0]
                  },
                  {
                    label: gender[1],
                    fillColor: "rgba(60,141,188,0.9)",
                    strokeColor: "rgba(60,141,188,0.8)",
                    pointColor: "#3b8bba",
                    pointStrokeColor: "rgba(60,141,188,1)",
                    pointHighlightFill: "#fff",
                    pointHighlightStroke: "rgba(60,141,188,1)",
                    data:sum[1]
                  }
                ] 
            };
          });
    

    我添加了一些可选属性来美化我的图表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2021-10-15
      • 2011-12-05
      • 2019-11-05
      • 2016-01-08
      • 1970-01-01
      相关资源
      最近更新 更多