PHP dhe MySQL: Eksportoni një pyetje në një skedar të ndarë me skedë ose CSV
Këtë fundjavë, doja të ndërtoja një PHP faqe që do të kopjonte ndonjë MySQL pyetje ose tabelë në një skedar të ndarë me skeda. Shumica e shembujve në rrjet i kanë kolonat të koduara.
Në rastin tim, doja që kolonat të ishin dinamike, kështu që fillimisht më duhej të bëja një cikli nëpër të gjithë emrat e fushave të tabelës për të ndërtuar rreshtin e kokës me emrat e kolonave dhe më pas të bëja një cikli nëpër të gjitha rekordet për rreshtat e mbetur të të dhënave. Vendosa gjithashtu kokën në mënyrë që shfletuesi të fillojë shkarkimin e skedarit në llojin e skedarit (txt) me emrin e datës së skedarit dhe vulën kohore.
Eksporti i ndarë me skeda nga MySQL në 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();
?>
Le të ecim nëpër kodin hap pas hapi me shpjegime për secilën pjesë:
<?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);
}
- Ne gjenerojmë datën dhe orën aktuale në formatin "YmdHi" dhe e ruajmë atë në
$today
ndryshueshme. - Titujt e HTTP janë caktuar për të specifikuar që përmbajtja duhet të trajtohet si një rrymë oktet (të dhëna binare) dhe të aktivizojë një shkarkim skedari me emrin e skedarit të specifikuar.
- Duke përdorur shtesën, ne krijojmë një lidhje të bazës së të dhënave MySQL, duke zëvendësuar mbajtësit e vendeve me kredencialet tuaja aktuale të bazës së të dhënave.
- Ne kontrollojmë nëse lidhja e bazës së të dhënave ishte e suksesshme. Ne e mbyllim skriptin dhe shfaqim një mesazh gabimi nëse ka një gabim.
// 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";
- Ne përcaktojmë pyetjen SQL për të zgjedhur të gjitha të dhënat nga
mytable
tryezë, duke e porositur atë ngamyorder
kolona. - Pyetja ekzekutohet dhe rezultati ruhet në
$result
ndryshueshme. - Ne kontrollojmë nëse ka ndonjë rresht të kthyer duke ekzaminuar
num_rows
veti e objektit të rezultatit. - Ne përdorim
fetch_fields()
për të marrë emrat e fushave (kolonave) dhe t'i ruani ato në$fields
grup - Rreshti i kokës për skedarin e eksportit përgatitet duke kaluar nëpër emrat e fushave dhe duke i bashkuar ato me skeda.
// 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";
}
- Ne përdorim një
while
lak për të marrë çdo rresht të dhënash nga grupi i rezultateve duke përdorurfetch_assoc()
. - Brenda ciklit, ne përgatisim vlerat e çdo rreshti duke përsëritur nëpër fusha dhe duke mbledhur të dhënat përkatëse.
- Vlerat për çdo rresht bashkohen me skeda për të krijuar një rresht të kufizuar me skeda dhe ky rresht shtohet në
$data
ndryshueshme.
// 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();
?>
- Nëse gjenden të dhëna (kontrolluar me
num_rows
), ne i bëjmë jehonë të dhënave të lidhura, që është përmbajtja e skedarit të eksportit. Kjo shkakton shkarkimin e skedarit në shfletuesin e përdoruesit. - Nëse nuk gjenden të dhëna, ne shfaqim një mesazh që tregon se nuk ka të dhëna të disponueshme.
- Ne mbyllim lidhjen e bazës së të dhënave MySQL duke përdorur
$conn->close()
për të liruar burimet.
Ky kod eksporton në mënyrë efikase të dhënat nga një tabelë e bazës së të dhënave MySQL në një skedar teksti të kufizuar me skeda dhe trajton skenarë të ndryshëm, të tillë si gabimet e lidhjes së bazës së të dhënave dhe grupet boshe të rezultateve.
Vlerat e ndara me presje Eksporto nga MySQL në PHP
Mund ta modifikoj kodin për të eksportuar të dhënat si skedar CSV. Këtu është kodi, i përditësuar për eksportimin 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();
?>
Në këtë kod të modifikuar:
- Titujt për përgjigjen HTTP përditësohen për të specifikuar a
text/csv
lloji i përmbajtjes dhe emri i skedarit ka ekstensionin “.csv”. - Në vend që të krijojmë manualisht përmbajtjen CSV, ne përdorim
fputcsv
funksion për të nxjerrë çdo rresht nga rezultati MySQL i vendosur si një linjë CSV. Ky funksion trajton formatimin CSV për ju, duke përfshirë trajtimin e karaktereve speciale dhe mbylljen e fushave në thonjëza të dyfishta kur është e nevojshme. - Ne hapim dorezën e skedarit të daljes duke përdorur
fopen
me 'php://output' si emër skedari. Kjo na lejon të shkruajmë drejtpërdrejt në rrjedhën e daljes së përgjigjes HTTP. - Kodi është strukturuar për të trajtuar me efikasitet eksportin CSV dhe mbyll dorezën e skedarit kur të përfundojë.
Ky kod do t'i eksportojë të dhënat nga tabela MySQL si një skedar CSV, duke e bërë të lehtë për përdoruesit hapjen dhe punën me të në aplikacionet e tabelave si Excel. Mos harroni të zëvendësoni kredencialet e bazës së të dhënave me tuajat.