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']
フォーム データの場合は、最初のスタイルが優先されます。
ファイルを開く
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() 関数を呼び出すと、ファイルが開き、ファイルの内容が標準出力に出力され、ファイルが閉じられます。 - 2 番目の方法は fpassthru() です。この関数を使用するには、まず fopen() を使用してファイルを開く必要があります。次に、ファイル ポインタをパラメータとして fpassthru() に渡し、ファイル ポインタが指すファイルの内容を標準出力に送信できるようにします。次に、ファイルを閉じます。読み取り操作が成功した場合、関数は true を返し、それ以外の場合は false を返します。
- ファイル全体を読み取る 3 番目の関数は file() です。これは readfile と同じです。ただし、結果は配列に送信されます。
- $filearray = file($path);
4 番目のオプションは、file_get_contents() 関数を使用することです。この関数は readfile() と同じですが、この関数はファイルの内容をブラウザにエコーするのではなく、文字列としてファイルの内容を返します。 -
1 文字の読み取り:
fgetc()
while(!feof($fp)){
$char = fgetc($fp);
if(!feof($fp)){
echo ($char == "\n "? "<br /> ": $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
<?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>
ログイン後にコピー
参考资料:
PHP&MySQL.Web