第二章 數據的存儲與檢索
1.關于時區的設置
- PHP5開始都需要自己設置時區了,具體設置方法如下:
1.可以通過修改php.ini文件中的date.timezone = PRC;
來顯示(這種方法修改之后要保存并重啟Apache)
2.通過在PHP代碼頁面開頭輸入date_default_timezone_set('PRC');
來解決。(此種方法麻煩在于每寫一個新的頁面就得重新寫一個放開頭。)
2. fopen()函數-
打開文件或者URL;需要傳遞2、3或4個參數。通常代碼如下:
$fp=fopen("$DOCUMENT_ROOT/../orders/oreders.txt",'ab');
- 后面ab可能取值為
-
fopen()函數第3個參數是可選的,如果要在include_path中搜索某個文件,就可以使用,具體用法是將這個參數設置為1(true)。
$fp=fopen("$DOCUMENT_ROOT/../orders/oreders.txt",'ab',true);
-
第4個參數是允許fopen()函數的文件名稱可以以協議名稱開始(如http://或ftp:// 等),并且可以遠程打開該文件。
- 如果不想使用該參數,可以通過php.ini文件中的allow_url_fopen指令來禁用。
-
- URL中的域名是不區分大小寫,但是路徑和文件名可能會區分大小寫。
- 出現
Warning: fopen(D:/myblog/../orders/orders.txt): failed to open stream: No such file or directory in D:\myblog\PHP&MYSQL\first clas.php on line 65
情況的解決方法。-
原代碼如下:
$fp=fopen("$DOCUMENT_ROOT/../orders/orders.txt",'ab');
-
運行之后會報出如下警告:
-
Warning: fopen(D:/myblog/../orders/orders.txt): failed to open stream: No such file or directory in D:\myblog\PHP&MYSQL\first clas.php on line 65
-大致意思是該fopen語句沒有找到正確的文件或路徑。
-
-
解決辦法:
- 由于我是在windows下使用PHP所以需要再
"$DOCUMENT_ROOT/../orders/orders.txt"
這部分中所有的符號都加上轉義字符,這樣windows才會認為路徑正確。 - 尤其需要注意的是"$"符號前也要加入轉義字符,不然依舊會報錯。
- 由于我是在windows下使用PHP所以需要再
-
- 修改后的代碼如下,正反斜線均可以,但前面一定要加入轉義字符:
- 1.
$fp=fopen("\$DOCUMENT_ROOT\\..\\orders\\orders.txt",'ab');
- 2.
$fp=fopen("\$DOCUMENT_ROOT\/..\/orders\/orders.txt",'ab');
- 1.
3.fwrite()函數
- 在PHP中寫文件。
int fwrite(respice handle,string string[,int length])
- length這個參數是寫入的最大字符數,可選。
- fputs()也是寫文件,其可以看做是fwrite()的別名函數。
4.feof()函數
- 測試文件指針(1)是否到了文件結束的位置
5.fgets()、fgetss()、fgetcsv()
-
fgets()函數
- 可以從文件中每次讀取一行內容,直到遇到換行字符位置"windo: \r\n;Linux: \n"
- 如果指定了長度,則實際讀取的長度是指定長度減1B
-
fgetss()函數
- 和fgets()函數一樣,也是從文件每次讀取每行內容,但區別在于它可以過濾字符串中包含的PHP和HTML標記。
- 如果想要在此之上過濾其他特殊標記,需要把其包含在allowable_tags字符串中
- 出于安全性的考慮,在讀取別人所編寫的文件或者用戶所輸入的文件時,推薦使用fgetss()函數,這是因為:
- 允許無限制的HTML代碼出現在文件中可能會破壞之前所設計的格式;
- 而允許無限制的PHP代碼出現在文件中則可能造成安全方面的問題。
-
fgetcsv()函數
array fgetcsv (resource fp, int length [, string delimiter[, string enclosure]])
- 如果在文件中使用了定界符(2),如制表符或者
,
可以用fgetcsv()函數將文件分成多行。 - 可以像使用fgets()函數一樣使用它,不同的是必須向這個函數傳遞一個用于 分隔表單域的定界符。
- length的長度應該比要讀的文件最長數據行的字符數大。
- enclosure用來制定每行中封閉每一個域的字符。如果沒有制定任何字符,則默認是
"
。
6.readfile()、fpassthru()、file()
-
readfile()
int readfile(string filename, [int use_include_path [, resource context]]);
- 使用readfile()函數將會打開所指定的文件,并且將文件內容輸出到瀏覽器中,然后再關閉這個文件。
- use_include_path參數可選,其制定了PHP是否應該再include_path中查找文件。
- context參數只有在文件被遠程(http://或ftp://)打開時才使用。具體是指該函數返回值從文件中讀出的字節總數。
-
fpassthru()
- 使用該函數必須先使用fopen()打開文件。然后文件指針作為參數傳遞給fpassthru()。這樣就可以把文件指針所指向的文件內容發給瀏覽器。最后 再關閉該文件。
-
flie()
- 出了和readfile()一樣可以將讀取的文件內容顯示到瀏覽器上之外
- 該函數特殊之處在于,它其實是把結果發送到一個數組中,文件中的每一行都將作為一個元素保存在該數組中。
7.fgetc()
- fgets()函數是一行一行讀取內容,fgetc()函數則是每次讀取一個字符。
- 該函數的一個缺點在于它會返回文件結束符EOF.
8.fread()
string fread(resource fp, int length);
- 從文件中讀取任意長度的字節
- 使用該函數,要么它讀滿length參數所制定的字節,要么就是讀到了文件的末尾,要么是網絡數據包的結束。
9.file_exists()
- 該函數可以在不打開文件的前提下,檢查一個文件是否存在
10.filesize()
- 該函數以字節為單位返回一個文件的大小。
11.unlink()
- 刪除相應的文件。
- 如果無法刪除該文件,則函數返回false;同時,如果對該文件的訪問權限不夠或者該文件不存在,該函數也會返回false。
12.rewind()、fseek()、ftell()
-
rewind()
- 該函數可以將文件指針復位到文件的開始。
-
ftell()
- 該函數可以以字節為單位報告文件指針當前在文件中的位置。
-
fseek()
int feek(resource fp, int offset [, int whence])
- 該函數可以將文件指針fp從whence位置移動offset個字節。
- 其默認值SEEK_SET表示文件的開始處。
- 該參數的其他可能值為SEEK_CUR(文件指針的當前位置)和SEEK_END(文件的結束)
- rewind()函數其實等價于調用一個具有零偏移量的fseek()函數
13.flock()
bool flock(resource fp, int operation [,int & wouldblock])
- 該函數是將文件進行鎖定的方法。
- operation的值如下之一:
- LOCK_SH:取得共享鎖定(讀操作鎖定。意味著文件可以共享,其他人可以讀該文件)
- LOCK_EX:取得獨占鎖定(寫操作鎖定。這是互斥的。該文件不能被共享)
- LOCK_UN:釋放鎖定(無論共享或獨占)
- LOCK_NB:防止在請求加鎖時發生阻塞(windows上暫不支持)
- 至于wouldblock值:
- 如果鎖定會堵塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設置為 TRUE。(Windows 上暫不支持)
相關詞語
1.文件指針:
- 在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。
- 而在PHP中,所謂文件指針個人的理解是類似于我們平時操作文檔時鼠標指針的位置,如圖所示:
- 豎線就是指針
2.定界符:
- 定界符的出現是為了能夠在PHP中輸入大量文字而不使用轉移符。
- 簡單來說就是允許程序猿自己定義出了單雙引號之外的字符串邊界。
- 一般來說在PHP中,我們都是使用
""
或者''
來定義字符串。 - 但是PHP還可以允許程序猿自己定義字符串邊界標記
- 使用定界符是以
<<<
開頭,來宣告進入定界符模式。 <?php echo<<<EEE 為了能夠在PHP中輸入大量文字而不是用轉義符,人們發明出了定界符。 定界符可能一開始"有點難以理解,學會之后是很有用處的"。 簡單來說,'定界符就是允許你自己定義除了單雙引號之外的字符串的邊界'。 實際使用定界符的時候,要注意字符串的分隔符需要自己單獨一行,也就是說,在它前后都不能加空格或tab。 EEE; ?>
- 實際輸出效果
- 一般來說在PHP中,我們都是使用
-
特別需要注意!
- 雖然使用定界符之后可以隨意使用
""
和''
而不用加轉義符,但如果是使用$
依舊需要加轉義符"\$"
- 注意字符串的分隔符需要自己單獨一行
- 定界符的前后都不能有其他符號或者空格,也就是說開始的EEE這個后面不能有空格或者任意符號,結束的EEE也只能加上個
;
來表示定界符結束。
- 雖然使用定界符之后可以隨意使用