Php 在chart.js折线图中显示过去两年的SQL数据,直到今天
我有一个折线图,基本上显示了预算支出,它的工作原理如下: 我有一个包含以下内容的include,它准备显示数据:Php 在chart.js折线图中显示过去两年的SQL数据,直到今天,php,chart.js,Php,Chart.js,我有一个折线图,基本上显示了预算支出,它的工作原理如下: 我有一个包含以下内容的include,它准备显示数据: <?php $conn = new mysqli(blah blah blah); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $year = date('Y'); $total=array
<?php
$conn = new mysqli(blah blah blah);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$year = date('Y');
$total=array();
for ($month = 1; $month <= 12; $month ++){
$sql="SELECT *, SUM(Contracts.Sum_Approved) AS total FROM Contracts JOIN Budgets ON Contracts.Budget = Budgets.BudgetID WHERE month(Contracts.Decision_Date)='$month' AND year(Contracts.Decision_Date)='$year' AND Contracts.owner=$userid AND Contracts.Archived=0 AND Contracts.Budget=$budget";
$query=$conn->query($sql);
$row=$query->fetch_array();
$total[]=$row['total'];
}
$tjan = $total[0];
$tfeb = $total[1];
$tmar = $total[2];
$tapr = $total[3];
$tmay = $total[4];
$tjun = $total[5];
$tjul = $total[6];
$taug = $total[7];
$tsep = $total[8];
$toct = $total[9];
$tnov = $total[10];
$tdec = $total[11];
$pyear = $year - 1;
$pnum=array();
for ($pmonth = 1; $pmonth <= 12; $pmonth ++){
$sql="SELECT *, SUM(Contracts.Sum_Approved) AS ptotal FROM Contracts JOIN Budgets ON Contracts.Budget = Budgets.BudgetID WHERE month(Contracts.Decision_Date)='$pmonth' AND year(Contracts.Decision_Date)='$pyear' AND Contracts.owner=$userid AND Contracts.Archived=0 AND Contracts.Budget=$budget";
$pquery=$conn->query($sql);
$prow=$pquery->fetch_array();
$ptotal[]=$prow['ptotal'];
}
$pjan = $ptotal[0];
$pfeb = $ptotal[1];
$pmar = $ptotal[2];
$papr = $ptotal[3];
$pmay = $ptotal[4];
$pjun = $ptotal[5];
$pjul = $ptotal[6];
$paug = $ptotal[7];
$psep = $ptotal[8];
$poct = $ptotal[9];
$pnov = $ptotal[10];
$pdec = $ptotal[11];
为什么要将所有这些值填充到单独命名的变量中,而不是将它们放入数组中?对于一个数组,你可以使用json\u encode
来创建一个JS可以一次“读取”的表示。主要是我试图了解Chart.JS,这是我以前从未使用过的,我想弄清楚什么是有效的,什么是无效的。一旦一切正常,我很可能会切换到数组。使用数组是解决这个问题的一部分,而不需要任何更大的if
构造。对于数据
,您需要传递的是一个JavaScript数组,在您当前使用所有单独的命名变量进行操作的地方,它似乎只是一个JavaScript数组,与任何特定月份都没有任何连接,只是一个接一个的24个值。因此,首先在PHP数组中收集24个数据点,然后在JS部分中创建正确输出所需的就是数据:
我已经将数据粘贴到数组$total中,但在将其输出到接收JS时遇到了问题。所以我可以输出,但它似乎破坏了JS,因为包含了非引号的空值。这到底是个什么问题?JavaScript本身在解析这些代码时应该没有问题。如果您的库不希望接受null
值,那么这可能是另一个问题-当前的解决方案只能绕过这个问题,因为PHP中null值的echo
只会导致输出一个空字符串。但您仍然可以自己在该位置循环该数组,以输出双引号内的所有值,而不必使用json_编码。
var ctx = document.getElementById("myAreaChart");
var myLineChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["Jan <?php echo date("Y") - 1; ?>", "Feb <?php echo date("Y") - 1; ?>", "Mar <?php echo date("Y") - 1; ?>", "Apr <?php echo date("Y") - 1; ?>", "May <?php echo date("Y") - 1; ?>", "Jun <?php echo date("Y") - 1; ?>", "Jul <?php echo date("Y") - 1; ?>", "Aug <?php echo date("Y") - 1; ?>", "Sep <?php echo date("Y") - 1; ?>", "Oct <?php echo date("Y") - 1; ?>", "Nov <?php echo date("Y") - 1; ?>", "Dec <?php echo date("Y") - 1; ?>", "Jan <?php echo date("Y"); ?>", "Feb <?php echo date("Y"); ?>", "Mar <?php echo date("Y"); ?>", "Apr <?php echo date("Y"); ?>", "May <?php echo date("Y"); ?>", "Jun <?php echo date("Y"); ?>", "Jul <?php echo date("Y"); ?>", "Aug <?php echo date("Y"); ?>", "Sep <?php echo date("Y"); ?>", "Oct <?php echo date("Y"); ?>", "Nov <?php echo date("Y"); ?>", "Dec <?php echo date("Y"); ?>"],
datasets: [{
label: "Agreed Funding",
lineTension: 0.3,
backgroundColor: "rgba(78, 115, 223, 0.05)",
borderColor: "rgba(78, 115, 223, 1)",
pointRadius: 3,
pointBackgroundColor: "rgba(78, 115, 223, 1)",
pointBorderColor: "rgba(78, 115, 223, 1)",
pointHoverRadius: 3,
pointHoverBackgroundColor: "rgba(78, 115, 223, 1)",
pointHoverBorderColor: "rgba(78, 115, 223, 1)",
pointHitRadius: 10,
pointBorderWidth: 2,
data : [ "<?php echo $pjan; ?>",
"<?php echo $pfeb; ?>",
"<?php echo $pmar; ?>",
"<?php echo $papr; ?>",
"<?php echo $pmay; ?>",
"<?php echo $pjun; ?>",
"<?php echo $pjul; ?>",
"<?php echo $paug; ?>",
"<?php echo $psep; ?>",
"<?php echo $poct; ?>",
"<?php echo $pnov; ?>",
"<?php echo $pdec; ?>",
"<?php echo $tjan; ?>",
"<?php echo $tfeb; ?>",
"<?php echo $tmar; ?>",
"<?php echo $tapr; ?>",
"<?php echo $tmay; ?>",
"<?php echo $tjun; ?>",
"<?php echo $tjul; ?>",
"<?php echo $taug; ?>",
"<?php echo $tsep; ?>",
"<?php echo $toct; ?>",
"<?php echo $tnov; ?>",
"<?php echo $tdec; ?>"
],
}],
},
options: {
maintainAspectRatio: false,
layout: {
padding: {
left: 10,
right: 25,
top: 25,
bottom: 0
}
},
scales: {
xAxes: [{
time: {
unit: 'date'
},
gridLines: {
display: true,
drawBorder: false
},
ticks: {
maxTicksLimit: 7
}
}],
yAxes: [{
ticks: {
maxTicksLimit: 5,
padding: 10,
// Include a dollar sign in the ticks
callback: function(value, index, values) {
return '£' + number_format(value);
}
},
gridLines: {
color: "rgb(234, 236, 244)",
zeroLineColor: "rgb(234, 236, 244)",
drawBorder: false,
borderDash: [2],
zeroLineBorderDash: [2]
}
}],
},
legend: {
display: false
},
tooltips: {
backgroundColor: "rgb(255,255,255)",
bodyFontColor: "#858796",
titleMarginBottom: 10,
titleFontColor: '#6e707e',
titleFontSize: 14,
borderColor: '#dddfeb',
borderWidth: 1,
xPadding: 15,
yPadding: 15,
displayColors: false,
intersect: false,
mode: 'index',
caretPadding: 10,
callbacks: {
label: function(tooltipItem, chart) {
var datasetLabel = chart.datasets[tooltipItem.datasetIndex].label || '';
return datasetLabel + ': £' + number_format(tooltipItem.yLabel);
}
}
}
}
});