php - 将sql结果导出到JSON文件

标签 php mysql sql json

我正在尝试修改一个 php 脚本,以便在每 15 分钟运行一次时写入 JSON 文件,然后覆盖更新的结果。我的脚本在数据库中执行此操作(插入和更新重复项),但我的 JSON 文件代码运行不正常。

当我从工作台手动导出到 JSON 时,我得到了这个(这就是我想要的):

                [
                {
                    "ID" : 1,
                    "Extension" : 7218,
                    "ExtID" : 35302,
                    "Total_Talk_Time_seconds" : 11,
                    "Total_Talk_Time_minutes" : 0.18,
                    "Total_Inbound" : 0,
                    "Total_Outbound" : 1,
                    "Missed_Calls" : 0,
                    "Total_Calls" : null,
                    "Date_of_report" : "2017-08-15",
                    "Time_of_report" : "2017-08-15 08:58:31"
                },
                {
                    "ID" : 2,
                    "Extension" : 7306,
                    "ExtID" : 35370,
                    "Total_Talk_Time_seconds" : 762,
                    "Total_Talk_Time_minutes" : 12.7,
                    "Total_Inbound" : 4,
                    "Total_Outbound" : 0,
                    "Missed_Calls" : 3,
                    "Total_Calls" : null,
                    "Date_of_report" : "2017-08-15",
                    "Time_of_report" : "2017-08-15 08:58:31"
                },
                {
                    "ID" : 3,
                    "Extension" : 7358,
                    "ExtID" : 35278,
                    "Total_Talk_Time_seconds" : 41,
                    "Total_Talk_Time_minutes" : 0.68,
                    "Total_Inbound" : 0,
                    "Total_Outbound" : 0,
                    "Missed_Calls" : 0,
                    "Total_Calls" : null,
                    "Date_of_report" : "2017-08-15",
                    "Time_of_report" : "2017-08-15 08:58:31"
                }
            ]

但是当我运行下面的实际 PHP 脚本时,我得到了:

    {"extension":"7358","RESPONSIBLEUSEREXTENSIONID":"35278","Total_Talk_Time_seconds":"41","Total_Talk_Time_minutes":"0.68","Total_Outbound":"0","Total_Inbound":"0","Total_Missed":"0","Total_Calls":"0","time":"2017-08-15 10:05:07","date":"2017-08-15"}

所以,它最终写入了结果,但它只是 6 条记录中的一条,而且是表中的第三条记录,所以对我来说,为什么它会将第三条记录拉为一条记录,这真的没有意义。它也不是通过为每个值提供一个新行来格式化为 JSON,但总的来说,JSON 对我来说非常陌生。

PHP 脚本运行时没有错误,并正确插入到我的数据库中,我只需让该脚本将结果写入 JSON 文件,并在每 15 分钟运行一次时进行覆盖。

$data = mysqli_query($conn, " SELECT c.extension
                          ,RESPONSIBLEUSEREXTENSIONID
                          , sum(Duration) AS Total_Talk_Time_seconds
                          , round(sum(Duration) / 60,2) AS Total_Talk_Time_minutes
                          , sum(if(LEGTYPE1 = 1,1,0)) AS Total_Outbound
                          , sum(if(LEGTYPE1 = 2,1,0)) AS Total_Inbound
                          , sum(if(Answered = 1,0,1)) AS Total_Missed
                          , count(DISTINCT b.NOTABLECALLID) AS total_calls
                          , NOW() AS time
                          , curdate() AS date
                      FROM cdrdb.session a
                      INNER JOIN cdrdb.callsummary b
                           ON a.NOTABLECALLID = b.NOTABLECALLID
                      INNER join cdrdb.mxuser c
                           ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID
                      WHERE b.ts >= curdate()
                      AND c.extension IN (7295,7306,7218,7247,7330,7000,7358)
                      group by c.extension");


                      $stmt = mysqli_prepare($conn2, "Insert into jfi.ambitionphone(Extension, ExtID, Total_Talk_Time_seconds,
                       Total_Talk_Time_minutes,Total_Outbound, Total_Inbound,
                       Missed_Calls, Total_Calls, Time_of_report,Date_of_report  )
                         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                         ON duplicate key update
                         Total_Talk_Time_seconds = values(Total_Talk_Time_seconds),
                         Total_Talk_Time_minutes = values(Total_Talk_Time_minutes),
                         Total_Outbound = values(Total_Outbound),
                         Total_Inbound = values(Total_Inbound),
                         Missed_calls = values(Missed_Calls),
                         Total_Calls = values(Total_Calls),
                         Time_of_report = values(Time_of_report),
                         Date_of_report = values(Date_of_report)") or die(mysqli_error($conn2));


 foreach ($data as $d) {

      mysqli_stmt_bind_param($stmt,"iiidiiiiss", $d['extension'], $d['RESPONSIBLEUSEREXTENSIONID'],
          $d['Total_Talk_Time_seconds'], $d['Total_Talk_Time_minutes'],
          $d['Total_Outbound'], $d['Total_Inbound'], $d['Total_Missed'], $d['Total_Calls'],
          $d['time'], $d['date']) or die(mysqli_error($conn2));
     mysqli_stmt_execute($stmt) or die(mysqli_error($conn2));

 $ambitionJSONdata = json_encode($d);
     file_put_contents('ambitionLog.json', $ambitionJSONdata);
 }

我可以在这里做些什么来获得像手动导出时一样的输出吗?

最佳答案

您当前正在每次迭代中覆盖该文件。创建一个主数组来存储每次迭代:

// Create the main array
$content = [];

while ($d = mysqli_fetch_array($data, MYSQLI_ASSOC)) {

    mysqli_stmt_bind_param($stmt,"iiidiiiiss", $d['extension'], $d['RESPONSIBLEUSEREXTENSIONID'],
          $d['Total_Talk_Time_seconds'], $d['Total_Talk_Time_minutes'],
          $d['Total_Outbound'], $d['Total_Inbound'], $d['Total_Missed'], $d['Total_Calls'],
          $d['time'], $d['date']) or die(mysqli_error($conn2));
    mysqli_stmt_execute($stmt) or die(mysqli_error($conn2));

    // Store the current row in the main array
    $content[] = $d;
}

// Store the main array that contains all the rows
file_put_contents('ambitionLog.json', json_encode($content));

关于php - 将sql结果导出到JSON文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45694626/

相关文章:

php - 从数据库中获取最大值并加一

php - 创建图像的缩放缩略图并以有组织的方式回显结果 3 列,无限行,每行每列一个图 block

php - 在 CakePHP 中多次提交请求后将变量设置为静态?

php - 在 PHP 中迭代 MySQLi 结果数组中的行以存储为新的嵌套数组

mysql - 将多个 CSV 文件加载到 MySQL 中

php - 规范化的 MySQL 数据透视/行到没有唯一名称的列

sql - 函数中的临时表和循环

sql - 如何使用自动增量列在 Snowflake 中创建 View

php - 使用 wp 等短代码在 Laravel 5.1 中渲染数据

php - 是否可以将 "Notice: Trying to get property of non-object"变成 fatal error ?