【问题标题】:JSON to JavaScript variable via AJAX and PHP MYSQL => Array undefinedJSON 到 JavaScript 变量通过 AJAX 和 PHP MYSQL => Array undefined
【发布时间】:2020-04-26 02:41:06
【问题描述】:

我正在尝试通过 php -> json -> ajax 将 mysql 数据获取到 Chartjs 的 JS 变量中。 php 生成的 JSON 看起来完全没有问题。不幸的是,当试图在我的变量中获取数据时,控制台将它们返回为未定义。

这是我的代码:

<?php

$con=mysqli_connect("---");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT clanarina, vakufnama, zekjat, year from payments where uid = 1");


$data = array();
foreach ($result as $row) {
  $data[] = $row;
}
$result->close();
mysqli_close($con);
print json_encode($data);
?>

JSON:

    [{"clanarina":"240","vakufnama":"12500","zekjat":"0","year":"2019"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2021"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2022"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2023"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2024"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2025"}]

JS:

$(document).ready(function(){
  $.ajax({
    url : "../../getchartdata_payments_user.php",
    type : "GET",
    success : function(data){
      console.log(data);

      var clanarinajs = [];
      var vakufnamajs = [];
      var zekjatjs = [];


      for(var i in data) {
        clanarinajs.push(data[i].clanarina);
        vakufnamajs.push(data[i].vakufnama);
        zekjatjs.push(data[i].zekjat);
      }
      console.log(clanarinajs);
      console.log(vakufnamajs);
      console.log(zekjatjs);
      var chartdata = {
        labels: ["2019", "2020", "2021", "2022", "2023", "2024","2025"],
        datasets: [
          {
            label: "Clanarina",
            backgroundColor: "#4e73df",
            hoverBackgroundColor: "#2e59d9",
            borderColor: "#4e73df",
            data: clanarinajs
          },
          {
            label: "Vakufnama",
            backgroundColor: "#aafac8",
            hoverBackgroundColor: "#2e59d9",
            borderColor: "#4e73df",
            data: vakufnamajs
          },
          {
            label: "Zekjat",
            data: zekjatjs
          },
          {
            label: "Goal",
            data: [54000, 54000, 55620, 57289, 59007, 60777, 62601],
            type: "line",
            fill: "false",
            backgroundColor: "yellow",
            borderColor: "yellow",
          }
        ]
      };

      var ctx = document.getElementById("myBarChart");

      var mybarchart = new Chart(ctx, {
        type: 'bar',
        data: chartdata,
        options: {
          maintainAspectRatio: false,
          layout: {
            padding: {
              left: 10,
              right: 25,
              top: 25,
              bottom: 0
            }
          },
          scales: {
            xAxes: [{
              time: {
                unit: 'year'
              },
              gridLines: {
                display: false,
                drawBorder: false
              },
              maxBarThickness: 25,
            }],
            yAxes: [{
              ticks: {
                min: 0,
                max: 70000,
                maxTicksLimit: 5,
                padding: 10,
                // Include a dollar sign in the ticks
                callback: function(value, index, values) {
                  return 'KM' + number_format(value);
                }
              },
              gridLines: {
                color: "rgb(234, 236, 244)",
                zeroLineColor: "rgb(234, 236, 244)",
                drawBorder: false,
                borderDash: [2],
                zeroLineBorderDash: [2]
              }
            }],
          },
          legend: {
            display: false
          },
          tooltips: {
            titleMarginBottom: 10,
            titleFontColor: '#6e707e',
            titleFontSize: 14,
            backgroundColor: "rgb(255,255,255)",
            bodyFontColor: "#858796",
            borderColor: '#dddfeb',
            borderWidth: 1,
            xPadding: 15,
            yPadding: 15,
            displayColors: false,
            caretPadding: 10,
            callbacks: {
              label: function(tooltipItem, chart) {
                var datasetLabel = chart.datasets[tooltipItem.datasetIndex].label || '';
                return datasetLabel + ': KM' + number_format(tooltipItem.yLabel);
              }
            }
          },
        }
      });
    },
  });
});

控制台输出:

[{"clanarina":"240","vakufnama":"12500","zekjat":"0","year":"2019"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2021"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2022"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2023"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2024"},{"clanarina":"240","vakufnama":"0","zekjat":"0","year":"2025"}] chart-bar-demo.js:10:15

Array(385) [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, … ]
chart-bar-demo.js:22:15

Array(385) [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, … ]
chart-bar-demo.js:23:15

Array(385) [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, … ]
chart-bar-demo.js:24:15

如您所见,console.log(data) 也可以正常工作,但在变量中推送数据似乎是个问题。

感谢您的帮助!

【问题讨论】:

  • clanarinajs 包含 6 个元素(从 0 到 5),但是您在 chartdata 中定义了 7 个标签,从 2019 年到 2025 年,即图表也期望 clanarinajs[6],这是未定义的。对于您在图表数据中用作data 参数值的其他...js 变量也是如此。尝试删除 2025 并让我们知道结果。在任何情况下,您都必须对 data 响应进行 JSON 解析。

标签: javascript php mysql json ajax


【解决方案1】:

PHP 返回的 JSON 在您推入数组时仍然是一个字符串。您会注意到数组长度对应于字符串的长度。

您需要在循环之前将 JSON 字符串解析为 JS 数组,您可以使用 JSON.parse(); 来完成此操作

【讨论】:

  • 我用 $.parseJSON(data) 试过了。现在我得到 Array(6) [undefined, undefined,undefined,undefined,undefined,undefined] console log: 0: Object {clanarina: "240", vakufnama: "12500", zekjat: "0", ... } 1: Object {clanarina:“0”,vakufnama:“0”,zekjat:“0”,...}​2:对象{clanarina:“240”,vakufnama:“0”,zekjat:“0”,...}​3:对象{clanarina:“240”,vakufnama:“0”,zekjat:“0”,...}​4:对象{clanarina:“240”,vakufnama:“0”,zekjat:“0”,...}​5:对象{clanarina:“240”,vakufnama:“0”,zekjat:“0”,……}​6:对象{clanarina:“240”,vakufnama:“0”,zekjat:“0”,……}
  • 如果你使用 jQuery 3.0+,他们现在推荐使用原生的 JSON.parse() 参见 here。此外,我无法使用您在上面发布的代码重现这一点 - $.parseJSONJSON.parse() 都给了我一个长度为 6 的对象数组,我可以从中循环获取您想要的值。
  • 我从 json.parse 获得的数组似乎很好,但是当循环它时,我得到了 3 个正确长度的数组,但内容未定义。与我的循环有关吗?
  • 只是为了确认 - 你有 var array= JSON.parse(data) 并且你正在像这样循环? var clanarinajs = []; var vakufnamajs = []; var zekjatjs = [];for (var i in array) { clanarinajs.push(array[i].clanarina); vakufnamajs.push(array[i].vakufnama); zekjatjs.push(array[i].zekjat); });
  • 是这样的吗:var datanew = JSON.parse(data); console.log(datanew); var clanarinajs = []; var vakufnamajs = []; var zekjatjs = []; for(var i in datanew) {clanarinajs.push(data[i].clanarina); vakufnamajs.push(数据[i].vakufnama); zekjatjs.push(数据[i].zekjat); }
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多