【问题标题】:Not able to pass array data无法传递数组数据
【发布时间】:2020-01-28 08:49:13
【问题描述】:

我试图在$data 中创建一个数组,但它没有发生。我正在使用此代码制作每日销售图表。

$data = array();
for ($i = 0; $i <= 10; $i++) {
    $billdate = date('d-m-Y', strtotime("-$i day"));
    $sqlQuery = "select sum(amount),bill_date from msr_bills WHERE bill_date='$billdate' ";
    $result = mysqli_query($con, $sqlQuery);

    $fetchamount = mysqli_fetch_row($result);
    $sum = $fetchamount[0];

    $data = new \stdClass();
    $data->bill_date = $billdate;
    $data->amount = $sum;
    $report_JSON = json_encode($data);

    echo  $report_JSON.",";
}

【问题讨论】:

    标签: php arrays json mysqli


    【解决方案1】:

    您可以将循环合并到一个查询中,然后对结果进行迭代:

    $data = array();
    $billdate = date('Y-m-d', strtotime('-10 day'));
    $sqlQuery = "SELECT bill_date, SUM(amount) AS amount
                 FROM msr_bills
                 WHERE bill_date >= '$billdate'
                 GROUP BY bill_date";
    $result = mysqli_query($sqlQuery);
    if ($result) {
        while ($row = mysqli_fetch_assoc($result)) {
            $data[] = (object)$row;
        }
        $report_JSON = json_encode($data);
        echo  $report_JSON;
    }
    

    请注意,您的日期格式与以Y-m-d 格式存储的 MySQL 日期不兼容,我已在代码中进行了更改。如果您的bill_date 列实际上是以d-m-Y 格式存储的文本字段,则您需要在查询中将其转换为:

    $sqlQuery = "SELECT bill_date, SUM(amount) AS amount
                 FROM msr_bills
                 WHERE STR_TO_DATE(bill_date, '%d-%m-%Y') >= '$billdate'
                 GROUP BY bill_date";
    

    还请注意,您实际上可以使用日期算法在 SQL 查询内部计算 $billdate

    $sqlQuery = "SELECT bill_date, SUM(amount) AS amount
                 FROM msr_bills
                 WHERE STR_TO_DATE(bill_date, '%d-%m-%Y') >= CURDATE() - INTERVAL 10 DAY
                 GROUP BY bill_date";
    

    如果你运行的是 MySQL 8.0+,你可以在 MySQL 中完成整个操作:

    $sqlQuery = "SELECT JSON_ARRAYAGG(data) AS data
                 FROM (SELECT JSON_OBJECT('bill_date', bill_date, 'amount', SUM(amount)) AS data
                       FROM msr_bills
                       WHERE bill_date >= CURDATE() - INTERVAL 10 DAY
                       GROUP BY bill_date) d";
    $result = mysqli_query($sqlQuery);
    if ($result) {
        $row = mysqli_fetch_assoc($result);
        $report_JSON = $row['data'];
        echo $report_JSON;
    }
    

    Demo on dbfiddle

    【讨论】:

    • 如果 SQL 没有外部输入,那为什么还要使用 PHP?所有这些逻辑都可以转移到 SQL 中。
    • @Dharman 好点。我已经在答案中记录了日期计算。请注意,最常用的 MySQL 版本不支持在 MySQL 中实现 整个 代码所需的 JSON 函数。
    • @Dharman 我还添加了代码来在 MySQL 中进行所有 JSON 聚合,如果 OP 碰巧正在运行 MySQL 8+
    • 是的……我试过了……现在工作正常……谢谢
    • @user3694260 不用担心。我很高兴能帮上忙。
    【解决方案2】:

    把你的回声放在循环之外。删除代码$report_JSON = json_encode($data);

    $respnseArr = array();
    
    {
    .
    .
    .
      $respnseArr[] = $data;
    }
    
    echo json_encode($respnseArr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多