我使用时间戳在每个月的计数循环中创建了一个自动填充数组,例如2016-06-11 00:00:00 - 循环从中获取的数据库布局是:
TimeRecord | Views
2016-06-11 00:00:00 | 22
2016-08-11 00:00:00 | 44
现在,上面的例子跳过07(七月)月,本月没有数据,所以当循环经过这个月时,它应该返回null或0,但它返回先前已知的数字(在这种情况下是22)。
对于2016-09,没有指定数据,因此数组将给出“44”。
循环和从数据库中获取以生成数组的代码如下:
$startMonth = date("y-m-d");
$endMonth = date("y-m-d");
while ($Month <= 12){
$ViewsThisMonth = mysqli_fetch_object(mysqli_query($db, "SELECT SUM(Views) AS NumberFinalViews, EXTRACT(YEAR_MONTH FROM TimeRecord) AS YearMonth FROM BlogViews WHERE TimeRecord > '$startMonth' AND TimeRecord < '$endMonth' GROUP BY YearMonth"));
if (is_null($ViewsThisMonth->NumberFinalViews)){
$ViewsThisMonth->NumberFinalViews = 0;
}
$ArrayTimeStamp[] = $ViewsThisMonth->NumberFinalViews;
$Month = $Month + 1;
$startMonth = date("y-m-d",strtotime("-$Month month"));
}
返回JSON编码数组的示例是:
[0,"29392","333","4000","4000","99","99","99","99","99","99","99"]
可以找到导致上述数组的数据库值的屏幕截图here。正如你所看到的,4000重复了两次,因为第5个月没有记录,导致它使用第4个月的数据。因为没有第6个月到第12个月的值,所以也会重复99,因此它使用第6个月的值而不是返回0。
如果循环经过那个月没有TimeRecord,我希望它返回0,而不是假设视图号与前一个月相同。
答案 0 :(得分:1)
问题是您多次执行相同的查询,尽管日期不断变化。该查询旨在提供几个月的结果,但您只使用其中一个结果行。由于没有order by
子句,可能是您以意外顺序获取行。你在循环中改变开始日期的方式也很奇怪:它会及时向后移动。
最好只执行一次查询,然后将结果存储到按月份键入的预准备数组中。
请注意,您可以使用COALESCE
在SQL查询本身中执行空检查。
代码变成这样:
$startYearMonth = date('Ym', strtotime("2015-01-01")); // set this date as you wish
$endYearMonth = date('Ym', strtotime("now"));
// Prepare result array: one entry per month, with all values set to 0
for ($yearMonth = $startYearMonth; $yearMonth <= $endYearMonth;
$yearMonth += ($yearMonth % 100 == 12 ? 89 : 1)) {
$months[$yearMonth] = 0;
}
// improved query
$result = mysqli_query($db, "
SELECT COALESCE(SUM(Views), 0) AS NumberFinalViews,
EXTRACT(YEAR_MONTH FROM TimeRecord) AS YearMonth
FROM BlogViews
WHERE EXTRACT(YEAR_MONTH FROM TimeRecord)
BETWEEN '$startYearMonth' AND '$endYearMonth'
GROUP BY YearMonth");
// Featch and store each result in their proper year-month slot
while ($ViewsThisMonth = mysqli_fetch_object($result)) {
$months[$ViewsThisMonth->YearMonth] = $ViewsThisMonth->NumberFinalViews;
}
// output the result
print_r($months);