>  기사  >  백엔드 개발  >  PHP 데이터 저장 및 검색

PHP 데이터 저장 및 검색

巴扎黑
巴扎黑원래의
2016-11-22 10:41:141407검색

데이터를 저장하는 기본 방법에는 일반 파일에 저장하거나 데이터베이스에 저장하는 두 가지가 있습니다.
데이터 쓰기:

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&#39;s Auto Parts - Customer Orders</title>
</head>
<body>
<h1]]>Bob&#39;s Auto Parts</h1>
<h2]]>Customer Orders</h2>
<?php 
@$fp = fopen("$DOCUMENT_ROOT/orders/orders.txt", &#39;rb&#39;);
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[&#39;$tireqty&#39;];
$oilqty = $_POST[&#39;$oilqty&#39;];
$sparkqty = $_POST[&#39;$sparkqty&#39;];
$address = $_POST[&#39;address&#39;];
$DOCUMENT_ROOT = $_SERVER[&#39;DOCUMENT_ROOT&#39;];
$date = date(&#39;H:i, jS F Y&#39;);
?>
<html>
<head>
<title>Bob&#39;s Auto Parts-Order Results</title>
</head>
<body>
<h1>Bob&#39;s Auto Parts</h1>
<h2>Order Results</h2>
<?php 
echo "<p>Order processed at ".date(&#39;H:i, jS F Y&#39;)."</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, &#39;.&#39;, &#39; &#39;);
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", &#39;ab&#39;);
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>


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.