Экспорт результатов SQL в файл JSON

Я пытаюсь изменить сценарий php для записи в файл JSON при его запуске каждые 15 минут, а затем перезаписать обновленные результаты. У меня есть скрипт, который делает это в базе данных (вставка и обновление дубликата), но мой код для файла 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 Script работает без ошибок и корректно вставляется в мою базу данных, мне просто нужно, чтобы этот скрипт записывал результаты в файл 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);
}

Есть ли что-то, что я могу сделать здесь, чтобы получить вывод, как это происходит, когда я делаю ручной экспорт?

0

Решение

В настоящее время вы перезаписываете файл на каждой итерации. Создайте основной массив для хранения каждой итерации в:

// 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));
1

Другие решения

просто используйте эту строку в области выхода
echo json_encode $ your_final_array;

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector