GORAGOD.com

การบันทึกและอ่านข้อมูลด้วย Text File

การบันทึกข้อความลงบน Text File และอ่านข้อมูลที่บันทึก เพื่อนำมาใช้งานต่อ นับเป็นเรื่องพื้นฐานอย่างหนึ่งที่ควรศึกษาเป็นอย่างยิ่ง ซึ่งฟังก์ชั่นที่ใช้งานเกี่ยวกับเรื่องนี้ มีหลายฟังก์ชั่นด้วยกัน ลองมาดูวิธีการใช้งานฟังก์ชั่นเหล่านี้ดู

เริ่มต้นที่กฏการใช้งาน Text File กันก่อน

นามสกุลของไฟล์ Text File ก็คือ ไฟล์ชนิดหนึ่งบน Server ไฟล์ชนิดนี้อาจนามสกุลอะไรก็ได้ ตามแต่เราจะตั้ง แต่โดยทั่วไป เราก็มักจะตั้งนามสกุลของไฟล์ ตามประเภทของมัน เช่น .txt สำหรับข้อความทั่วไป .dat สำหรับไฟล์ ข้อมูล .log สำหรับไฟล์ log หรือ อื่นๆ ตามแต่จะตั้ง

สิ่งที่ควรทำความเข้าใจเกี่ยวกับนามสกุลของไฟล์คือ ไฟล์เหล่านี้สามารถถูกดาวน์โหลดได้โดยบราวเซอร์เพียงแค่รู้ URL ดังนั้นเราไม่ควรใช้ไฟล์เหล่านี้เก็บข้อมูลสำคัญ

แนวทางการป้องกันการดาวน์โหลดไฟล์ สามารถทำได้ครับ โดยการใช้ไฟล์นามสกุล .php โดยที่ตอนต้นของไฟล์ ให้ใส่คำสั่ง <?php exit()?> ก่อนข้อมูลใดๆ ซึ่งเมื่อมีการเรียกไฟล์นี้ผ่าน URL คำสั่งของ PHP ก็จะทำให้ออกจากหน้านี้ไป และไม่สามารถเข้าถึงข้อมูลที่อยู่ต่อจากนั้นได้ และในการอ่านข้อมูลจริง เราก็ต้องข้ามข้อความนี้ไป ครับ

Premission ของไฟล์ ถ้าไฟล์ถูกสร้างบน Server เราไม่จำเป็นต้องกังวลเรื่องนี้มากนัก เนื่องจากไฟล์จะมีเจ้าของเป็น Server การอ่านและเขียนซี่งกระทำบน Server จะไม่มีปัญหาแต่อย่างใด แต่หากเป็นไฟล์ที่อัปโหลดขึ้นไป อาจต้องทำการปรับ chmod เพื่อให้ไฟล์นั้นๆสามารถเขียนหรืออ่านได้

รูปแบบของข้อมูลในไฟล์ ว่ากันตามความเป็นจริงแล้ว ไม่ได้มีกฏอะไรที่ตายตัวสำหรับข้อมูลภายในไฟล์ ยกเว้นมีความต้องการในการใช้ฟังก์ชั่นในการอ่านไฟล์ที่เฉพาะเจาะจง เช่น การใช้ข้อมูลชนิด serialize หรือ การใช้ข้อมูลชนิด csv หรือการใช้ข้อมูลในรูป xml ซึ่งหากต้องการใช้ข้อมูลชนิดเหล่านี้ คุณก็ต้องเขียนไฟล์ให้มันมีรูปแบบตามที่ตัวอ่านข้อมูลจะอ่านออกมาได้

ในทางปฏบัติ คุณอาจเลือกใช้ข้อมูลในรูปแบบที่คุณกำหนดเองก็ได้ โดยการเขียนฟังก์ชั่นให้อ่านและเขียนข้อมูลตามที่ต้องการ ซึ่งมีหลากหลายวิธีตามแต่จะจินตนาการ

ว่าด้วยเรื่องของฟังก์ชั่นในการเขียนไฟล์

ปกติแล้ว การเขียนไฟล์มีฟังก์ชั่นที่ใช้งานกันจริงๆอยู่ไม่กี่ฟังก์ชั่นกันหรอกครับ ลองมาดูตัวอย่างที่นิยมใช้กันดู

ข้อมูลที่ต้องการ
a1|b1|c1
a2|c2|b2
a3|c3|b3

