You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并查询结果为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:07:59