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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
Junwind
讨论数量: 0
发起讨论 只看当前版本


暂无话题~