合并查询结果为JSON用于Chart.js折线图时遇参数错误如何解决?
解决同折线图展示两周访问量及
json_encode报错问题 首先,你碰到的json_encode() expects parameter 2 to be int, array given错误原因很明确:json_encode()的第二个参数只能是整数类型的编码选项(比如JSON_PRETTY_PRINT这类常量),但你传了第二个数组$data1,这属于用法错误。
接下来我们分两步解决:先修复JSON编码问题,再优化数据结构让它更适配折线图的展示需求。
一、快速修复JSON编码错误
你需要把两个数据集合并成一个单一数组,再传给json_encode()。比如把两周的数据作为数组的两个独立键,这样前端能轻松区分两组数据:
header("Content-Type: application/json"); include "../../../includes/db.php"; // 查询本周数据(同时获取日期,方便前端对应) $stmt = $connection->prepare("SELECT website_stats_homepage AS current_week, website_stats_date AS date FROM website_stats WHERE yearweek(DATE(website_stats_date), 1) = yearweek(curdate(), 1) ORDER BY website_stats_date"); $stmt->execute(); $result = $stmt->get_result(); $currentWeekData = []; foreach($result as $row) { $currentWeekData[] = $row; } // 查询上周数据(同时获取日期) $stmt1 = $connection->prepare("SELECT website_stats_homepage AS last_week, website_stats_date AS date FROM website_stats WHERE website_stats_date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY AND website_stats_date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY"); $stmt1->execute(); $result1 = $stmt1->get_result(); $lastWeekData = []; foreach($result1 as $row1) { $lastWeekData[] = $row1; } $stmt->close(); $stmt1->close(); // 合并成一个数组后再编码 $combinedData = [ 'current_week' => $currentWeekData, 'last_week' => $lastWeekData ]; echo json_encode($combinedData);
输出的JSON结构会是:
{ "current_week": [ {"current_week": 120, "date": "2024-05-20"}, ... ], "last_week": [ {"last_week": 95, "date": "2024-05-13"}, ... ] }
前端可以直接用这两个数组渲染同一张折线图的两条曲线。
二、更高效的数据库查询优化
上面的方案需要两次数据库查询,其实可以通过一次查询就获取两周的数据,让数据结构更紧凑(按日期对应两周的数值),减少数据库交互:
header("Content-Type: application/json"); include "../../../includes/db.php"; // 一次查询关联本周和上周的对应日期数据 $sql = " SELECT DATE(w1.website_stats_date) AS date, w1.website_stats_homepage AS current_week, w2.website_stats_homepage AS last_week FROM website_stats w1 LEFT JOIN website_stats w2 ON DATE(w1.website_stats_date) = DATE_ADD(DATE(w2.website_stats_date), INTERVAL 7 DAY) WHERE yearweek(DATE(w1.website_stats_date), 1) = yearweek(curdate(), 1) ORDER BY w1.website_stats_date "; $stmt = $connection->prepare($sql); $stmt->execute(); $result = $stmt->get_result(); $combinedData = []; foreach($result as $row) { $combinedData[] = $row; } $stmt->close(); echo json_encode($combinedData);
这个查询通过LEFT JOIN把本周日期和上周同一天的日期关联起来,输出的JSON结构会是:
[ {"date": "2024-05-20", "current_week": 120, "last_week": 95}, {"date": "2024-05-21", "current_week": 150, "last_week": 110}, ... ]
这种结构对前端折线图更友好,直接按日期遍历就能同时拿到两周的数值。
关键注意点
- 确保两周的日期数据完整对应,如果某天上周有数据但本周没有,
LEFT JOIN会让current_week为null,前端可以处理成0或空值。 - 如果你的日期存储包含时间,一定要用
DATE()函数只比较日期部分,避免关联失败。
内容的提问来源于stack exchange,提问作者Paul Laup
相关产品推荐
相关产品推荐

