วันอังคารที่ 19 กรกฎาคม พ.ศ. 2559

วุ่นวายกับการเปิดปิดไฟล์เพื่ออ่านและเขียนโดยภาษา PHP

ปวดหัวไปหลายวันทีเดียวสำหรับการเปิดปิดไฟล์เพื่ออ่านและเขียนโดยใช้โปรแกรมภาษา PHP  สำหรับโปรแกรมนี้ที่ผู้เขียนพัฒนาสำหรับอุปกรณ์ Thai GPSTRACKER รุ่นหนึ่งที่หากมีการรูดบัตรผ่านเครื่องอ่านใบอนุญาตขับรถ จะต้องนำข้อมูลรหัสบัตรไปเก็บที่ไฟล์ แต่ถ้านำบัตรใบนั้นไปรูดซ้ำให้ถือว่าเป็นการล็อกเอาท์ ส่วนหากรูดบัตรใหม่ถือว่าเป็นการเปลี่ยนบัตรให้ลบข้อมูลเดิมออกและนำข้อมูลบัตรใบใหม่จัดเก็บไว้แทน
โดยผู้เขียนสรุปการทำงานดังต่อไปนี้

1. หากไฟล์ยังไม่ถูกสร้างขึ้นมาให้ทำการเขียนใหม่ได้เลย
2. หากไฟล์มีข้อมูลอยู่แล้ว ให้อ่านข้อมูลเก่าขึ้นมาก่อน จากนั้นทำการเปรียบเทียบกับข้อมูลใหม่
2.1 หากข้อมูลใหม่กับข้อมูลเก่าเหมือนกันให้ทำการลบไฟล์เก่าออก
2.2 หากข้อมูลใหม่ต่างกันกับข้อมูลเก่าให้เขียนไฟล์ด้วยข้อมูลใหม่

ฟังดูจากโจทย์แล้วไม่น่ายากแต่พอได้ทำงานจริงพบว่า รันไทม์เออเรอ(runtime error) ตลอดเวลาหากเราไม่ทำการตรวจสอบข้อมูลดูก่อนว่ามีไฟล์ที่ต้องการเปิดอยู่จริง หรือไฟล์ที่มีอยู่กับไม่มีข้อมูลอยู่ในนั้นเลย ทำให้ฟังก์ชั่นการอ่านไฟล์ขึ้นมาเกิดข้อผิดพลาดได้

การดำเนินการข้อที่ 1 ตรวจสอบไฟล์เก่าดูก่อน หากยังไม่มีให้สร้างหรือเขียนไฟล์ใหม่
if ( file_exists("$imei")===false ) {
           $fh = fopen("$imei",'w+') or die('Cannot open file:');
           fwrite($fh,$newdriverid);
            fclose($fh);
}

การดำเนินการข้อที่ 2 หากไฟล์เก่ามีอยู่แล้ว ให้อ่านข้อมูลของไฟล์เก่า
 $fh = fopen("$imei",'r+') or die('Cannot open file:');
 $p_driverid = stream_get_contents($fh);
 fclose($fh);

การดำเนินการข้อที่ 2.1 ให้ทำการเปรียบเทียบข้อมูลเก่ากับข้อมูลใหม่ หากเหมือนกันให้ลบไฟล์เก่าออก
 if (strcmp($newdriverid,$p_driverid)==0) {
                 unlink("$imei");
 }
 

การดำเนินการข้อที่ 2.2  ส่วนหากข้อมูลต่างกันให้เขียนทับด้วยข้อมูลใหม่
$fh = fopen("$imei",'w+') or die('Cannot open file:');
fwrite($fh,$newdriverid);
fclose($fh);


                                      
สำหรับการนำไปพัฒนาต่อยอดก็สามารถดำเนินการได้เองโดยไม่ยาก โดยสาระสำคัญของบทความนี้ก็คือวิธีการเปิดไฟล์เพื่อเขียนทับ วิธีการเปิดไฟล์เพื่ออ่าน และวิธีการลบไฟล์ ทำยังไงให้ไม่เกิดข้อผิดพลาดและหยุดการทำงานของโปรแกรมนั่นเอง