ホームページ >バックエンド開発 >PHPチュートリアル >PHP データの保存と取得
データを保存するには、通常のファイルに保存するか、データベースに保存するという 2 つの基本的な方法があります。
データの書き込み:
1. ファイルを開きます。ファイルが存在しない場合は、最初にファイルを作成する必要があります。
2. このファイルにデータを書き込みます。
3. このファイルを閉じます。
データの読み取り:
1. ファイルを開きます。ファイルを開けない場合は、これに注意して正しく終了する必要があります。
2. ファイルからデータを読み取ります。
3. このファイルを閉じます。
ファイルモードの選択:
ファイルを開くとき、次の 3 つのオプションがあります。
1. ファイルを読み取り専用、書き込み専用、または読み取りと書き込みのために開きます。
2. ファイルを書き込む場合は、既存のファイルの内容を上書きするか、見えない端に新しいデータを追加するだけです。ファイルがすでに存在する場合、ファイルを上書きする代わりにプログラムの実行を終了できます。
3. セカンダリ コピー モードとプレーン テキスト モードを区別するシステムにファイルを書き込む場合は、使用する方法も指定する必要があります。
関数 fopen() は、上記の 3 つのメソッドの組み合わせをサポートしています。
サーバー設定に応じて、次の 3 つの方法でドキュメント ルート ディレクトリを取得できます:
$_SERVER['DOCUMENT_ROOT']
$DOCUMENT_ROOT
$HTTP_SERVER_VARS['DOCUMENT_ROOT']
フォーム データの場合、最初に 1 つのスタイルが優先されます。
ファイルを開く fopen(path,mode)
ファイルを書き込む: fwrite($fp, &outputstring)
ファイルを閉じる: fclose($fp)
fopen() 関数のファイルモード
r 読み取り専用 読み取りモード- ファイルを開き、ファイルヘッダーから読み取りを開始します
r+ 読み取り専用読み取り/書き込みモード - ファイルを開き、ファイルヘッダーから読み取りと書き込みを開始します
w 書き込み専用書き込みモード - ファイルを開き、次から読み取りを開始しますファイルヘッダー。ファイルがすでに存在する場合、ファイルの既存の内容はすべて削除されます。ファイルが存在しない場合、関数はファイルを作成します。
x 慎重に書き込みます ファイルを書き込みモードで開き、ファイルの先頭から書き込みを開始します。ファイルがすでに存在する場合、ファイルは開かれず、 fopen() 関数は false を返し、PHP は警告を生成します。
x+ 慎重に書き込みます ファイルを読み取り/書き込みモードで開き、ファイルの先頭から書き込みを開始します。ファイルがすでに存在する場合、ファイルは開かれず、 fopen() 関数は false を返し、PHP は警告を生成します。
a Append 追加モード - ファイルを開きます。ファイルに既にコンテンツがある場合は、ファイルの末尾から追加 (書き込み) が開始され、ファイルが存在しない場合は、関数がファイルを作成します
a+ Append 追加モード- ファイルを開きます。ファイルに既にコンテンツがある場合は、ファイルの末尾から追加 (書き込み) されます。ファイルが存在しない場合、関数はファイルを作成します
b バイナリ バイナリ モード - との接続に使用されます。他のモード。ファイル システムがバイナリ ファイルとテキスト ファイルを区別できる場合は、それを使用してもよいでしょう。最大限の可搬性を実現します。バイナリ モードがデフォルトのモードです。
t テキストは他のモードと組み合わせるために使用されます。このモードは Windows システムでは単なるオプションです。
読み取り専用モードでファイルを開きます: fopen()
ファイルの読み取りが完了したことを確認します: feof()
一度に 1 行のデータを読み取ります: fgets()、fgetss()、および fgetcsv()
ファイル全体を読み取ります: readfile()、fpassthru()、および file()
最初の方法は readfile() です。 readfile($path); readfile() 関数を呼び出すと、ファイルが開き、ファイルの内容が標準出力に出力され、ファイルが閉じられます。
2 番目の方法は fpassthru() です。この関数を使用するには、まず fopen() を使用してファイルを開く必要があります。次に、ファイル ポインタをパラメータとして fpassthru() に渡し、ファイル ポインタが指すファイルの内容を標準出力に送信できるようにします。次に、ファイルを閉じます。読み取り操作が成功した場合、関数は true を返し、それ以外の場合は false を返します。
ファイル全体を読み取る3番目の関数はfile()です。これはreadfileと同じです。ただし、結果は配列に送信されます。
$filearray = file($path);
4 番目のオプションは、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>