แพลตฟอร์ม CRM และข้อมูล

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 ได้อย่างง่ายดาย อย่าลืมแทนที่ข้อมูลรับรองฐานข้อมูลด้วยข้อมูลของคุณเอง

Douglas Karr

Douglas Karr เป็นผู้ก่อตั้ง Martech Zone และผู้เชี่ยวชาญด้านการเปลี่ยนแปลงทางดิจิทัลที่ได้รับการยอมรับ Douglas ได้ช่วยเริ่มต้นบริษัทสตาร์ทอัพ MarTech ที่ประสบความสำเร็จหลายแห่ง ช่วยในการตรวจสอบสถานะธุรกิจมูลค่ากว่า 5 พันล้านดอลลาร์ในการเข้าซื้อกิจการและการลงทุนของ Martech และยังคงเปิดตัวแพลตฟอร์มและบริการของตัวเองอย่างต่อเนื่อง เขาเป็นผู้ร่วมก่อตั้งของ Highbridgeบริษัทที่ปรึกษาด้านการเปลี่ยนแปลงทางดิจิทัล Douglas ยังเป็นผู้เขียนหนังสือ Dummie's Guide และหนังสือความเป็นผู้นำทางธุรกิจอีกด้วย

บทความที่เกี่ยวข้อง

13 คอมเมนต์

    1. ฉันคิดว่าคุณทำได้!

      ในกรณีนี้ ฉันกำลังสร้างลิงก์ 'สำรอง' ในเว็บแอปพลิเคชัน ดังนั้นฟังก์ชัน PHP จึงเป็นสิ่งที่ฉันต้องการ อย่างไรก็ตาม ฉันไม่เคยรู้มาก่อนว่าคุณสามารถเขียนไปยังไฟล์ได้โดยตรงจากคำสั่ง MySQL เจ๋งมาก!

      ขอบคุณ!

      1. แน่นอนว่าวิธีของคุณจะเป็นวิธีที่ดีที่สุดหากเซิร์ฟเวอร์ MySQL อยู่บนเครื่องระยะไกลเนื่องจากอาจไม่สามารถเขียนลงในเครื่องที่ PHP กำลังทำงานอยู่🙂

        ดีใจที่ได้ชี้ทิศทางอื่น ๆ และสิ่งใหม่ ๆ แม้ว่า though

    1. เอ่อ… 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 ชื่อไฟล์จะต้องตรงกับชื่อตาราง (เป็นสิ่งที่ต้องระวัง)

  1. ฉันเพิ่งเสียชีวิตไปกว่า 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 ชั่วโมง…

  2. นี้ทำงานได้ดี อย่างไรก็ตาม ฉันเพิ่งได้ทุกอย่างในบรรทัดเดียวโดยคั่นด้วยช่องว่าง ฉันกำลังพยายามแก้ไขเพื่อพิมพ์ทุกอย่างในบรรทัดแยกดังนี้:

    คอลัมน์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

    และอื่นๆ สคริปต์นี้สามารถแก้ไขได้หรือไม่
    ขอบคุณ!

    1. แน่นอนสามารถ

      ลองทำสิ่งนี้:

      เลือก * จาก 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' แทน

      มรณาธา!

  3. นี่เป็นโพสต์ที่ยอดเยี่ยมมากฉันลองแล้วและใช้งานได้ดีสิ่งเดียวคือไฟล์ txt ของฉันมีแถวพิเศษเหนือชื่อส่วนหัวและผลลัพธ์บางส่วนถูกแยกออกเป็น 2 แถวซึ่งอาจเกิดจากข้อมูลที่ฉันมี ในฐานข้อมูลของฉันไม่มีความคิด แต่นี่เป็นตัวช่วยที่ดีในการสร้างฟีด ...

  4. Douglas Karr รหัสของคุณหินจริงๆ! จะมีประโยชน์มากโดยเฉพาะหากคุณต้องการเอาต์พุตที่อยู่ในรูปแบบ textfile ขอบคุณมาก! จากทีมฟิลิปปินส์!

  5. สวัสดี! มีใครจากที่นี่บ้างที่สามารถให้คำแนะนำเกี่ยวกับการนำเข้าไฟล์ข้อความไปยังฐานข้อมูลของฉัน (phpmyAdmin) โดยใช้ php เป็นส่วนหน้า ฉันมีความคิดเกี่ยวกับการดาวน์โหลดไฟล์และเปิดมันปัญหาของฉันคือฉันจะรับผลลัพธ์ของแถวได้อย่างไรและจะแทรกลงในตารางของฉันได้อย่างไรขอบคุณ

คุณคิดอย่างไร?

ไซต์นี้ใช้ Akismet เพื่อลดสแปม เรียนรู้วิธีการประมวลผลข้อมูลความคิดเห็นของคุณ.

ปิดหน้านี้

ตรวจพบการบล็อกโฆษณา

Martech Zone สามารถจัดหาเนื้อหานี้ให้คุณโดยไม่มีค่าใช้จ่าย เนื่องจากเราสร้างรายได้จากไซต์ของเราผ่านรายได้จากโฆษณา ลิงก์พันธมิตร และการสนับสนุน เรายินดีอย่างยิ่งหากคุณจะลบตัวปิดกั้นโฆษณาของคุณเมื่อคุณดูไซต์ของเรา