PHP és MySQL: Exportáljon lekérdezést tabulátorral tagolt vagy CSV-fájlba
Ezen a hétvégén szerettem volna építeni a PHP oldal, amelyről biztonsági másolat készül MySQL lekérdezést vagy táblázatot egy tabulátorral tagolt fájlba. A neten található példák többségében az oszlopok kemény kódolásúak.
Az én esetemben azt szerettem volna, hogy az oszlopok dinamikusak legyenek, ezért először az összes táblamezőnevet át kellett hurcolnom, hogy felállítsam a fejlécsort az oszlopnevekkel, majd a fennmaradó adatsorok összes rekordját végig kellett hurcolnom. A fejlécet is úgy állítottam be, hogy a böngésző a fájl nevével dátummal és időbélyeggel ellátott fájltípusban (txt) kezdeményezze a letöltést.
Tabulátorral tagolt exportálás MySQL-ből PHP-ben
<?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();
?>
Nézzük végig a kódot lépésről lépésre, az egyes részekre vonatkozó magyarázatokkal:
<?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);
}
- Az aktuális dátumot és időt „YmdHi” formátumban állítjuk elő és tároljuk a
$today
változót. - A HTTP-fejlécek úgy vannak beállítva, hogy meghatározzák, hogy a tartalmat oktett adatfolyamként (bináris adatként) kell kezelni, és a megadott fájlnévvel fájlletöltést kell indítani.
- A bővítmény használatával MySQL adatbázis-kapcsolatot hozunk létre, a helyőrzőket lecserélve az Ön tényleges adatbázis-hitelesítő adataira.
- Ellenőrizzük, hogy az adatbázis-kapcsolat sikeres volt-e. Leállítjuk a szkriptet, és hiba esetén hibaüzenetet jelenítünk meg.
// 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";
- Meghatározzuk az SQL lekérdezést az összes adat kiválasztásához
mytable
asztalra, megrendelve amyorder
oszlop. - A lekérdezés végrehajtásra kerül, és az eredmény eltárolásra kerül a
$result
változót. - Ellenőrizzük, hogy vannak-e visszaadott sorok a
num_rows
az eredmény objektum tulajdonsága. - Az általunk használt
fetch_fields()
a mezők (oszlopok) nevének lekéréséhez és tárolására a$fields
sor. - Az exportfájl fejlécsora a mezőnevek áthurkolásával és tabulátorokkal való összefűzésével készül.
// 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";
}
- Használjuk a
while
hurkot az egyes adatsorok lekéréséhez az eredménykészletből a használatávalfetch_assoc()
. - A cikluson belül elkészítjük az egyes sorok értékeit a mezők iterációjával és a megfelelő adatok összegyűjtésével.
- Az egyes sorok értékei tabulátorokkal vannak összefűzve tabulátorral tagolt sor létrehozásához, és ez a sor hozzáadódik a
$data
változót.
// 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();
?>
- Ha vannak talált adatok (ellenőrizve a
num_rows
), visszhangozzuk az összefűzött adatokat, amelyek az exportfájl tartalma. Ez elindítja a fájl letöltését a felhasználó böngészőjében. - Ha nem található adat, akkor egy üzenetet jelenítünk meg, amely jelzi, hogy nincs adat.
- A MySQL adatbázis-kapcsolatot a használatával lezárjuk
$conn->close()
források felszabadítására.
Ez a kód hatékonyan exportálja az adatokat egy MySQL adatbázistáblából egy tabulátorral tagolt szövegfájlba, és különféle forgatókönyveket kezel, például adatbázis-kapcsolati hibákat és üres eredményhalmazokat.
Vesszővel elválasztott értékek exportálása MySQL-ből PHP-ben
Módosíthatom a kódot, hogy adatokat exportálhassak CSV-fájlként. Íme a CSV-exportáláshoz frissített kód:
<?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();
?>
Ebben a módosított kódban:
- A HTTP-válasz fejlécei frissítésre kerülnek, és a
text/csv
tartalomtípust, és a fájlnév kiterjesztése „.csv”. - A CSV-tartalom manuális létrehozása helyett a
fputcsv
függvényt, hogy a MySQL eredménykészlet minden sorát CSV-sorként adja ki. Ez a funkció kezeli Ön helyett a CSV formázását, beleértve a speciális karakterek kezelését és a mezők dupla idézőjelbe zárását, ha szükséges. - A kimeneti fájl kezelőjét a segítségével nyitjuk meg
fopen
'php://output' fájlnévvel. Ez lehetővé teszi számunkra, hogy közvetlenül a HTTP válasz kimeneti adatfolyamába írjunk. - A kód úgy van felépítve, hogy hatékonyan kezelje a CSV-exportálást, és bezárja a fájlkezelőt, ha kész.
Ez a kód CSV-fájlként exportálja az adatokat a MySQL-táblázatból, így a felhasználók könnyen megnyithatják és dolgozhatnak táblázatkezelő alkalmazásokban, például az Excelben. Ne felejtse el lecserélni az adatbázis hitelesítő adatait a sajátjával.