Thaimisc.com : เล่นกับไฟล์ (1)
ThaiMisc.Com : Free Webboard | Free GuestBook | Free Poll | Free Ecard Server | Free Java Chat Room | Advertising | Contact Us | Colocation | Web Hosting | เปิดร้านค้าฟรี


Category : Php Developer Print Article Only Print Aticle With Comment
เล่นกับไฟล์ (1)
เขียนโดย เดอะกาฝากไดอารี่ (ball@bbznet.com) , 07-08-2004
โดยส่วนตัวแล้วผมเป็นคนที่ไม่ค่อยได้เขียนโค้ด PHP เพื่อจัดการกับไฟล์เท่าไหร่ครับ แต่การใช้ฟังก์ชันที่เกี่ยวกับไฟล์ ก็ควรจะเรียนรู้เอาไว้บ้างเช่นกัน ผมเองก็จะเล่าเท่าที่รู้ให้ท่านผู้อ่านได้ทราบกันนะครับ จากนั้นหากต้องการเชี่ยวชาญให้มากกว่าที่ผมสอน ก็คงต้องรบกวน ศึกษาหาความรู้เพิ่มเติมเอาเองละครับ

และก็ขอย้ำอีกครั้งว่า ความรู้เกี่ยวกับ PHP ที่ดีที่สุด และหาได้ง่าย (และฟรี) ก็คือ PHP Manual ที่สามารถดาวน์โหลดได้จาก http://www.php.net/ นั่นเองแหละครับ

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

  • file_exists()
  • filesize()
  • fopen()
  • fclose()
  • readfile()
  • fwrite() หรือ fput() ก็ได้

หลายคนอาจจะมองว่ามีฟังก์ชันที่เป็นประโยชน์มากกว่านี้ แหะ แหะ ก็อยากรบกวนให้ช่วยชี้แนะผมบ้างแล้วกันนะครับ

file_exists()
ไม่เชิงว่าเป็นฟังก์ชันสำหรับการจัดการไฟล์ซะทีเดียว แต่ค่อนข้างมีประโยชน์นะครับ กล่าวคือมีไว้เพื่อใช้ตรวจสอบว่า ไฟล์ที่เรากำลังจะอ้างอิงถึงนั้น มีตัวตนอยู่หรือไม่... รูปแบบการใช้งานนั้นง่ายมากครับ กล่าวคือ

file_exists(ชื่อไฟล์)

เท่านั้นเอง... โดยค่าที่ return จากฟังก์ชันนี้ จะเป็นข้อมูลแบบ boolean หรือมีแค่ true หรือ false เท่านั้น (true คือ มีไฟล์อยู่จริง ส่วน false คือไม่มีไฟล์ดังกล่าวอยู่)

ติ๊ต่างง่ายๆ สมมติว่า ลองสร้างไฟล์ test.txt ขึ้นมาใน C:AppServwwwtest ของคุณดูสิครับ (ย้ำอีกครั้ง ว่าผมติ๊ต่างว่าท่านผู้อ่านนั้นหัดเขียน PHP ตามบทเรียนของผม โดยติดตั้งชุดโปรแกรม AppServ ในการจำลองเว็บเซิร์ฟเวอร์ + PHP + MySQL นะครับ)

แล้วทีนี้ก็ลองเขียนโค้ด PHP ตามตัวอย่างต่อไปนี้ เซฟลงใน C:AppServwwwtest โดยตั้งชื่อไฟล์เป็นอะไรก็ได้ แล้วลองรันเพื่อดูผลครับ

<?php

if (file_exists("test.txt")) { //ดูว่ามีไฟล์ชื่อ test.txt ไหม
echo "มีไฟล์ชื่อ test.txt อยู่<br>";
}
else { echo "ไม่มีไฟล์ชื่อ test.txt<br>"; }
if (file_exists("test.php")) { //ทีนี้ลองตรวจดูไฟล์ที่ไม่มีอยู่จริงบ้าง
echo "มีไฟล์ชื่อ test.php อยู่<br>";
}
else { echo "ไม่มีไฟล์ชื่อ test.php<br>"; }

?>

ผลลัพธ์ที่ได้ก็จะเป็น

มีไฟล์ชื่อ test.txt อยู่
ไม่มีไฟล์ชื่อ test.php