ตัวอย่างข้อมูลด้านบน แบ่งออกเป็นข้อมูล 3 คอลัมน์ คั่นแต่ละคอลัมน์ด้วย | และ มีข้อมูลทั้งหมด 3 แถว คั่นแต่ละแถวด้วย \n (ตัวอักษรขึ้นบรรทัดใหม่) การสร้างไฟล์เพื่อให้ได้ข้อมูลดังด้านบนทำได้ไม่ยากครับ
<?php
  // ข้อมูลเริ่มต้น (ตัวอย่างจำลอง)
  $ds[] = array('a1', 'b1', 'c1');
  $ds[] = array('a2', 'b2', 'c2');
  $ds[] = array('a3', 'b3', 'c3');
  // ดูรูปแบบข้อมูล
  //print_r($ds);
  // รวมข้อมูลแต่ละแถว
  foreach($ds AS $row){
    $datas[] = implode('|', $row); // a1|b1|c1
  }
  // บันทึกเป็นไฟล์
  $f = fopen('test.dat', 'w');
  fwrite($f, implode("\n", $datas));
  fclose($sf);
?>

ลองรัน และเปิดไฟล์ test.dat ที่ได้ดูรูปแบบข้อมูลนะครับ (แนะนำให้เปิดด้วย Editpluse เนื่องจาก Editplus รองรับการเปิดไฟล์ที่ใช้ \n เป็นตัวขึ้นบรรทัดใหม่ได้)

การอ่านข้อมูลจากไฟล์ มีได้หลายวิธีครับเช่น
file() อ่านข้อมูลออกมาเป็นแอเรย์ ตามบรรทัด (เข้ากับข้อมูลด้านบนได้ดี)
file_get_content() อ่านข้อมูลออกมาทั้งไฟล์ ที่เหลือ จัดการด้วยตัวเอง
fgetcsv() อ่านข้อมูลในรูปแบบไฟล์ csv ให้ผลลัพท์เป็นแอเรย์ ถ้าใส่พารามิเตอร์ให้กับฟังก์ชั่นให้ถูกต้อง หรือ ใช้ไฟล์ที่มีรูปแบบตรงตามที่กำหนด การใช้ฟังก์ชั่นนี้อันเดียวก็เพียงพอ
fget() อ่านไฟล์ ตรงกันข้ามกับ fwrite() ที่ผมใช้ในตัวอย่างละครับ

และอื่นๆอีกมากมายครับ

นอกจากการอ่านข้อมูลจากไฟล์แล้ว เราอาจต้องทำการแยกข้อมูลจากไฟล์ออกให้เป็นข้อมูลที่สามารถนำไปใช้งานได้ เช่น อ่านข้อมูลใส่ แอเรย์ ซึ่งฟังก์ชั่นที่ใช้งานได้ก็มีหลายอันครับเช่น
ฟังก์ชั่นเกี่ยวกับ string ทั้งหลายแหล่ เช่น substr() strpos() หรือ อื่นๆ ซึ่งอาจต้องใช้ร่วมกัน และหากไฟล์ข้อมูลเป็น UTF-8 อาจต้องใช้ฟังก์ชั่นที่มี mb_ นำหน้าแทน เช่น mb_substr() หรือ mb_strpos()
ฟังก์ชั่น ในกลุ่ม preg หรือ ereg และหากต้องการใช้กับไฟล์ข้อมูล UTF-8 อาจต้องมีแฟลก u ให้กับ pattern ด้วย
ฟังก์ชั่นในกลุ่ม xml_parse() สำหรับแยกข้อมูล xml

ลองดูตัวอย่างง่ายๆในการ อ่่าน และ แยกข้อมูลด้านบน
<?php
  // อ่านข้อมูลในไฟล์
  $data = file_get_contents('test.date');
  // แยกข้อมูลออกเป็นแถว
  $datas = explode("\n", $data);
  // แยกข้อมูลออกเป็นคอลัมน์
  foreach($datas AS $row) {
    $ds[] = explode('|', trim($row)); // ใช้ trim() เพื่อป้องกันช่องว่างด้านหน้า และ ด้านหลังข้อมูล เช่น \r
  }
  // แสดงผลข้อมูลที่อ่านได้
  print_r($ds);
?>

การอ่านและเขียนข้อมูลด้วย Text File มีข้อควรระวังที่สำคัญก็คือ ตัวอักขระที่ถูกใช้เป็นตัวคั่น เช่น | \r \n จะไม่สามารถใช้งานในข้อมูลได้ (ตามข้อมูลด้านบน) ซึ่งหากมีตัวคั่นในข้อมูลก็จะทำให้การแยกข้อมูลผิดพลาดทันที ในทางปฏิบัติ เราเอาเลือกใช้ตัวคั่นที่พิจารณาแล้วว่ามันจะไม่อยู่ในข้อมูล หรืออาจเลือกใช้การแทนที่ข้อมูลที่มีตัวอักษรที่เป็นตัวคั่นด้วยตัวอักขระอื่นก็ได้