Learning PHP -資料的儲存與檢索
儲存資料有兩種基本方法:儲存到普通檔案,或者儲存到資料庫中。
資料寫入:
- 1、開啟檔案。如果檔案不存在,需要先建立它。
- 2、將資料寫入這個檔案。
- 3、關閉這個檔案。
資料讀出:
- 1、開啟檔案。如果這個檔案不能開,就應該意識到這一點並且正確地推出。
- 2、從檔案中讀出資料。
- 3、關閉這個檔案。
選擇檔案模式:
當開啟一個檔案的時候,有以下三種選擇。
- 1、開啟檔案為了唯讀、唯寫或者讀和寫。
- 2、如果要寫一個檔案,你可能希望覆蓋已有的檔案內容,或者僅僅將新的資料追加到未見末尾。如果該檔案已經存在,也可以終止程式的執行而不是覆蓋該檔案。
- 3、如果希望在一個區分了二級制方式和純文字方式的系統上寫一個檔案,還必須指定採用的方式。
函數fopen()支援以上三種方式的組合。
根據伺服器設定不同,可以通過如下三種方式得到主目錄:
- $_SERVER['DOCUMENT_ROOT']
- $DOCUMENT_ROOT
- $HTTP_SERVER_VARS['DOCUMENT_ROOT']
對於表單資料,第一個風格是首選的。
開啟檔案
fopen(path,mode)
寫檔案:
fwrite($fp, &outputstring)
關閉檔案:
fclose($fp)
fopen()函數的檔案模式
- r 唯讀 讀模式――開啟檔案,從檔案頭開始讀
- r+ 唯讀 讀寫入模式――開啟檔案,從檔案頭開始讀寫
- w 唯寫 寫入模式――開啟檔案,從檔案頭開始讀。如果該檔案已經存在,將刪除所有檔案已有內容。如果該文 件不存在,函數將建立這個檔案。
- x 謹慎寫 寫入模式開啟檔案,從檔案頭開始寫。入如果檔案已經存在,該檔案將不會被開啟,fopen()函數將返回false,而且PHP將產生一個警告。
- x+ 謹慎寫 讀/寫入模式開啟檔案,從檔案頭開始寫。入如果檔案已經存在,該檔案將不會被開啟,fopen()函數將返回false,而且PHP將產生一個警告。
- a 追加 追加模式――開啟檔案,如果該檔案已有內容,將從檔案末尾開始追加(寫),如果該檔案不存在,函數將建立這個檔案
- a+ 追加 追加模式――開啟檔案,如果該檔案已有內容,將從檔案末尾開始追加(寫),如果該檔案不存在,函數將建立這個檔案
- b 二進位 二進位模式――用於與其他模式進行串連。如果檔案系統能夠區分二進位檔案和文字檔,你可能會使用它。可以獲得最大程度的可移植性。二進位模式是預設的模式。
- t 文本 用於與其他模式的結合。這個模式只是windows系統下一個選項。
以唯讀模式開啟檔案:
fopen()
知道何時讀完檔案:
feof()
每次讀取一行資料:
fgets()、
fgetss()和
fgetcsv()
讀取整個檔案:
readfile()、
fpassthru()和
file()
- 第一種方式是readfile()。readfile($path);調用readfile()函數將開啟這個檔案,並且將檔案內容輸出到標準輸出中,然後再關閉這個檔案。
- 第二種方式是fpassthru()。要使用這個函數,必須先使用fopen()開啟檔案。然後將檔案指標作為參數傳遞給fpassthru(),這樣就可以把檔案指標所指向的檔案內容發送到標準輸出。然後再將這個檔案關閉。如果讀操作成功,函數返回true,否則返回false。
- 第三種讀取整個檔案的函數是file().它和readfile一樣。不過它是把結果發送到一個數組中。
$filearray = file($path);
- 第四種選擇是使用file_get_contents()函數。這個函數與readfile()相同,但是該函數將以字串的形式返迴文件內容,而不是將檔案內容回顯到瀏覽器中。
讀取一個字元:
fgetc()
while(!feof($fp)){ $char = fgetc($fp); if(!feof($fp)){ echo ($char == "\n "? "
": $char); }}
讀取任意長度:f
read()
讀取一個檔案的最後一種方法是使用fread()函數從檔案中讀取任意長度的位元組。
查看檔案是否存在:
file_exists()
確定檔案大小:
filesize()
刪除一個檔案:
unlink()(PHP中沒有名為delete的函數)
在檔案中定位:
rewind()、
fseek()和
ftell()
rewind()函數可以將指標複位到檔案的開始。
ftell()函數可以以位元組為單位報告檔案指標當前在檔案中的位置。
調用
fseek()函數可以將檔案指標fp從whence位置移動offset個位元組。
rewind()函數等價於調用一個具有零位移量的fseek()函數。
檔案的鎖定:
為了避免多個方法同時操作一個檔案,可以使用檔案鎖定的方法。
檔案鎖定是通過flock()函數來實現的。
如果打算使用flock()函數,必須將其添加到所有使用檔案的指令碼中;否則,就沒有任何意義。
flock()的操作值
- LOCK_SH 讀伺服器用戶端檔案鎖。這意味著檔案可以共用,其他人可以讀該檔案
- LOCK_EX 寫伺服器用戶端檔案鎖。這是互斥的。該檔案不能被共用。
- LOCK_UN 釋放已有的鎖定
- LOCK_NB 防止在請求加鎖時發生阻塞
資料庫管理系統
- RDBMS提供了比普通檔案更快的資料訪問。
- RDBMS可以很容易地尋找並檢索滿足特定條件的資料集合。
- RDBMS具有內建的處理並發訪問的機制。
- RDBMS可以隨機訪問資料。
- RDBNS具有內建的許可權系統。
vieworders.php
Bob's Auto Parts - Customer OrdersBob's Auto PartsCustomer OrdersNo orders pending.Please try again later.";exit;}while (!feof($fp)){$order = fgets($fp,999);echo $order."
";}?>
proccessorder.php
Bob's Auto Parts-Order ResultsBob's Auto Parts
Order Results
Order processed at ".date('H:i, jS F Y')."";echo "Your order is as follows:
";$totalqty = 0;$totalqty = $tireqty + $oilqty + $sparkqty;echo "Items ordered: ".$totalqty."
";if($totalqty == 0){ echo "You did not order anything on the previous page!
";}else{if($tireqty > 0){ echo $tireqty." tires
"; }if($oilqty > 0){ echo $oilqty." bottles of oil
"; }if($sparkqty > 0){ echo $sparkqty." spark plugs
"; }}$totalamount = 0.00;define("TIREPRICE", 100);define("OILPRICE", 10);define("SPARKPRICE", 4);$totalamount = $tireqty * TIREPRICE+ $oilqty * OILPRICE+ $sparkqty * SPARKPRICE;$totalamount=number_format($totalamount, 2, '.', ' ');echo "Total of order is $.$totalamount.
";echo "Address to ship to is ".$address."
";$outputstring = $date."\t".$tireqty." tires \t".$oilqty." oil\t".$sparkqty." spark plugs\t\$".$totalamount."\t".$address."\n";@ $fp= fopen("$DOCUMENT_ROOT/orders/orders.txt", 'ab');flock($fp, LOCK_EX);if(!$fp){echo "Your orde could not be processed at this time. Please try again later.
";exit;}fwrite($fp, $outputstring, strlen($outputstring));flock($fp, LOCK_UN);fclose($fp);echo "Order written.
";?>
參考資料:
PHP&MySQL.Web