儲存資料有兩種基本方法:保存到普通文件,或保存到資料庫中。
資料寫入:
1、開啟檔案。如果檔案不存在,需要先建立它。
2、將資料寫入這個檔案。
3、關閉這個文件。
資料讀出:
1、開啟檔案。如果這個文件不能開,就應該意識到這一點並且正確地推出。
2、從文件中讀出資料。
3、關閉這個文件。
選擇檔案模式:
當開啟一個檔案的時候,有以下三種選擇。
1、開啟檔案為了只讀、只寫或讀取、寫入。
2、如果要寫一個文件,你可能希望覆蓋已有的文件內容,或者僅僅將新的數據追加到未見末尾。如果該檔案已經存在,也可以終止程式的執行而不是覆寫該檔案。
3、如果希望在一個區分了二級制方式和純文字方式的系統上寫一個文件,還必須指定採用的方式。
函數fopen()支援以上三種方式的組合。
依照伺服器設定不同,可以透過以下三種方式取得文件根目錄:
$_SERVER['DOCUMENT_ROOT']
$DOCUMENT_ROOT
RO$HTTP_SERVER_VARS['DOCENTUMENT_ROOT
個風格是首選的。開啟檔案fopen(path,mode)
寫入檔案:fwrite($fp, &outputstring)
關閉檔案:fclose($fp)
fopen()函數的檔案模式—
r 從文件頭開始讀取
r+ 只讀 讀寫模式-開啟文件,從文件頭開始讀寫
w 只寫 寫模式-開啟文件,從文件頭開始讀取。如果該文件已經存在,將刪除所有文件已有內容。如果該文 件不存在,則函數將建立此檔案。
x 謹慎寫 寫模式開啟文件,從文件頭開始寫。入如果檔案已經存在,該檔案將不會被打開,fopen()函數將傳回false,而且PHP將產生一個警告。
x+ 謹慎寫 讀/寫模式開啟文件,從文件頭開始寫。入如果檔案已經存在,該檔案將不會被打開,fopen()函數將傳回false,而且PHP將產生一個警告。
a 追加 追加模式-開啟文件,如果該文件已有內容,將從文件結尾開始追加(寫),如果該文件不存在,函數將建立此文件,
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 "? "<br /> ": $char); } }
读取任意长度:fread()
读取一个文件的最后一种方法是使用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
<?php $DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"]; ?> <html> <head> <title>Bob's Auto Parts - Customer Orders</title> </head> <body> <h1]]>Bob's Auto Parts</h1> <h2]]>Customer Orders</h2> <?php @$fp = fopen("$DOCUMENT_ROOT/orders/orders.txt", 'rb'); if(!$fp){ echo "<p><strong>No orders pending.Please try again later.</strong></p>"; exit; } while (!feof($fp)){ $order = fgets($fp,999); echo $order."<br />"; } ?> </body> </html>
proccessorder.php
<?php $tireqty = $_POST['$tireqty']; $oilqty = $_POST['$oilqty']; $sparkqty = $_POST['$sparkqty']; $address = $_POST['address']; $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $date = date('H:i, jS F Y'); ?> <html> <head> <title>Bob's Auto Parts-Order Results</title> </head> <body> <h1>Bob's Auto Parts</h1> <h2>Order Results</h2> <?php echo "<p>Order processed at ".date('H:i, jS F Y')."</p>"; echo "<p>Your order is as follows: </p>"; $totalqty = 0; $totalqty = $tireqty + $oilqty + $sparkqty; echo "Items ordered: ".$totalqty."<br />"; if($totalqty == 0){ echo "You did not order anything on the previous page!<br />"; }else{ if($tireqty > 0){ echo $tireqty." tires<br />"; } if($oilqty > 0){ echo $oilqty." bottles of oil<br />"; } if($sparkqty > 0){ echo $sparkqty." spark plugs<br />"; } } $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 "<p>Total of order is $.$totalamount.</p>"; echo "<p>Address to ship to is ".$address."</p>"; $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 "<p><strong>Your orde could not be processed at this time. Please try again later.</strong></p></body></html>"; exit; } fwrite($fp, $outputstring, strlen($outputstring)); flock($fp, LOCK_UN); fclose($fp); echo "<p>Order written.</p>"; ?> </body> </html>