
PHP และ MySQL: ส่งออกแบบสอบถามไปยัง Tab Delimited หรือไฟล์ CSV
สุดสัปดาห์นี้ ฉันอยากจะสร้าง PHP เพจที่จะสำรองข้อมูลใดๆ MySQL แบบสอบถามหรือตารางลงในไฟล์ Tab Delimited ตัวอย่างส่วนใหญ่ในเน็ตมีคอลัมน์แบบฮาร์ดโค้ด
ในกรณีของฉัน ฉันต้องการให้คอลัมน์เป็นแบบไดนามิก ดังนั้นก่อนอื่นฉันต้องวนซ้ำชื่อเขตข้อมูลตารางทั้งหมดเพื่อสร้างแถวส่วนหัวด้วยชื่อคอลัมน์ จากนั้นจึงวนซ้ำระเบียนทั้งหมดสำหรับแถวข้อมูลที่เหลือ ฉันยังตั้งค่าส่วนหัวเพื่อให้เบราว์เซอร์เริ่มการดาวน์โหลดไฟล์ในประเภทไฟล์ (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 ได้รับการตั้งค่าให้ระบุว่าเนื้อหาควรถือเป็น octet-stream (ข้อมูลไบนารี) และทริกเกอร์การดาวน์โหลดไฟล์ด้วยชื่อไฟล์ที่ระบุ
- เมื่อใช้ส่วนขยาย เราสร้างการเชื่อมต่อฐานข้อมูล 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 ได้รับการอัปเดตเพื่อระบุ
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 กำลังทำงานอยู่🙂
ดีใจที่ได้ชี้ทิศทางอื่น ๆ และสิ่งใหม่ ๆ แม้ว่า though
โพสต์ที่ดี คุณรู้วิธีการนำเข้า / กู้คืนไฟล์ที่คั่นด้วยแท็บ (เช่นที่คุณเพิ่งสร้างขึ้น) กลับเข้าไปในฐานข้อมูล mysql หรือไม่?
เอ่อ… 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 ภายในสัปดาห์ Noah! Bloid เป็นสัตว์ประหลาด MySQL! ขอบคุณสำหรับทุกท่าน!!!
ฉันเพิ่งเสียชีวิตไปกว่า 6 ชั่วโมงในการพยายามหาสาเหตุว่าทำไม Internet Explorer 6/7 จึงใช้ filetype 'html' และไม่ยอมรับชื่อไฟล์ที่กำหนดเองของฉันที่ระบุไว้ในส่วนหัว .. และยังไม่อนุญาตให้บันทึกไฟล์ด้วย .. เมื่อ พยายามให้ผู้ใช้ดาวน์โหลดไฟล์ข้อความที่สร้างในลักษณะเดียวกับด้านบน
ฉันใช้ HTTPS และ IE ไม่แคชไฟล์เหล่านี้
ฉันพบวิธีแก้ปัญหาในความคิดเห็นของ Brandon K ที่ 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" เป็น "public" หรือ "private" ใน PHP.INI ซึ่งจะเปลี่ยนส่วนหัว Content-Cache และลบส่วนหัว Pragma ทั้งหมด หากคุณไม่สามารถหรือไม่ต้องการแก้ไข PHP.INI สำหรับการแก้ไขทั่วทั้งไซต์ คุณสามารถส่งสองส่วนหัวต่อไปนี้เพื่อเขียนทับค่าเริ่มต้น:
คุณจะต้องตั้งค่าส่วนหัวของเนื้อหาตามที่ระบุไว้ข้างต้นเพื่อให้ใช้งานได้ โปรดทราบว่าปัญหานี้มีผลกับ Internet Explorer เท่านั้น ในขณะที่ Firefox ไม่ได้แสดงพฤติกรรมที่มีข้อบกพร่องนี้
-
ก็ .. อย่างน้อยเขาก็หายไปแค่ 6 ชั่วโมง…
นี้ทำงานได้ดี อย่างไรก็ตาม ฉันเพิ่งได้ทุกอย่างในบรรทัดเดียวโดยคั่นด้วยช่องว่าง ฉันกำลังพยายามแก้ไขเพื่อพิมพ์ทุกอย่างในบรรทัดแยกดังนี้:
คอลัมน์1_name
ฟิลด์1_value
คอลัมน์2_name
ฟิลด์1_value
คอลัมน์3_name
ฟิลด์1_value
คอลัมน์1_name
ฟิลด์2_value
คอลัมน์2_name
ฟิลด์2_value
คอลัมน์3_name
ฟิลด์2_value
ตัวอย่างเช่น:
ชื่อนามสกุล
ไมค์
แผนที่
งาน
จำนวน
1
ชื่อนามสกุล
ฟ้อง
แผนที่
Home
จำนวน
2
ชื่อนามสกุล
จอห์น
แผนที่
ท่องเที่ยว
จำนวน
10
และอื่นๆ สคริปต์นี้สามารถแก้ไขได้หรือไม่
ขอบคุณ!
แน่นอนสามารถ
ลองทำสิ่งนี้:
เลือก * จาก MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' FIELDS TERMINATED by '\ n' LINES TERMINATED BY '\ n';
หากคุณต้องการเว้นวรรคสองครั้ง (สองบรรทัดว่าง) ระหว่างกลุ่มบันทึกให้พูดว่า“ LINES TERMINATED BY '\ n \ n';” แทน.
ส่วน "FIELDS TERMINATED BY '\n'" คือส่วนที่ขึ้นบรรทัดใหม่หลังจากแต่ละระเบียน แทนที่จะเป็นแท็บ แท็บจะเป็น '\t' แทน
มรณาธา!
นี่เป็นโพสต์ที่ยอดเยี่ยมมากฉันลองแล้วและใช้งานได้ดีสิ่งเดียวคือไฟล์ txt ของฉันมีแถวพิเศษเหนือชื่อส่วนหัวและผลลัพธ์บางส่วนถูกแยกออกเป็น 2 แถวซึ่งอาจเกิดจากข้อมูลที่ฉันมี ในฐานข้อมูลของฉันไม่มีความคิด แต่นี่เป็นตัวช่วยที่ดีในการสร้างฟีด ...
Douglas Karr รหัสของคุณหินจริงๆ! จะมีประโยชน์มากโดยเฉพาะหากคุณต้องการเอาต์พุตที่อยู่ในรูปแบบ textfile ขอบคุณมาก! จากทีมฟิลิปปินส์!
สวัสดี! มีใครจากที่นี่บ้างที่สามารถให้คำแนะนำเกี่ยวกับการนำเข้าไฟล์ข้อความไปยังฐานข้อมูลของฉัน (phpmyAdmin) โดยใช้ php เป็นส่วนหน้า ฉันมีความคิดเกี่ยวกับการดาวน์โหลดไฟล์และเปิดมันปัญหาของฉันคือฉันจะรับผลลัพธ์ของแถวได้อย่างไรและจะแทรกลงในตารางของฉันได้อย่างไรขอบคุณ
ใครช่วยบอกวิธีลบแถวส่วนหัว http เหนือชื่อส่วนหัวได้ไหม