Как реализовать на php экспорт данных вида json из SQL — в csv?

Ссылка скопирована
1 ответ

Коллеги, есть функция, которая экспортирует данные с таблицы БД в csv. Все хорошо работает пока не натыкается на ячейку, в которой находятся данные в виде json.

function process_export_csv($array, $file_name = 'data') {      if(isset($_GET['export']) && $_GET['export'] == 'csv') {          header('Content-Disposition: attachment; filename="' . $file_name . '.csv";');         header('Content-Type: application/csv; charset=UTF-8');          $csv = csv_exporter($array);          die($csv);     }  }  function csv_exporter($array) {      $result = '';          /* Экспорт заголовка */     $headers = [];     foreach(array_keys((array) reset($array)) as $value) {             $headers[] = '"' . $value . '"';     }      $result .= implode(',', $headers);      /* Данные */     foreach($array as $row) {         $result .= "n";          $row_array = [];          foreach($row as $key => $value) {                              $row_array[] = '"' . addslashes($value) . '"';                      }          $result .= implode(',', $row_array);     }      return $result; }  function csv_link_exporter($csv) {     return 'data:application/csv;charset=utf-8,' . urlencode($csv); }

function process_export_csv($array, $file_name = 'data') { if(isset($_GET['export']) && $_GET['export'] == 'csv') { header('Content-Disposition: attachment; filename="' . $file_name . '.csv";'); header('Content-Type: application/csv; charset=UTF-8'); $csv = csv_exporter($array); die($csv); } } function csv_exporter($array) { $result = ''; /* Экспорт заголовка */ $headers = []; foreach(array_keys((array) reset($array)) as $value) { $headers[] = '"' . $value . '"'; } $result .= implode(',', $headers); /* Данные */ foreach($array as $row) { $result .= "n"; $row_array = []; foreach($row as $key => $value) { $row_array[] = '"' . addslashes($value) . '"'; } $result .= implode(',', $row_array); } return $result; } function csv_link_exporter($csv) { return 'data:application/csv;charset=utf-8,' . urlencode($csv); }

в тоже самое время - есть функция, которой экспортирую эту же таблицу БД в json:

function process_export_csv($array, $file_name = 'data') {      if(isset($_GET['export']) && $_GET['export'] == 'csv') {           header('Content-Disposition: attachment; filename="' . $file_name . '.csv";');         header('Content-Type: application/csv; charset=UTF-8');          $csv = csv_exporter($array);          die($csv);     }  }  function csv_exporter($array) {      foreach($array as $object) {          foreach($object as $key => $value) {                       }      }      return csv_encode($array); }

function process_export_csv($array, $file_name = 'data') { if(isset($_GET['export']) && $_GET['export'] == 'csv') { header('Content-Disposition: attachment; filename="' . $file_name . '.csv";'); header('Content-Type: application/csv; charset=UTF-8'); $csv = csv_exporter($array); die($csv); } } function csv_exporter($array) { foreach($array as $object) { foreach($object as $key => $value) { } } return csv_encode($array); }

Есть ли способ/идеи - как можно дописать функцию для экспорта в csv, чтобы она натыкаясь на данные json -разбивала их либо на отдельные столбики, либо как-то массивом записывала в одну ячейку? В идеале, разбивать столбики на "Название таблицы/key" а в ячейку писать value.
Вот пример ячейки, на которой спотыкается функция экспорта:

{"email":"email@gmail.com","name":"Вася","phone":"+79987987987"}

{"email":"email@gmail.com","name":"Вася","phone":"+79987987987"}

Дополнительно:

Вот совершенно явное желание написать свой собственный сервер БД... нахрена, спрашивается, делать на PHP то, что сервер БД умеет лучше и для чего имеет готовые и вылизанные разработчиками инструменты? Я понимаю, что программисты, одинаково свободно владеющие как PHP, так и SQL - большая редкость (это практический вывод из многолетних наблюдений). Но как по мне, так это повод учиться, а не повод делать через одно место...

Вот пример ячейки, на которой спотыкается функция экспорта:

{"email":"email@gmail.com","name":"Вася","phone":"+79987987987"}

{"email":"email@gmail.com","name":"Вася","phone":"+79987987987"}

И какие именно проблемы при этом возникают? Обычный себе текст...

Ответы:

не читал весь ваш код, но, добавьте себе вот эту функцию:

function isJson($string) {    json_decode($string);    return json_last_error() === JSON_ERROR_NONE; }

function isJson($string) { json_decode($string); return json_last_error() === JSON_ERROR_NONE; }

она будет вам указывать является ли строка в ячейке json строкой.
следовательно:

/* Данные */     foreach($array as $row) {         $result .= "n";          $row_array = [];         if(isJson($row)){               $row = json_decode($row); //это массив.         }         foreach($row as $key => $value) {                              $row_array[] = '"' . addslashes($value) . '"';                      }          $result .= implode(',', $row_array);     }

/* Данные */ foreach($array as $row) { $result .= "n"; $row_array = []; if(isJson($row)){ $row = json_decode($row); //это массив. } foreach($row as $key => $value) { $row_array[] = '"' . addslashes($value) . '"'; } $result .= implode(',', $row_array); }

Ты неправильно создаешь csv, строки в валидном csv могут содержать n и разделитель (дублируется), используй штатную функцию fputcsv, записывающую строчку в файл (аналогично читать fgetcsv)

Для json потоково одним проходом не получится, не зная структуры этих json для csv нужно будет два прохода: первый - определяет все возможные колонки (и если надо сохраняет значения), а второй - заполняет массив строки (для передачи fputcsv) пустыми значениями для тех колонок, значения которых отсутствуют. Чтобы порядок был верный первый проход должен сформировать массив - список названий колонок, а второй проход в цикле формирует массив пробегая по этому массиву названий колонок.

p.s. а у тебя в json точно только один уровень? если есть вложенности на это нужно проверку делать и как то реагировать

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

Для реализации экспорта данных в формат JSON из SQL в CSV на PHP, нужно выполнить следующие шаги:

1. Подключиться к базе данных и выполнить SQL запрос для выборки данных. Например, если у вас есть таблица `users` с полями `id`, `name` и `email`, то запрос может выглядеть так:

$conn = new mysqli($servername, $username, $password, $dbname);
 
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
 
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

$conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, name, email FROM users"; $result = $conn->query($sql);

2. Создать массив данных из результата SQL запроса и преобразовать его в формат JSON с помощью функции `json_encode()`:

$data = array();
while($row = $result->fetch_assoc()) {
    $data[] = $row;
}
 
$json_data = json_encode($data);

$data = array(); while($row = $result->fetch_assoc()) { $data[] = $row; } $json_data = json_encode($data);

3. Создать CSV файл и записать в него данные из массива. Для этого можно воспользоваться функцией `fputcsv()`:

$fp = fopen('data.csv', 'w');
 
foreach ($data as $row) {
    fputcsv($fp, $row);
}
 
fclose($fp);

$fp = fopen('data.csv', 'w'); foreach ($data as $row) { fputcsv($fp, $row); } fclose($fp);

4. Готово! Теперь у вас есть CSV файл с данными из базы данных в формате JSON. Вы можете скачать этот файл или использовать его для дальнейшей обработки.

Это базовый пример реализации экспорта данных из SQL в CSV на PHP. Вы можете дополнить его дополнительной логикой или условиями в зависимости от ваших потребностей.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно