第二章、数据的存储与检索(文件与数据库)

一、代码初始化准备

在第一章原有代码的基础上进行一些修改

orderform.html

<form action="processorder.php"method="post">
<table border="0"> 
<tr bgcolor="#cccc00"> 
<td width="150">Item</td>
<td width="15">Quantity</td>
</tr>
<tr>
<td>Tires</td>
<td align="center">
<input type="text"name="tireqty"size="3" maxlength="3"/>
</td>
</tr>
<tr>
<td>Oil</td>
<td align="center">
<input type="text"name="oilqty"size="3" maxlength="3"/>
</td>
</tr>
<tr>
<td>Spark Plugs</td>
<td align="center">
<input type="text"name="sparkqty"size="3" maxlength="3"/>
</td>
</tr>
<tr>
<td>Shipping Address</td>
<td align="center"> 
<input tpye="text"name="address"size="20"maxlength="10"/>
</td>

</tr>
<tr>
<td colspan="2"align="center">
<input type="submit"value="Submit Order"/>
</td>
</tr>
</table>
</form>

processorder.php

<?php 
//create short variable names 
$tireqty=$_POST['tireqty']; 
$oilqty=$_POST['oilqty']; 
$sparkqty=$_POST['sparkqty']; 
$address=$_POST['address'];
$date=date('H:i,jS F Y');
define('TIREPRICE',100); 
define('OILPRICE',10); 
define('SPARKPRICE',4);
?>
<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";
echo"</p>";
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; 
$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>";
?>
</body> 
</html>

当前效果

orderform.html

在这里插入图片描述

processorder.php

在这里插入图片描述

二、关于文件创建的知识预备

将数据写入一个文件步骤

1)打开这个文件。如果文件不存在,需要先创建它。
2)将数据写入这个文件。
3)关闭这个文件。

将数据读出文件步骤

1)打开这个文件。如果这个文件不能打开(例如,文件不存在),就应该意识到这一 点并且正确地退出。
2)从文件中读出数据。
3)关闭这个文件。

fopen()函数

$fp=fopen("$DOCUMENT_ROOT/../orders.txt",'w');

第一个参数是要打开的文件,文件名为orders.txt。
而其中的$DOCUMENT_ROOT,在之前有过赋值为:

$DOCUMENT_ROOT=$_SERVER['D OCUMENT_ROOT']

等号右边是PHP内置变量,这个变量指向了Web服务器文档树的根。
“…” 表示文档根目录的父目录。
第二个参数是是文件模式,指定了将对文件进行的操 作。
使用最多的几个:
r:只读;
w:只写,若文件已有内容,则原先内容会被覆盖;文件不存在则自动新建;
a:追加,若文件已有内容,则自动从尾部进行写入;文件不存在则自动新建;

几种指定文件路径的方法实例

注意 该php文件的位置为:
在这里插入图片描述
等号右边是PHP内置变量,这个变量指向了Web服务器文档树的根。(即xampp文档的根–Most important)
“…” 表示文档根目录的父目录。(即xampp)

$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
$fp=fopen("$DOCUMENT_ROOT/../orders.txt",'ab');

运行后会找到新建文件位置:
在这里插入图片描述
没有指定路径,这个文件就将在脚本自身所在的相同目录中查找或者创建。

$fp=fopen("orders.txt",'ab');

运行后会出现在php所在的文件中:
在这里插入图片描述
(不推荐)这样做的问题在于,特别是如果将网站安装在别人的服务器上,这 个绝对路径可能会改变。

$fp=fopen("D:/Most important/xampp/htdocs/phps file/orders.txt",'ab');

指定绝对路径运行后:
在这里插入图片描述

三、通过FTP或HTTP打开文件

作用:可以使用该函数打开一个远程文件:
①如果使用的文件名是以ftp://开始的,fopen()函数将建立一个连接到指定服务器的被动 模式,并返回一个指向文件开始的指针。
②如果使用的文件名是以http://开始的,fopen()函数将建立一个到指定服务器的HTTP连 接,并返回一个指向HTTP响应的指针。
注意 :URL中的域名不区分大小写,但是路径和文件名可能会区分大小写。
比如,想要以只读模式打开百度的robots.txt文件:

$fp=fopen("http://www.baidu.com/robots.txt",'r');

四、正式开始

写入文件

将系统自带的变量赋予DOCUMENT_ROOT:
在这里插入图片描述
新建文件,其中@是抑制系统报错,可以在后续自己手动输入希望回馈的错误:
在这里插入图片描述
给文件上锁,以便告诉其它操作:我正在’独占’这个文件,防止其它文件进行操作:
在这里插入图片描述
判断文件是否存在,存在则输出echo后面的话:
在这里插入图片描述
写入文件(第一个参数是指向文件的指针,第二个参数是写入的语句,其中\t,\n依旧是空格,换行等操作:
在这里插入图片描述
其中$outputstring字符串内容为:
在这里插入图片描述
操作完毕解除锁定,关闭文件:
在这里插入图片描述

运行并查看文件

在这里插入图片描述

完整代码

processorder.php

<?php 
//create short variable names 
$tireqty=$_POST['tireqty']; 
$oilqty=$_POST['oilqty']; 
$sparkqty=$_POST['sparkqty']; 
$address=$_POST['address']; 
$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT']; 
$date=date('H:i,jS F Y');
define('TIREPRICE',100); 
define('OILPRICE',10); 
define('SPARKPRICE',4); 
?>
<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;  
$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";


//open file for appending 
@$fp=fopen("$DOCUMENT_ROOT/../orders.txt",'ab');
flock($fp,LOCK_EX); 
if(!$fp){ 
    echo"<p><strong>Your order 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>

读出文件

首先,新建立一个文件,名为vieworders.php,路径和processorder.php相同;
依旧是先赋值:
在这里插入图片描述
打开文件并且上锁,并且注意这里的锁是LOCK_SH,即可以共享,并不是锁定不让其它进程操作,而是告诉其他进程我正在读取,其他进程可以共享读取这个文件:
在这里插入图片描述
feof(),遍历参数中的文件指针所指向的文件,当遍历到末尾时,返回true;
fgets()、fgetss()和fgetcsv():可以每次读取参数一文件中一行数据,直到读到\n或者读取的字节数为998B结束
在这里插入图片描述
结束以后解除上锁:
在这里插入图片描述

运行并查看文件

即刚刚写入orders.txt文件的内容
在这里插入图片描述

完整代码

<?php 
//create short variable name 
$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.txt",'rb'); 
flock($fp,LOCK_SH);
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/>"; 
}
flock($fp,LOCK_UN); 
?>
</body>

五、其它有关于文件操作的一些函数

读取整个文件readfile("$DOCUMENT_ROOT/../orders.txt")
读取一个字符fgetc($fp)
读取任意长度fread($fp, length)
查看文件是否存在(存在返回true)file_exists("$DOCUMENT_ROOT/../orders.txt")
确定文件大小filesize("$DOCUMENT_ROOT/../orders.txt")
删除一个文件unlink("$DOCUMENT_ROOT/../orders.txt")
在文件中定位 ,rewind()函数可以将文件指针复位到文件的开始。ftell()函数可以以字节为单位报告文 件指针当前在文件中的位置。fseek()函数可以将文件指针fp从whence位置移动offset个字节:
ftell($fp) fseek($fp,offset)
文件锁定:flock($fp,lock)
在这里插入图片描述

六、更好的方式—数据库

Q:为什么要使用数据库
使用普通文件,你可能会遇到如下这些问题:
■当文件变大时,使用普通文件将会变得非常慢。
■在一个普通文件中查找特定的一个或者一组记录将会非常困难。
■处理并发访问可能会遇到问题。
■到目前为止,我们所看到的文件处理都是顺序的文件处理——也就是我们从文件开 始处一直读到文件的结束。如果我们希望在文件中间插入记录或者删除记录(随机访 问),这可能会比较困难——你将必须将整个文件读入到内存中,在内存中修改它,然后 再将整个文件写回去。如果这是一个很大的数据文件,这可能会带来巨大的开销。
■除了使用文件访问权限作为限制外,还没有一个简单的方法可以区分不同级别的数 据访问。
数据库实例演练
PHP与数据库基础知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值