[PHP]檔案處裡

在過去的練習裡面,程式只在線上進行運算並且即時顯示
但是在更多時候我們需要將資料儲存在檔案內部,例如門禁刷卡
要知道哪張卡在幾點幾分刷進或是刷出,就會使用到一隻log檔來紀錄資料


以下是一些常用的檔案處理函數


  1. fopen: 開啟檔案的函數

  2. fseek: 移動檔案讀寫指標的函數

  3. fwrite: 將資料寫入檔案的函數

  4. fread: 將資料從檔案讀出的函數

  5. fclose: 關閉檔案的函數


另外還有兩個更常用的函數

  1.  file_get_contents: 直接讀取檔案

  2. file_put_contents: 直接寫入檔案



檔案開啟模式


首先我們要先講開啟模式,就是開啟檔案時賦予的權限,還有檔案若不存在的處理方式
a  :附加檔案方式開啟,屬性為「寫入
檔案尾部加入;如果檔案不存在,則建立。

a+:附加檔案方式開啟,屬性為「可讀可寫
檔案尾部加入;如果檔案不存在,則建立。

r :「唯讀」,檔案必須存在

r+:「可讀可寫」,檔案必須存在

w :「唯寫」,並將檔案清除後重新寫入
如果檔案不存在,則建立檔案。

w+
:「可讀可寫」,將檔案清除後重新寫入
若檔案不存在則 建立檔案

※HINT:

  • r 家族:檔案必須存在

  • w 家族:會把檔案內容全部砍掉重練

  • a家族:把檔案繼續往下寫

  • 「+」號家族:都是可讀可寫。



開啟檔案


fopen($fileName,OpenMode)

如果操作成功的話,會回傳一個「handle」值,失敗則傳回「 false 」

移動檔案讀寫指標


fseek($fileopen,$byte_num)

  • $fileopen:欲處理檔案的handle值 (就是剛剛 fopen 回傳的東西)

  • $byte_num:從頭起算的位元數,0就是開頭啦



回傳的資料型態為整數; 成功回傳0; 否則,回傳-1
此外,若碰到檔尾(EOF)時,不會當作失敗

資料寫入檔案


fwrite($fileopen,$data[,$len])

  • $fileopen:欲處理檔案的handle
    (看到沒,又扯到fopen了,要不要設成變數?要!)

  • $data:欲寫入檔案中的資料

  • $len:欲寫入的字元個數,此參數可省略



回傳的資料型態為整數; 成功回傳寫入的字元個數; 失敗則回傳FALSE

從檔案讀出資料


fread($fileopen,$length)

  • $fileopen:欲處理檔案的handle值 (又是我 handle值)

  • $length:欲從檔案中讀出的字元個數,全部讀取可以用filesize($filename)



回傳的資料型態為字串,回傳值就是讀出的資料

關閉檔案


fclose($fileopen)

  • $fileopen:欲關閉檔案的handle值 (....不多做說明了)



回傳的資料型態為布林值; 成功回傳TRUE;失敗回傳FALSE

這邊要特別記住的是函數的使用順序!

  1. fopen():開啟檔案

  2. fseek():移動檔案指標

  3. fread():讀取資料 / fwrite():寫入資料

  4. fclose():關閉檔案


有開啟檔案,就必須要關閉。否則後續在使用上會出問題

確定是否有開檔成功


「$fileopen = fopen($file, " w+ ")」本 身有回傳值
可以作為除錯之用,如果成功開啟檔案則回傳true,反之則回傳false

這邊做一個練習是
將一個學生的成績寫入檔案: grade.txt
分別寫入學生的姓名、國文成績、英文成績及數學成績
每個欄 位以逗號「,」分隔

檔案一樣放在github頁面上,檔名為file_practice.php

※補充:


file_get_contents( string filename): 直接讀取檔案
file_put_contents ( string filename, string data): 直接寫入檔案

file_get_contents()  直接讀取檔案
成功則回傳內容字串,失敗則返回 FALSE。

file_put_contents()用於直接寫入檔案
成功則回傳寫入到文件內數據的字節數,失敗則回傳FALSE

以上兩個函式,尤其是file_put_contents()在業界很常使用
他的功能就是fopen() + fwrite() + fclose(),三位一體的概念
所以業界比較常使用這個方法。

留言