การทำงานกับ Files ใน PHP
ในบทเรียนนี้ เราจะมาเรียนรู้วิธีการจัดการไฟล์ใน PHP ซึ่งเป็นทักษะที่สำคัญสำหรับการสร้างเว็บแอปพลิเคชันที่สามารถอ่าน, เขียน, และจัดการข้อมูลที่เก็บไว้ในไฟล์ได้ เราจะครอบคลุมฟังก์ชันพื้นฐานสำหรับการจัดการไฟล์, การจัดการสิทธิ์การเข้าถึงไฟล์, และวิธีการอัปโหลดไฟล์
ฟังก์ชันพื้นฐานสำหรับการจัดการไฟล์
PHP มีชุดฟังก์ชันที่ช่วยให้เราสามารถทำงานกับไฟล์ได้อย่างง่ายดาย มาดูฟังก์ชันหลักๆ ที่เราจะใช้กัน:
fopen(): เปิดไฟล์fread(): อ่านข้อมูลจากไฟล์fwrite(): เขียนข้อมูลลงในไฟล์fclose(): ปิดไฟล์
fopen() - การเปิดไฟล์
ฟังก์ชัน fopen() ใช้สำหรับเปิดไฟล์ โดยรับพารามิเตอร์ 2 ตัว:
- ชื่อไฟล์ (Path)
- โหมดการเปิดไฟล์ (Mode)
รูปแบบการใช้งาน:
$file = fopen("myfile.txt", "r");
โหมดการเปิดไฟล์ (Mode) ที่พบบ่อย:
"r": อ่านอย่างเดียว (Read-only). ตัวชี้เริ่มต้นที่จุดเริ่มต้นของไฟล์"w": เขียนอย่างเดียว (Write-only). เปิดและล้างข้อมูลในไฟล์ ถ้าไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่"a": เขียนต่อท้าย (Append). เปิดและเขียนข้อมูลต่อท้ายไฟล์ ถ้าไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่"x": สร้างและเขียน (Exclusive create). สร้างไฟล์ใหม่สำหรับเขียนเท่านั้น หากไฟล์มีอยู่แล้ว จะคืนค่า FALSE และสร้างข้อผิดพลาด"r+": อ่านและเขียน (Read/Write). ตัวชี้เริ่มต้นที่จุดเริ่มต้นของไฟล์"w+": อ่านและเขียน (Read/Write). เปิดและล้างข้อมูลในไฟล์ ถ้าไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่"a+": อ่านและเขียนต่อท้าย (Read/Write Append). เปิดและเขียนข้อมูลต่อท้ายไฟล์ ถ้าไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่"x+": สร้างและอ่าน/เขียน (Exclusive create and read/write). สร้างไฟล์ใหม่สำหรับอ่านและเขียนเท่านั้น หากไฟล์มีอยู่แล้ว จะคืนค่า FALSE และสร้างข้อผิดพลาด
ตัวอย่าง: การเปิดไฟล์เพื่ออ่าน
$file = fopen("data.txt", "r");
if ($file) {
echo "เปิดไฟล์สำเร็จ!";
} else {
echo "ไม่สามารถเปิดไฟล์ได้!";
}
fread() - การอ่านข้อมูลจากไฟล์
ฟังก์ชัน fread() ใช้สำหรับอ่านข้อมูลจากไฟล์ โดยรับพารามิเตอร์ 2 ตัว:
- ตัวแปร File handle (ที่ได้จาก
fopen()) - จำนวนไบต์ที่ต้องการอ่าน
รูปแบบการใช้งาน:
$file = fopen("myfile.txt", "r");
$data = fread($file, filesize("myfile.txt")); // อ่านทั้งหมด
fclose($file);
echo $data;
ข้อควรระวัง: ฟังก์ชัน filesize() ใช้สำหรับหาขนาดของไฟล์เป็นไบต์
fwrite() - การเขียนข้อมูลลงในไฟล์
ฟังก์ชัน fwrite() ใช้สำหรับเขียนข้อมูลลงในไฟล์ โดยรับพารามิเตอร์ 2 ตัว:
- ตัวแปร File handle (ที่ได้จาก
fopen()) - ข้อมูลที่ต้องการเขียน
รูปแบบการใช้งาน:
$file = fopen("myfile.txt", "w"); // เปิดไฟล์ในโหมดเขียน (จะลบข้อมูลเก่า)
$txt = "Hello World!\n";
fwrite($file, $txt);
fclose($file);
echo "เขียนไฟล์สำเร็จ!";
fclose() - การปิดไฟล์
ฟังก์ชัน fclose() ใช้สำหรับปิดไฟล์ที่เปิดไว้ โดยรับพารามิเตอร์ 1 ตัว:
- ตัวแปร File handle (ที่ได้จาก
fopen())
รูปแบบการใช้งาน:
$file = fopen("myfile.txt", "r");
// ... ทำงานกับไฟล์ ...
fclose($file);
สำคัญ: ควรปิดไฟล์ทุกครั้งหลังจากใช้งานเสร็จ เพื่อปล่อยทรัพยากรและป้องกันปัญหาอื่นๆ
File Permissions
File permissions (สิทธิ์การเข้าถึงไฟล์) เป็นสิ่งสำคัญที่ต้องพิจารณาเมื่อทำงานกับไฟล์บนระบบปฏิบัติการต่างๆ โดยเฉพาะ Linux/Unix-based systems Permissions กำหนดว่าใครสามารถอ่าน, เขียน, หรือ execute ไฟล์ได้บ้าง
Permissions มักจะแสดงในรูปแบบของตัวอักษร 10 ตัว เช่น -rwxr-xr-- ซึ่งมีความหมายดังนี้:
- ตัวแรก: ประเภทของไฟล์ (
-= ไฟล์ปกติ,d= ไดเรกทอรี) - 3 ตัวถัดไป: Permissions สำหรับเจ้าของไฟล์ (User)
- 3 ตัวถัดไป: Permissions สำหรับกลุ่ม (Group)
- 3 ตัวสุดท้าย: Permissions สำหรับคนอื่นๆ (Others)
แต่ละชุด 3 ตัว ประกอบด้วย:
r: Read (อ่าน)w: Write (เขียน)x: Execute (รัน)-: ไม่มีสิทธิ์
ตัวอย่าง: -rwxr-xr-- หมายถึง:
- เป็นไฟล์ปกติ
- เจ้าของไฟล์: อ่าน, เขียน, และรันได้
- กลุ่ม: อ่านและรันได้
- คนอื่นๆ: อ่านได้อย่างเดียว
การเปลี่ยน File Permissions ใน PHP:
เราสามารถใช้ฟังก์ชัน chmod() เพื่อเปลี่ยน permissions ของไฟล์ได้
รูปแบบการใช้งาน:
chmod("myfile.txt", 0755); // เปลี่ยนเป็น rwxr-xr-x
Note: ค่า 0755 เป็นเลขฐานแปด (Octal) ที่แทน permissions ในรูปแบบตัวเลข
ข้อควรระวัง: การเปลี่ยน permissions อาจต้องใช้สิทธิ์ที่สูงกว่า (เช่น sudo) และควรทำด้วยความระมัดระวัง เพราะอาจส่งผลต่อความปลอดภัยของระบบ
File Uploading
การอัปโหลดไฟล์เป็นฟังก์ชันที่สำคัญสำหรับเว็บแอปพลิเคชันหลายประเภท มาดูวิธีการอัปโหลดไฟล์ด้วย PHP:
ขั้นตอน:
- สร้างฟอร์ม HTML สำหรับการอัปโหลดไฟล์
- เขียน PHP script เพื่อรับและจัดการไฟล์ที่อัปโหลด
1. ฟอร์ม HTML
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="fileToUpload">Select file to upload:</label>
<input type="file" name="fileToUpload" id="fileToUpload"><br><br>
<input type="submit" value="Upload File" name="submit">
</form>
สำคัญ:
enctype="multipart/form-data": ต้องระบุเมื่อมีไฟล์อัปโหลด<input type="file" name="fileToUpload" id="fileToUpload">: สร้างช่องสำหรับเลือกไฟล์
2. PHP Script (upload.php)
<?php
$target_dir = "uploads/"; // ไดเรกทอรีที่จะเก็บไฟล์
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); // ชื่อไฟล์ปลายทาง
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// ตรวจสอบว่าเป็นไฟล์ภาพจริงหรือไม่
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
}
// ตรวจสอบว่าไฟล์มีอยู่แล้วหรือไม่
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// ตรวจสอบขนาดไฟล์
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// อนุญาตเฉพาะบางประเภทไฟล์
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// ตรวจสอบว่า $uploadOk ถูกตั้งค่าเป็น 0 โดยข้อผิดพลาดใดๆ หรือไม่
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
// ถ้าทุกอย่างโอเค พยายามอัปโหลดไฟล์
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
?>
คำอธิบาย:
$_FILES: ตัวแปร Superglobal ที่เก็บข้อมูลเกี่ยวกับไฟล์ที่อัปโหลด$_FILES["fileToUpload"]["name"]: ชื่อไฟล์เดิม$_FILES["fileToUpload"]["tmp_name"]: ตำแหน่งชั่วคราวของไฟล์บนเซิร์ฟเวอร์move_uploaded_file(): ฟังก์ชันสำหรับย้ายไฟล์จากตำแหน่งชั่วคราวไปยังตำแหน่งปลายทาง
ข้อควรระวัง:
- ตรวจสอบประเภทไฟล์, ขนาดไฟล์, และชื่อไฟล์ เพื่อป้องกันการอัปโหลดไฟล์ที่เป็นอันตราย
- ใช้ฟังก์ชัน
htmlspecialchars()เพื่อป้องกัน XSS attacks เมื่อแสดงชื่อไฟล์
สรุป
ในบทเรียนนี้ เราได้เรียนรู้พื้นฐานของการจัดการไฟล์ใน PHP ตั้งแต่การเปิด, อ่าน, เขียน, และปิดไฟล์, การจัดการ File Permissions, และการอัปโหลดไฟล์ ทักษะเหล่านี้เป็นสิ่งจำเป็นสำหรับการสร้างเว็บแอปพลิเคชันที่สามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพและปลอดภัย ในบทเรียนถัดไป เราจะมาเรียนรู้เกี่ยวกับการใช้ Regular Expressions ใน PHP