PHP in MySQL: izvozite poizvedbo v datoteko CSV, ločeno s tabulatorji
Ta vikend sem hotel zgraditi PHP stran, ki bi varnostno kopirala katero koli MySQL poizvedbo ali tabelo v datoteko, ločeno s tabulatorji. Večina primerov na internetu ima stolpce trdo kodirane.
V mojem primeru sem želel, da so stolpci dinamični, zato sem moral najprej pregledati vsa imena polj tabele, da sem zgradil naslovno vrstico z imeni stolpcev, nato pa pregledati vse zapise za preostale podatkovne vrstice. Nastavil sem tudi glavo, tako da bo brskalnik sprožil prenos datoteke v vrsti datoteke (txt) z imenom datoteke, datumom in časovnim žigom.
Izvoz, ločen s tabulatorji, iz MySQL v 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();
?>
Sprehodimo se skozi kodo korak za korakom z razlagami za vsak del:
<?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);
}
- Trenutni datum in čas ustvarimo v formatu »YmdHi« in ju shranimo v
$today
spremenljivka. - Glave HTTP so nastavljene tako, da določajo, da je treba vsebino obravnavati kot oktetni tok (binarni podatki) in sprožijo prenos datoteke z navedenim imenom datoteke.
- Z razširitvijo ustvarimo povezavo z bazo podatkov MySQL, pri čemer nadomestne oznake nadomestimo z vašimi dejanskimi poverilnicami baze podatkov.
- Preverimo, ali je bila povezava z bazo uspešna. Zaključimo skript in prikažemo sporočilo o napaki, če pride do napake.
// 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";
- Definiramo poizvedbo SQL za izbiro vseh podatkov iz
mytable
mizo, ki jo naroča pomyorder
stolpec. - Poizvedba se izvede, rezultat pa se shrani v
$result
spremenljivka. - Preverimo, ali obstajajo vrnjene vrstice, tako da pregledamo
num_rows
lastnost predmeta rezultata. - Mi uporabljamo
fetch_fields()
za pridobitev imen polj (stolpcev) in njihovo shranjevanje v$fields
matrika. - Vrstica z glavo za izvozno datoteko je pripravljena s pomikanjem po imenih polj in njihovim povezovanjem z zavihki.
// 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";
}
- Uporabljamo a
while
zanke za pridobivanje vsake podatkovne vrstice iz niza rezultatov z uporabofetch_assoc()
. - Znotraj zanke pripravimo vrednosti vsake vrstice s ponavljanjem po poljih in zbiranjem ustreznih podatkov.
- Vrednosti za vsako vrstico so povezane z zavihki, da ustvarijo vrstico, ločeno s tabulatorji, in ta vrstica je dodana v
$data
spremenljivka.
// 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();
?>
- Če so najdeni podatki (preverjeno z
num_rows
), ponovimo povezane podatke, ki so vsebina izvozne datoteke. To sproži prenos datoteke v brskalniku uporabnika. - Če podatki niso najdeni, prikažemo sporočilo, da podatki niso na voljo.
- Povezavo z bazo podatkov MySQL zapremo z uporabo
$conn->close()
za sprostitev virov.
Ta koda učinkovito izvozi podatke iz tabele baze podatkov MySQL v besedilno datoteko, ločeno s tabulatorji, in obravnava različne scenarije, kot so napake povezave z bazo podatkov in prazni nizi rezultatov.
Izvoz vrednosti, ločenih z vejico, iz MySQL v PHP
Kodo lahko spremenim za izvoz podatkov kot datoteke CSV. Tukaj je koda, posodobljena za izvoz 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();
?>
V tej spremenjeni kodi:
- Glave za odziv HTTP so posodobljene, da podajo a
text/csv
vrsto vsebine, ime datoteke pa ima pripono ».csv«. - Namesto ročnega ustvarjanja vsebine CSV uporabljamo
fputcsv
funkcijo za izpis vsake vrstice iz nabora rezultatov MySQL kot vrstico CSV. Ta funkcija obravnava oblikovanje CSV namesto vas, vključno z obravnavanjem posebnih znakov in zapiranjem polj v dvojne narekovaje, kadar je to potrebno. - Ročaj izhodne datoteke odpremo z uporabo
fopen
z 'php://output' kot imenom datoteke. To nam omogoča neposredno pisanje v izhodni tok odziva HTTP. - Koda je strukturirana tako, da učinkovito obravnava izvoz CSV in zapre ročaj datoteke, ko je končan.
Ta koda bo izvozila podatke iz tabele MySQL kot datoteko CSV, kar bo uporabnikom olajšalo odpiranje in delo v aplikacijah za preglednice, kot je Excel. Ne pozabite zamenjati poverilnic zbirke podatkov s svojimi.