
PHP і MySQL: Экспарт запыту ў файл з падзельнікамі табуляцыі або ў файл CSV
У гэтыя выхадныя я хацеў пабудаваць a 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 абнаўляюцца, каб паказаць a
text/csv
тып кантэнту, а імя файла мае пашырэнне ".csv". - Замест ручнога стварэння змесціва CSV мы выкарыстоўваем
fputcsv
функцыя для вываду кожнага радка з набору вынікаў MySQL у выглядзе радка CSV. Гэтая функцыя апрацоўвае фарматаванне CSV за вас, уключаючы апрацоўку спецыяльных сімвалаў і заключэнне палёў у двукоссі, калі гэта неабходна. - Мы адкрываем дэскрыптар выходнага файла з дапамогай
fopen
з 'php://output' у якасці імя файла. Гэта дазваляе нам пісаць непасрэдна ў выхадны паток адказу HTTP. - Код пабудаваны для эфектыўнай апрацоўкі экспарту CSV і закрывае дэскрыптар файла пасля завяршэння.
Гэты код будзе экспартаваць даныя з табліцы MySQL у выглядзе файла CSV, што дазваляе карыстальнікам лёгка адкрываць і працаваць з праграмамі электронных табліц, такімі як Excel. Не забудзьцеся замяніць уліковыя даныя базы дадзеных сваімі.
Вы не можаце проста зрабіць:
SELECT `mytable` order by `myorder`
INTO OUTFILE '/tmp/Backup.txt'
FIELDS TERMINATED BY '\t'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
?
Мяркую, вы маглі б!
У гэтым выпадку я на самой справе ствараў спасылку "рэзервовага капіявання" ў вэб-дадатку, таму мне спатрэбілася функцыянальнасць PHP. Аднак я ніколі не ведаў, што вы таксама можаце пісаць у файл непасрэдна з заявы MySQL. Вельмі файна!
Дзякуй!
Ваш шлях, вядома, быў бы лепшым, калі б сервер MySQL знаходзіўся на аддаленай машыне, бо ён, верагодна, не змог бы запісаць на машыну, дзе працуе PHP 🙂
Рады адзначыць іншыя напрамкі і новыя рэчы, хоць though
Выдатны пост. Ці ведаеце вы пра просты, бясплатны / з адкрытым зыходным кодам спосаб імпарту / аднаўлення файла, размежанага табуляцыяй (як вы толькі што стварылі) назад у db mysql?
Памылка ... mysqlimport?
mysqlimport database_name --local backup.txt
Альбо з камандай SQL:
LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
З mysqlimport, імя файла павінна адпавядаць назве табліцы (проста тое, на што трэба сачыць)
Я буду яго ў PHP на працягу тыдня, Ной! Bloid - гэта монстар MySQL! Дзякуй за ўклад !!!
Я проста страціў больш за 6 гадзін свайго жыцця, спрабуючы зразумець, чаму Internet Explorer 6/7 ужывае тып файла "html", а таксама не прымае ўласныя імёны файлаў, указаныя ў загалоўках .. спроба прымусіць карыстальнікаў загружаць тэкставыя файлы, створаныя падобным чынам.
Я выкарыстаў HTTPS, і IE не кэшуе гэтыя файлы.
Я знайшоў рашэнне ў каментары Брэндона К. на http://uk.php.net/header.
Ён кажа:
-
Я проста страціў шэсць гадзін жыцця, спрабуючы выкарыстаць наступны метад для адпраўкі PDF-файла праз PHP у Internet Explorer 6:
Пры выкарыстанні SSL Internet Explorer прапануе дыялогавае акно "Адкрыць / захаваць", але потым кажа: "Файл зараз недаступны альбо яго нельга знайсці. Калі ласка паспрабуйце зноў пазней." Пасля доўгіх пошукаў мне стала вядома наступны артыкул MSKB пад назвай "Загрузка файлаў Internet Explorer па SSL не працуе з загалоўкамі кіравання кэшам" (KBID: 323308)
PHP.INI па змаўчанні выкарыстоўвае параметр: session.cache_limiter = nocache, які змяняе загалоўкі Content-Cache і Pragma, каб уключыць опцыі "nocache". Вы можаце ліквідаваць памылку IE, змяніўшы "nocache" на "public" ці "private" у PHP.INI - Гэта зменіць загаловак Content-Cache, а таксама цалкам выдаліць загаловак Pragma. Калі вы не можаце альбо не хочаце змяніць PHP.INI для выпраўлення для ўсяго сайта, вы можаце адправіць наступныя два загалоўкі, каб перазапісаць стандартныя:
Вам усё роўна трэба будзе ўсталяваць загалоўкі змесціва, як пералічана вышэй, каб гэта працавала. Звярніце ўвагу, гэтая праблема ўздзейнічае ТОЛЬКІ на Internet Explorer, у той час як Firefox не дэманструе такога недахопу.
-
Ну .. па меншай меры, ён страціў толькі 6 гадзін ...
Гэта добра працуе. Аднак я проста атрымліваю ўсё ў адзін радок, падзелены прабелам. Я спрабую змяніць яго, каб надрукаваць усё ў асобным радку, як гэта:
Імя_калонкі1
Поле1_значэнне
Імя_калонкі2
Поле1_значэнне
Імя_калонкі3
Поле1_значэнне
Імя_калонкі1
Поле2_значэнне
Імя_калонкі2
Поле2_значэнне
Імя_калонкі3
Поле2_значэнне
Напрыклад:
Імя
Майк
размяшчэнне
Працаваць
Нумар
1
Імя
Сью
размяшчэнне
Галоўная
Нумар
2
Імя
Джон
размяшчэнне
Падарожнічаць
Нумар
10
і гэтак далей. Ці можна змяніць гэты сцэнар, каб зрабіць гэта?
Дзякуй!
Вядома, можа.
Паспрабуйце нешта накшталт гэтага:
SELECT * from MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' ПОЛІ, СКАНАНЫЯ '\ n' ЛІНІІ, СКАНЧАНЫЯ '\ n';
Калі вам патрэбны двайны прабел (два пустыя радкі) паміж групамі запісаў, проста скажыце "РАДКІ, СКАНАНЫЯ" \ n \ n '; " замест гэтага.
Частка "ПОЛІ, ПРЫКАНАНЫЯ" \ n '"- гэта тое, што ставіць новы радок пасля кожнага запісу, а не табуляцыі. Замест гэтага ўкладка будзе "\ t".
Маранафа!
гэта выклікальна выдатны пост, я паспрабаваў і выдатна працуе, адзінае, што ў маім txt-файле ёсць дадатковы радок над загалоўкамі загалоўкаў, а некаторыя вынікі падзелены ў 2 радкі, гэта можа быць выклікана дадзенымі, якія ў мяне ёсць у маёй базе дадзеных паняцця не маю, але гэта выдатная дапамога для стварэння каналаў ...
Douglas Karr ваш код сапраўды качаецца! Гэта вельмі карысна, калі вам проста патрэбны вывад у фармаце тэкставага файла. Вялікі дзякуй! Ад каманды Філіпіны!
Гэй там! Ці ёсць хто-небудзь адсюль, які можа падказаць нам пра імпарт тэкставага файла ў маю базу дадзеных (phpmyAdmin), выкарыстоўваючы мой php як мой інтэрфейс. У мяне ёсць ідэя загрузіць файл і адкрыць яго, мая праблема ў тым, што як я магу атрымаць вынік радка і як уставіць яго ў свае табліцы, дзякуй
Калі ласка, хто-небудзь падкажа мне, як выдаліць радок загалоўка http над загалоўкамі загалоўкаў