На этих выходных я хотел создать страницу PHP, которая будет выполнять резервное копирование любого запроса или таблицы MySQL в файл, разделенный табуляцией. В большинстве примеров, доступных в сети, столбцы закодированы.

В моем случае я хотел, чтобы столбцы были динамическими, поэтому сначала мне пришлось просмотреть все имена полей в таблице, чтобы создать строку заголовка с именами столбцов, а затем просмотреть все записи для оставшихся строк данных. Я также установил заголовок, чтобы браузер начал загрузку файла в формате txt с именем файла и меткой времени.

Экспорт с разделителями табуляции из MySQL в PHP

<?php
$today = date("YmdHi");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$today."_Backup.txt\"");
$conn = new mysqli("hostname", "username", "password", "database_name"); // Replace with your database credentials

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$query = "SELECT * FROM `mytable` ORDER BY `myorder`";
$result = $conn->query($query);

if ($result->num_rows > 0) {
    $fields = $result->fetch_fields();
    
    // Prepare the header row
    $header = [];
    foreach ($fields as $field) {
        $header[] = $field->name;
    }
    $data = implode("\t", $header) . "\n";

    // Fetch and process the data rows
    while ($row = $result->fetch_assoc()) {
        $rowValues = [];
        foreach ($fields as $field) {
            $rowValues[] = $row[$field->name];
        }
        $data .= implode("\t", $rowValues) . "\n";
    }

    // Output the data
    echo $data;
} else {
    echo "No data found";
}

// Close the database connection
$conn->close();
?>

Давайте рассмотрим код пошагово с пояснениями к каждой части:

<?php
// Get the current date and time in a specific format
$today = date("YmdHi");

// Set HTTP headers for file download
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$today."_Backup.txt\"");

// Create a MySQL database connection
$conn = new mysqli("hostname", "username", "password", "database_name"); // Replace with your database credentials

// Check if the database connection was successful
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
  • Мы генерируем текущую дату и время в формате YmdHi и сохраняем ее. $today переменная.
  • Заголовки HTTP указывают, что содержимое следует рассматривать как поток октетов (двоичные данные), и запускают загрузку файла с указанным именем.
  • С помощью расширения мы создаем соединение с базой данных MySQL, заменяя заполнители вашими фактическими учетными данными базы данных.
  • Проверяем, удалось ли подключение к базе данных. Мы останавливаем скрипт и отображаем сообщение об ошибке, если возникает ошибка.
// Define the SQL query to select data from the `mytable` table
$query = "SELECT * FROM `mytable` ORDER BY `myorder`";

// Execute the SQL query
$result = $conn->query($query);

// Check if there are any rows returned
if ($result->num_rows > 0) {
    // Fetch the field (column) names
    $fields = $result->fetch_fields();

    // Prepare the header row for the export file
    $header = [];
    foreach ($fields as $field) {
        $header[] = $field->name;
    }
    $data = implode("\t", $header) . "\n";
  • Мы определяем SQL-запрос для выбора всех данных из mytable стол, заказав его после myorder столбец.
  • Запрос выполняется, и результат сохраняется в папке $result переменная.
  • Мы проверяем, возвращаются ли строки, проверяя num_rows свойство объекта результата.
  • Мы используем fetch_fields() получить имена полей (столбцов) и сохранить их в папке $fields множество.
  • Строка заголовка файла экспорта готовится путем проверки имен полей и объединения их с помощью табуляции.
    // Fetch and process the data rows
    while ($row = $result->fetch_assoc()) {
        $rowValues = [];
        foreach ($fields as $field) {
            $rowValues[] = $row[$field->name];
        }
        $data .= implode("\t", $rowValues) . "\n";
    }
  • Мы используем while цикл для получения каждой строки данных из набора результатов, используя fetch_assoc().
  • Внутри цикла мы готовим значения для каждой строки, перебирая поля и собирая соответствующие данные.
  • Значения в каждой строке объединяются с помощью табуляции, образуя строку, разделенную табуляцией, и эта строка добавляется. $data переменная.
    // Output the data to the browser
    echo $data;
} else {
    // If no data is found, display a message
    echo "No data found";
}

// Close the MySQL database connection
$conn->close();
?>
  • Если данные найдены (проверено с помощью num_rows), мы перебираем объединенные данные, которые являются содержимым файла экспорта. Это запускает загрузку файла в браузере пользователя.
  • Если данные не найдены, отображается сообщение о том, что данные недоступны.
  • Закрываем соединение с базой данных MySQL, используя $conn->close() освободить ресурсы.
ЧИТАТЬ  Цинклар: Исследование мирового рынка для достижения успеха в маркетинге, основанном на данных | зона Мартех

Этот код эффективно экспортирует данные из таблицы базы данных MySQL в текстовый файл, разделенный табуляцией, и обрабатывает различные сценарии, такие как ошибки подключения к базе данных и пустые наборы результатов.

Экспорт значений, разделенных запятыми, из MySQL в PHP

Я могу изменить код для экспорта данных в виде файла CSV. Вот код, обновленный для экспорта CSV:

<?php
// Get the current date and time in a specific format
$today = date("YmdHi");

// Set HTTP headers for file download
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=\"".$today."_Backup.csv\"");

// Create a MySQL database connection
$conn = new mysqli("hostname", "username", "password", "database_name"); // Replace with your database credentials

// Check if the database connection was successful
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Define the SQL query to select data from the `mytable` table
$query = "SELECT * FROM `mytable` ORDER BY `myorder`";

// Execute the SQL query
$result = $conn->query($query);

// Check if there are any rows returned
if ($result->num_rows > 0) {
    // Prepare the output file handle for writing
    $output = fopen('php://output', 'w');

    // Fetch and process the data rows
    while ($row = $result->fetch_assoc()) {
        // Output each row as a CSV line
        fputcsv($output, $row);
    }

    // Close the output file handle
    fclose($output);
} else {
    // If no data is found, display a message
    echo "No data found";
}

// Close the MySQL database connection
$conn->close();
?>

В этом модифицированном коде:

  • Заголовки ответов HTTP обновляются, чтобы указать text/csv тип контента, а имя файла имеет расширение «.csv».
  • Вместо того, чтобы вручную создавать содержимое CSV, мы используем fputcsv функция для вывода каждой строки из набора результатов MySQL в виде строки CSV. Эта функция обрабатывает форматирование CSV, включая обработку специальных символов и полей двойных кавычек, где это необходимо.
  • Мы открываем дескриптор выходного файла, используя fopen с «php://output» в качестве имени файла. Это позволяет нам записывать HTTP-ответы непосредственно в выходной поток.
  • Код структурирован так, чтобы эффективно обрабатывать экспорт CSV, закрывая дескриптор файла по завершении.
ЧИТАТЬ  Подумайте об APML или об отсутствии энтропии, мы все умрем

Этот код экспортирует данные из таблицы MySQL в файл CSV, что упрощает пользователям открытие и работу с приложениями для работы с электронными таблицами, такими как Excel. Не забудьте заменить учетные данные базы данных своими собственными.

Source