데이터를 저장하는 기본 방법에는 일반 파일에 저장하거나 데이터베이스에 저장하는 두 가지가 있습니다.
데이터 쓰기:
1. 파일을 엽니다. 파일이 존재하지 않으면 먼저 생성해야 합니다.
2. 이 파일에 데이터를 씁니다.
3. 이 파일을 닫습니다.
데이터 읽기:
1. 파일을 엽니다. 파일을 열 수 없는 경우 이를 인지하고 올바르게 종료해야 합니다.
2. 파일에서 데이터를 읽습니다.
3. 이 파일을 닫습니다.
파일 모드 선택:
파일을 열 때 다음 세 가지 옵션이 있습니다.
1. 읽기 전용, 쓰기 전용 또는 읽기 및 쓰기용으로 파일을 엽니다.
2. 파일을 쓰고 싶다면 기존 파일 내용을 덮어쓰거나 보이지 않는 끝에 새 데이터를 추가할 수도 있습니다. 파일이 이미 존재하는 경우 파일을 덮어쓰는 대신 프로그램 실행을 종료할 수 있습니다.
3. 2차 복사 모드와 일반 텍스트 모드를 구분하는 시스템에서 파일을 작성하려면 사용할 방법도 지정해야 합니다.
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 Append Append 모드 - 파일을 엽니다. 파일에 이미 내용이 있으면 파일의 끝부터 추가(작성)됩니다. 파일이 없으면
a+ Append 추가 모드 - 파일을 엽니다. 파일에 이미 내용이 있으면 파일 끝부터 추가(쓰기)가 시작되고, 파일이 없으면 함수가 파일을 생성합니다.
b Binary Binary 모드 - 사용 다른 모드와 연결합니다. 파일 시스템이 바이너리 파일과 텍스트 파일을 구별할 수 있다면 이를 사용할 수 있습니다. 휴대성이 극대화되었습니다. 바이너리 모드가 기본 모드입니다.
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>