PHP و MySQL: یک Query را به یک Tab Delimited یا فایل CSV صادر کنید
این آخر هفته، من می خواستم بسازم پی اچ پی صفحه ای که از هر کدام نسخه پشتیبان تهیه می کند خروجی پرس و جو یا جدول در یک فایل Tab Delimited. بیشتر نمونههای موجود در شبکه، ستونها را به صورت کدگذاری سخت دارند.
در مورد من، من میخواستم ستونها پویا باشند، بنابراین باید ابتدا از میان نامهای فیلدهای جدول حلقه بزنم تا ردیف سرصفحه را با نام ستونها بسازم و سپس تمام رکوردها را برای ردیفهای داده باقیمانده حلقه بزنم. من همچنین هدر را طوری تنظیم کردم که مرورگر دانلود فایل را در نوع فایل (txt) با نام تاریخ فایل و مهر زمانی آغاز کند.
Tab Delimited Export از 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";
}
- ما از a استفاده می کنیم
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 صادر می کند و باز کردن و کار با آنها را برای کاربران در برنامه های صفحه گسترده مانند اکسل آسان می کند. فراموش نکنید که اعتبار پایگاه داده را با اعتبار خود جایگزین کنید.