DIY一個PHP留言板之讀取解析

經過前幾次的「教學」
其實我也發現,直接提供程式碼和註解對新手實在不利。
因此本篇文章會解析讀取的技巧。

首先,是 glob() 函式的使用。

$paths = glob("./data/*.txt"); //讀取留言路徑

glob是一個依照「路徑」讀取檔案的函式,這點大家一定都很清楚。
不過卻可以使用 * 字元,把所有路徑都讀取。
如 data 目錄下有 a.txt , b.txt, c.dat 3個檔案,在上述的情況下,會將 a.txt 與 b.txt 的路徑存入陣列。

而留言需要排序,因此使用 sort() 函式。

sort($paths, SORT_NUMERIC); //將路徑以數值排序

通過 sort 排序陣列,如果鎮列原本是混亂的,那麼會被排列整齊,並且依照規則。
如:依照字母、數字大小等等
SORT_NUMERIC 則是「將值以數字排序」
當然,也可以利用「自訂排列規則」的方式進行排列。

接著我們需要能夠讀取檔案。

$contents = file_get_contents('./data/comments.txt'); //讀取 ./data/comments.txt 的內容

file_get_contents() 是 PHP4 新增的函式,我想市面上應該沒有 PHP3 的主機。
如果不確定版本,可以使用 phpinfo() 來檢查。

這個函式原理很簡單,把路徑的檔案內容一次不漏的讀取,並且放進變數。

不過我們的留言是特殊的規則:

;subject
留言標題
;nickname
暱稱
;contents
留言
換行

因此需要使用迴圈搭配,來找出各數值的內容。
*其實也可以用preg_match之類的方式把數值抓出,使用迴圈慢慢讀取是為了「可擴充欄位」

$contents = file_get_contents('./data/comments.txt'); //讀取
$contents = explode(PHP_EOL, $contents); //用換行字元分割 *Linux以 \n 換行, Windows 以 \r\n 換行
foreach($contents as $line){ //foreach 是把陣列值一一讀取
  if(!$line) continue;
  if($line[0] == ';'){
    $dKey = substr(1, $line);
    continue;
  }
  if(!$dKey) continue;
  if($dkey == 'contents')
    $data[$dkey][] = $line;
  else
    $data[$dkey] .= $line;
}

exoplde() 函式會依照指定的字元、字串,將字串切割。
如:a|b|c 以 | 為切割字元,則傳回 Array( [0] => a [1] => b [2] => c )

接著在迴圈中,做非常多的判斷。
Ex. if(!$line) continue;
! 為相反字元,當變數有值時也相當於 boolen 的 true, 因此 false 反轉就是 true
而執行 continue; 結束本次迴圈。
這類用法也有 break; 結束迴圈,可以在某條件下停止。

substr() 則是擷取字串,如 abcdef 使用 substr(2, ‘abcdef’) 則傳回 cdef
這點原理何在呢?

程式中,字串其實是由 char[] 陣列組成,因此 $line[0] 即是 $line 字串的第一個字元。
而 substr 就是把字串從指定的陣列key開始讀取到最後一個。

經過這些步驟之後,終於完成了「讀取」的效果。
傳回的 $data 可以讀到檔案中各種資料。

不過仍有一個小 bug 會發生,在正式的實作時,這個會直接修正掉。
( 在這之前,檢查看看讀取的判斷式,哪裡出現矛盾,資料中含有什麼會發生問題。 )

2 thoughts on “DIY一個PHP留言板之讀取解析