
PHP и MySQL: извезете барање во разграничена картичка или CSV-датотека
Овој викенд сакав да изградам а 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 🙂
Мило ми е да укажам на други насоки и нови работи сепак 🙂
Одличен пост. Дали знаете за лесен, бесплатен/отворен код метод за увоз/враќање на датотека ограничена со јазичиња (како што штотуку ја создадовте) назад во mysql db?
Грешка… 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“ во „јавно“ или „приватно“ во 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
и така натаму. Дали оваа скрипта може да се измени за да се направи тоа?
Ви благодариме!
Сигурно може.
Пробајте вакво нешто:
ИЗБЕРЕТЕ * од MyTableName ВО OUTFILE „MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt“ ПОЛИЊА ПРЕКИНУВАНИ СО „\n“ ЛИНИИ ПРЕКИНУВАНИ СО „\n“;
Ако сакате двоен простор (две празни линии) помеѓу групите за снимање, само кажете „ЛИНИИ ПРЕКИНУВАНИ СО „\n\n“; наместо тоа.
Делот „POLYS TRAMINATED BY '\n“ е она што става нова линија после секој запис, наместо таб. Наместо тоа, табот ќе биде '\t'.
Мараната!
ова е пркосно одличен пост, го пробав и работев одлично, единственото нешто е што мојата txt-датотека има дополнителен ред над насловите на заглавието, а некои резултати се одделени во 2 реда, ова може да е предизвикано од податоците што ги имам во мојата база на податоци нема идеја, но ова е одлична помош за создавање на доводи…
Douglas Karr вашиот код навистина се лути! Тоа е многу корисно, особено ако ви треба само излез што е во формат на текстуална датотека. Благодарам многу! Од тимот на Филипини!
Здраво! Дали има некој од овде што може да ми даде совет за увоз на текстуална датотека во мојата база на податоци (phpmyAdmin) користејќи го мојот php како преден крај. Имам идеја за преземање датотека и отворање, мојот проблем е како можам да го добијам резултатот од редот и како да го вметнам во моите табели, благодарам
Ве молам, може ли некој да ми каже како да го отстранам редот за заглавие http над насловите на заглавието