PHP เบื้องต้น > การทำงานไฟล์ และไดเรคทอรี
การอ่านไฟล์
สคริปต์นี้ทำตามลำดับปกติ คือ เปิดไฟล์, อ่านไฟล์ และ ปิดไฟล์ โดยอ่านชื่อ order.txt ที่เก็บในไดเรคทอรี order ภายนอกโครงสร้างเอกสาร
<?php
@ $fp = fopen("$DOCUMENT_ROOT/../../orders/orders.txt", "r");
if (!$fp)
{
echo "<p><strong>ไม่มีใบสั่งซื้อค้าง"
."พยายามอีกครั้งภายหลัง</strong></p></body></html>";
exit;
}
while (!feof($fp))
{
$order= fgets($fp, 100);
echo $order."<br/>";
}
fclose($fp);
?>
ต่อไปดูรายละเอียดฟังก์ชันในสคริปต์
เปิดไฟล์สำหรับการอ่าน
การเปิดไฟล์ใช้ fopen ในกรณีนี้ เปิดไฟล์สำหรับการอ่านอย่างเดียว ดังนั้นใช้โหมดไฟล์ a
$fp = fopen ("$DOCUMENT_ROOT/../../orders/orders.txt", "a");
รับรู้การสิ้นสุด
ตัวอย่างนี้ ใช้ while loop อ่านไฟล์จนกระทั่งสิ้นสุดไฟล์ การทดสอบไฟล์สิ้นสุดใน ใช้ฟังก์ชัน feof()
while (!feof ($fp))
ฟังก์ชัน feof ใช้พอยเตอร์ไฟล์เพียงพารามิเตอร์เดียว โดยจะส่งออก TRUE ถ้าพอยเตอร์ไฟล์อยู่ที่ จุดสิ้นสุดไฟล์ feof ย่อมาจาก File End of File
อ่าน 1 บรรทัดต่อครั้ง
ในตัวอย่างนี้ ใช้ฟังก์ชัน fgets() ในการอ่านจากไฟล์
$order = fgets($fp, 100);
ฟังก์ชันนี้ใช้อ่าน 1 บรรทัดต่อครั้งจากไฟล์ ในกรณีนี้จะอ่านจนกระทั่งพบตัวอักษรบรรทัดใหม่ (\n) พบกับ EOF หรืออ่าน 99 ไบต์จากไฟล์ ความยาวการอ่านมากที่สุดคือ ความยาวกำหนดลบด้วย 1 ไบต์
fgetss เป็นอนุพันธ์ที่น่าสนใจของ fgets และมีไวยากรณ์ดังนี้
string fgetss (int fp, int length, string [allawable_tags]);
ฟังก์ชันที่คล้ายกับ fgets() ยกเว้น การตัด tag ของ PHP และ HTML ที่พบในข้อความ ถ้าต้องการเก็บ tag เฉพาะ สามารถระบุใน allawable_tags
fgetcsv () เป็นอีกอนุพันธ์ของ fgets และมีไวยากรณ์ดังนี้
array fgetcsv (int fp, int length, string [delimiter];
ฟังก์ชันนี้ใช้กับการแบ่งบรรทัดของไฟล์ด้วยตัวแบ่ง เช่น ตัวอักษร tab หรือจุลภาค
พารามิเตอร์ length ควรยาวกว่าความยาวตัวอักษรของบรรทัดยาวที่สุดในไฟล์ที่กำลังอ่าน
อ่านทั้งไฟล์
แทนที่จะอ่านไฟล์ที่ละบรรทัด สามารถอ่านไฟล์ทั้งหมดใน 1 ครั้ง มีวิธีการอ่าน 3 วิธี
วิธีที่ 1 ใช้ readfile () สามารถแทนที่สคริปต์ข้างบนด้วยคำสั่ง 1 บรรทัด
readfile ("$DOCUMENT_ROOT/../../orders/orders.txt");
การเรียนฟังก์ชัน readfile() เปิดไฟล์ จะส่งข้อมูลตามผลลัพธ์มาตรฐาน browser จากนั้นปิดไฟล์ ไวยากรณ์ของ readfile() คือ
int readfile (string filename, int [use_include_path]);
พารามิเตอร์ที่ 2 เปิดตัวเลือกระบุให้ PHP มองหาไฟล์ใน include_path และทำงานเหมือนกับ fopen () ฟังก์ชันที่ส่งออกจำนวนไบต์ที่อ่านจากไฟล์
วิธีที่ 2 ใช้ fpassthru วิธีนี้ต้องเปิดไฟล์ด้วยการใช้ fopen() ก่อน จากนั้นส่งผ่านพอยเตอร์ไฟล์เป็นอากิวเมนต์ไปยัง fpassthru() ซึ่งจะเทกองข้อมูลจากตำแหน่งพอยเตอร์ตามผลลัพธ์มาตรฐาน ไฟล์ได้รับการปิดเมื่อเสร็จสิ้น
สคริปต์ข้างต้นสามารถแทนที่ด้วย fpassthru ได้ดังนี้
$fp = fopen ("$DOCUMENT_ROOT/../../orders/orders.txt", "a");
fpassthru ($fp);
ฟังก์ชัน fpassthru () ส่งออก TRUE ถ้าอ่านสำเร็จ และ FALSE ถ้าไม่สำเร็จ
วิธีที่ 3 เป็นการอ่านทั้งไฟล์ด้วยฟังก์ชัน file() ฟังก์ชันนี้เหมือนกับ readfile() ยกเว้น ส่งออกเป็น array แทนที่ส่งข้อมูลตามผลลัพธ์มาตรฐาน การเรียกเป็นการอ้างอิง
$filearray = file ($fp);
คำสั่งที่อ่านทั้งไฟล์เข้าสู่ array ชื่อ $filrarray แต่ละบรรทัดของไฟล์เก็บในแต่ละหน่วยข้อมูลของ array
การอ่านตัวอักษร
อีกวิธีในการประมวลผลคือ การอ่านที่ละตัวอักษรจากไฟล์ โดยการใช้ฟังก์ชัน fgetc() ฟังก์ชันที่ใช้พอยเตอร์ไฟล์เพียงพารามิเตอร์เดียว และส่งออกตัวอักษรต่อไปในไฟล์ while loop ในตัวอย่างสามารถใช้ fgetc() ได้ดังนี้
while (!feof($fp))
{
$char= fgetc($fp, 100);
if (!feof($fp))
echo ($char=="\n" ? "<br/>: $char);
}
คำสั่งที่อ่าน 1 ตัวอักษรจากไฟล์ต่อครั้งด้วย fgetc() และเก็บใน $char จนกระทั่งสิ้นสุดไฟล์ จากนั้นทำการประมวลผลเล็กน้อยเพื่อแทนที่ตัวอักษร สิ้นสุดแถวด้วยตัวแบ่งแถว HTML ที่เป็นการจัดรูปแบบ เนื่องจาก browser ไม่จัดบรรทัดใหม่ใน HTML เป็นบรรทัดใหม่ ถ้าปราศจากคำสั่งนี้ ไฟล์ทั้งหมดจะพิมพ์ออกมาเป็น 1 บรรทัด
การอ่านด้วยความยาวตามต้องการ
วิธีสุดท้ายในการอ่านจากไฟล์คือการใช้ฟังก์ชัน fread เพื่ออ่านด้วยจำนวนไบต์ตามความต้องการ ฟังก์ชันนี้มีไวยากรณ์ดังนี้
string fread (int fp, int length);
วิธีที่ทำการอ่านตาม length ไบต์ หรือ สิ้นสุดไฟล์ แล้วแต่ว่ากรณีใดมาถึงก่อน
|