ทั้งนี้เพราะว่าไฟล์ test.txt นั้นมีอยู่ (ก็เราเพิ่งสร้างมะกี้) แต่ไฟล์ test.php นั้นไม่มี (เพราะเราไม่ได้สร้างเอาไว้นิ)

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

คือผมทำไฟล์ไฟล์นึง สมมติชื่อ module.php ซึ่งจะเป็นเหมือนไฟล์กลาง ที่ทำหน้าที่เรียกไฟล์อื่นๆ มาแสดงผล โดยจะเรียกไฟล์ไหนมาแสดงนั้น เราจะกำหนดจากตัวแปรชื่อ module เช่น module.php?module=view หมายความว่า ให้เรียกไฟล์ชื่อ view มาแสดงผล เป็นต้น... ผมอาจจะเขียนโค้ดแบบนี้ เป็น module.php ครับ

<?php

require($_GET['module']. ".php"); //เรียกใช้งานไฟล์ตามที่ระบุในตัวแปร module

?>

ในกรณีนี้ หากมีไฟล์ view.php อยู่จริง มันก็จะถูกเรียกมาแสดงผล แต่หากมันไม่มี มันจะเกิดเป็น error แบบนี้ครับ

Warning: main(.php): failed to open stream: No such file or directory in c:appservwwwtestindex2.php on line 3

Fatal error: main(): Failed opening required '.php' (include_path='.;c:php4pear') in c:appservwwwtestindex2.php on line 3

ซึ่งไม่เป็นการดีแน่ เพราะว่าเท่ากับเปิดให้คนอื่นเห็นว่าโครงสร้างของเว็บเราเป็นยังไง ผลร้ายอาจจะทำให้แฮกเกอร์มาเล่นงานเราได้ (ว่าเข้าไปนั่น!!)... อย่างน้อยที่สุด มันก็ดูไม่ดีละครับ ในฐานะโปรแกรมเมอร์ เพราะข้อความ error ไม่ควรเกิดขึ้นหากไม่ใช่สุดวิสัยจริงๆ

ทีนี้ลองมาประยุกต์ใช้ฟังก์ชัน file_exists() กันดูนะครับ เราแค่เขียนครอบไปประมาณนี้แทน

<?php

if (file_exists($_GET['module']. ".php")) {
require($_GET['module']. ".php"); //เรียกใช้งานไฟล์ตามที่ระบุในตัวแปร module
}
else { echo "ไม่พบโมดูลที่คุณเรียกใช้ครับ"; } //หากไม่พบโมดูลที่เรียก ให้แสดงผลด้วย

?>

เท่านี้ เวลาที่ไปเรียกโมดูลแปลกๆ (เช่น เรามีแค่ view, edit, add, delete แต่ดันมีคนมาเรียก save เฉยเลย เป็นต้น) แทนที่จะแสดง error ตั้ง 4 บรรทัด ให้คนอ่าน (หรือคนใช้งาน) งงเป็นไก่ตาแตกแล้ว ก็จะปรากฏข้อความว่า ไม่พบโมดูลที่คุณเรียกใช้ครับ แทน... ดูดีขึ้นไหมครับ?!?

ฟังก์ชัน file_exists() นี้ ไม่ได้ใช้ได้แต่กับตรวจสอบการมีอยู่ของไฟล์เท่านั้นนะครับ แต่ใช้ได้กับโฟลเดอร์ด้วย เช่น

<?php

if (file_exists("module/test/")) { echo "มีโฟลเดอร์นี้อยู่"; }
else { echo "ไม่มีโฟลเดอร์นี้อยู่"; }

?>

เป็นต้น... ซึ่งผลลัพธ์ที่ได้มาก็คือ ไม่มีโฟลเดอร์นี้อยู่ นั่นเอง... แต่หากเราลองไปสร้างโฟลเดอร์ C:AppServwwwtestmoduletest ขึ้นมา ผลลัพธ์ที่ได้ก็จะเป็น มีโฟลเดอร์นี้อยู่ แทนครับ

(ติดตามตอนต่อไป)

<- Back | Next ->

ThaiMisc.Com : Free Webboard | Free GuestBook | Free Poll | Free Ecard Server | Free Java Chat Room | Advertising | Contact Us
Copyright 1999-2006 Thailand Miscellaneous. Allrights reserved. webmaster@thaimisc.com