2.1. 数据写入文件
持之以恒,方得始终!
第一章中,我们已经实现了收集用户提交的订单,我们这一章把收集的订单数据,存入文件中,一个订单一行。
打开一个文件
如果文件不存在,需要先创建它。
下面是借助于 fopen 选择的 ab 文件模式,我们可以不用单独再去判断文件是否存在,然后再去创建。
$fp = fopen("./orders.txt", 'ab'); // 第二个参数是选择文件模式,a是追加内容到文件尾部,如果文件不存在,则创建。b是二进制模式,推荐这个,拥有更好的移植性。
var_dump($fp); // resource(5) of type (stream) 这是个资源流类型
文件模式
我们使用 fopen 打开一个文件时,还需要选择一个文件模式,也就是打开后要对这个文件做什么 ?(只读,只写,读写), 然后操作系统根据我们要做什么,来判断我们是否能做成(文件是否允许被打开,是否有读,写等权限)。
具体有哪些可用的文件模式,我们可以参考 手册
fopen 的第三个参数 include_path
如果要使用它,我们需要先到 php.ini中设置一个目录,使用 fopen 时,把这个参数值设置为true即可,此时,我们的文件就不需要给目录或路径了,直接到 include_path 的目录下查找。
$fp = fopen('orders.txt', 'ab', true);
fopen的第四个参数
可以远程的打开一个 ftp,http等文件。在 php.ini 中可以通过 allow_url_fopen
选项禁用这个功能。
如果不能正常打开一个文件,我们可以检查一下权限是否满足。
数据写入文件中
$data = "$date, $tireqty tires, $oilqty oil, $sparkqty sparks, $totalamount, $address \n";
fwrite($fp, $data, strlen($data));
关闭文件
使用完文件后,我们需要关闭它,不然这个文件资源句柄,一直处于占用状态。
fclose($fp);
一个例子
基于前面的下单页面,处理页面而来,将用户提交的数据保存到文件,一个订单一行。
orderform.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下单页面</title>
</head>
<body>
<form action="processorder.php" method="post">
<table border="0">
<tr bgcolor="#cccccc">
<td width="150">Item</td>
<td width="150">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 type="text" name="address" size="15", maxlength="15"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Submit Order"></td>
</tr>
</table>
</form>
</body>
</html>
processorder.php
<?php
$tireqty = intval($_REQUEST['tireqty'])??0;
$oilqty = intval($_REQUEST['oilqty'])??0;
$sparkqty= intval($_REQUEST['sparkqty'])??0;
$address = $_REQUEST['address']??'';
$document_root = $_SERVER['DOCUMENT_ROOT'];
$date = date("Y-m-d H:i:s");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>订单处理</title>
</head>
<body>
<h1>Bob's Auto Parts - Order Result</h1>
<h2>Order Result</h2>
<?php
echo "<p> order processed at $date </p>";
echo "<p> your order is as follows</p>";
$totalqty = $tireqty + $oilqty + $sparkqty;
echo "Items ordered : $totalqty <br/>";
if ($totalqty == 0) {
echo "你没有下单.";
} else {
if($tireqty > 0) echo "$tireqty tires <br>";
if($oilqty > 0) echo "$oilqty 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>";
$data = "$date, $tireqty tires, $oilqty oil , $sparkqty spark plugs, $totalamount, $address \n";
@$fp = fopen("$document_root/../myorders.txt", 'ab');
flock($fp, LOCK_EX);
if(!$fp) {
echo "<p>打开文件失败</p>";
exit;
}
fwrite($fp, $data, strlen($data));
flock($fp, LOCK_UN);
fclose($fp);
echo "<p>订单写入成功</p>";
?>
</body>
</html>
file_put_contents()
向文件中写数据,不需要打开,关闭的步骤。
具体见手册 www.php.net/manual/zh/function.fil...
file_get_contents()
读取文件的数据,也不需要打开,关闭的步骤。
www.php.net/manual/zh/function.fil...
如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com