自學php 第三天 讀寫檔案

2022-08-05 02:24:16 字數 3540 閱讀 9964

這次的例子是把訂單的資料儲存起來,一般是用資料庫來進行資料的儲存最好,但是今天目的是為了學習讀寫檔案,所以這次把資料存在檔案裡。

讀寫檔案有一般有三個步驟:

1)開啟檔案。如果檔案不存在,需要先建立它。

2)讀取/寫入資料。

3)關閉檔案。

1.使用fopen()開啟檔案。

$fp = fopen("$document_root/../orders/orders.txt", "ab");

fopen()返回乙個檔案指標給$fp,讀寫檔案時需要使用這個變數。

呼叫fopen()通常使用2個引數。第乙個引數指定檔名,第二個引數指定開啟檔案的方式。

php有個內建變數$_server['document_root']指向web伺服器的根目錄,同表單資料一樣,這個變數也有3種訪問方法,這裡將$_server['document_root']賦給$document_root以方便訪問。「..「表示文件的父目錄,出於安全原因,將要讀寫的檔案放在web根目錄的外面(這個安全原因我也不太清楚,可能以後書裡會提到了)。

a-追加模式,從檔案末尾開始追加,如檔案不存在,先建立這個檔案。b-二進位制模式,windows系統下會區分二進位制檔案和文字檔案,為了獲得最大的可移植性,推薦使用這項。更多其他模式可以檢視文件。

開啟檔案時,可能會遇到的錯誤是試圖開啟乙個沒有許可權進行讀寫操作的檔案(通常會在unix系統中遇到)。這時可以建立乙個全域性可寫的目錄來儲存檔案:

mkdir ~/orders

chmod 777 ~/orders

如果fopen()呼叫失敗,會返回false,並且通過@抑制錯誤資訊,反饋給使用者友好的錯誤提示。@只是簡單的錯誤處理方法,以後會學到更好的錯誤處理的方法。

@ $fp = fopen("$document_root/../orders/orders.txt", "ab");

if(!$fp

)

2.寫檔案。

寫檔案可以使用fwrite()或fputs(),fputs()是fwrite()的別名。

fwrite($fp, $outputstring); //將$outputstring的字串寫入到$fp指向的檔案中。

fwrite()還有第三個引數,是可選的,表示寫入的最大字元數。在使用二進位制模式的寫操作時,使用第三個引數可以避免一些跨平台的相容性問題。

fwrite($fp, $outputstring, strlen($outputstring));

3.關閉檔案。

fclose($fp); //成功返回true,反之false

現在可以把表單資料儲存到檔案中了,最新的processorder.php:

<?php 

//php每一行要用;結尾

$tireqty = $_post['tireqty'];

$oilqty = $_post['oilqty'];

$sparkqty = $_post['sparkqty'];

$address = $_post['address'];

$totalqty = 0;

$totalamount = 0.00;

$date = date("h:i, js f y");

define('tireprice', 100);

define('oilprice', 10);

define('sparkprice', 4);

$document_root = $_server['document_root'];

?>

<?php

if(empty($tireqty) && empty($oilqty) && empty($sparkqty

))

if(is_numeric($tireqty) && is_numeric($oilqty) && is_numeric($sparkqty

))else

//儲存訂單資料

@ $fp = fopen("$document_root/../orders/orders.txt", "ab");

if(!$fp

)

//將每乙個訂單拼成一行資料

$outputstring = $date."\t".$tireqty."個輪胎\t".$oilqty."桶汽油\t".$sparkqty."個火花塞\t\$".$totalamount."\t".$address."\n";

fwrite($fp, $outputstring, strlen($outputstring

));

fclose($fp

);

echo "訂單已儲存

"; ?>

view code

4.讀檔案。

以唯讀模式開啟檔案:$fp = fopen("$document_root/../orders/orders.txt", "rb");

feof()作為檔案結束的測試條件,fgets()從檔案中每次讀取一行。

員工檢視訂單的頁面vieworders.php:

<?php 

$document_root = $_server['document_root'];

?>

<?php

@ $fp = fopen("$document_root/../orders/orders.txt", "rb");

if(!$fp

)

while (!feof($fp

)) ?>

view code

上面指令碼的**幾乎可以用readfile("$document_root/../orders/orders.txt")這一句來替代。

讀取整個檔案的函式:readfile()將開啟檔案,將檔案內容輸出到標準輸出(瀏覽器)中,然後再關閉檔案。但是由於「\n"在瀏覽器中不能顯示為換行,所以還是用上面的**顯示比較清晰。

5.檔案鎖定。

在讀寫檔案時,鎖定該檔案,以避免併發帶來的問題。

flock(resource fp, int operation [, int & wouldblock])

operation有幾個值:

lock_sh 讀操作鎖定,檔案可以共享,其他人可以讀該檔案   

lock_ex  寫操作鎖定

lock_un  釋放已有的鎖定

lock_nb   防止在請求加鎖時發生阻塞

所以對剛才的指令碼改進一下,processorder.php:

flock($fp,lock_ex);

fwrite($fp, $outputstring, strlen($outputstring

));flock($fp,lock_un);

fclose($fp);

vieworders.php:  

flock($fp,lock_sh);

while (!feof($fp

))

flock($fp,lock_un);

fclose($fp);

WebGL自學筆記第三天

建立緩衝區物件 gl.createbuffer 繫結緩衝區物件 gl.bindbuffer 將資料寫入緩衝區物件 gl.bufferdata 將緩衝區物件分配給乙個attribute變數 gl.vertexattribpointer 開啟attribute變數 gl.enablevertexattr...

自學python人臉識別 第三天

小白我今天學到了乙個跟人臉相關的東西了,而且搞了半天終於搞定了。我們先看看效果。這是原圖 這是執行過後的效果圖 對於小白我來說,感覺很酷,畢竟在自學的路上又更進了一步。接下來我們來看看是如何實現的,import cv2 像這裡的haarcascade frontalface default.xml和...

第三天課程檔案

目錄檔案管理 cd dev 進入裝置檔案介面 etc 配置檔案 dev 裝置檔案 cat install.log cat install.log dev lpr0 直連的終端體系外做編號 ls dev pts 命令執行時 出現 0 1 ptmx 和who差不多 ll dev pts 命令結束時顯示完...