На этих выходных я хотел создать страницу 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, закрывая дескриптор файла по завершении.
Этот код экспортирует данные из таблицы MySQL в файл CSV, что упрощает пользователям открытие и работу с приложениями для работы с электронными таблицами, такими как Excel. Не забудьте заменить учетные данные базы данных своими собственными.