zoukankan      html  css  js  c++  java
  • 【自学php】第三天

      这次的例子是把订单的数据保存起来,一般是用数据库来进行数据的存储最好,但是今天目的是为了学习读写文件,所以这次把数据存在文件里。

      读写文件有一般有三个步骤:

      1)打开文件。如果文件不存在,需要先创建它。

      2)读取/写入数据。

      3)关闭文件。

      1.使用fopen()打开文件。

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

          fopen()返回一个文件指针给$fp,读写文件时需要使用这个变量。

      调用fopen()通常使用2个参数。第一个参数指定文件名,第二个参数指定打开文件的方式。

      php有个内置变量$_SERVER['DOCUMENT_ROOT']指向web服务器的根目录,同表单数据一样,这个变量也有3种访问方法,这里将$_SERVER['DOCUMENT_ROOT']赋给$DOCUMENT_ROOT以方便访问。“..“表示文档的父目录,出于安全原因,将要读写的文件放在web根目录的外面(这个安全原因我也不太清楚,可能以后书里会提到了)。

      a-追加模式,从文件末尾开始追加,如文件不存在,先创建这个文件。b-二进制模式,windows系统下会区分二进制文件和文本文件,为了获得最大的可移植性,推荐使用这项。更多其他模式可以查看文档。

      打开文件时,可能会遇到的错误是试图打开一个没有权限进行读写操作的文件(通常会在unix系统中遇到)。这时可以创建一个全局可写的目录来存储文件:

      mkdir ~/orders

      chmod 777 ~/orders

      如果fopen()调用失败,会返回false,并且通过@抑制错误信息,反馈给用户友好的错误提示。@只是简单的错误处理方法,以后会学到更好的错误处理的方法。

    @ $fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", "ab");
    if(!$fp){
        echo "<p><strong>您的订单暂时不能处理,请稍后重试</strong></p></body></html>"; //在退出脚本前补全html标记,生成有效的html
        exit;
    }

      2.写文件。

       写文件可以使用fwrite()或fputs(),fputs()是fwrite()的别名。

       fwrite($fp, $outputstring); //将$outputstring的字符串写入到$fp指向的文件中。

       fwrite()还有第三个参数,是可选的,表示写入的最大字符数。在使用二进制模式的写操作时,使用第三个参数可以避免一些跨平台的兼容性问题。

       fwrite($fp, $outputstring, strlen($outputstring));

      3.关闭文件。

       fclose($fp); //成功返回true,反之false

      现在可以把表单数据保存到文件中了,最新的processorder.php:

    <?php
        //php每一行要用;结尾
        $tireqty = $_POST['tireqty'];
        $oilqty = $_POST['oilqty'];
        $sparkqty = $_POST['sparkqty'];
        $address = $_POST['address'];
        $totalqty = 0;
        $totalamount = 0.00;
        $date = date("H:i, jS F Y");
    
        define('TIREPRICE', 100);
        define('OILPRICE', 10);
        define('SPARKPRICE', 4);
    
        $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
    ?>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
        <title>订单处理页</title>
    </head>
    <body>
        <h1>汽车配件网店</h1>
        <h2>订单</h2>
        <?php 
            if(empty($tireqty) && empty($oilqty) && empty($sparkqty)){
                echo "<p style='color:red'>您没有选购商品</p>";
                exit;
            }
            if(is_numeric($tireqty) && is_numeric($oilqty) && is_numeric($sparkqty)){
    
                $totalqty = $tireqty + $oilqty + $sparkqty;
                $totalamount = $tireqty * TIREPRICE + $oilqty * OILPRICE + $sparkqty * SPARKPRICE;
    
                echo "<p>订单处理时间:".date("H:i, jS F Y")."</p>";  //php用“.”连接字符串
                echo "购买总数:$totalqty <br>";
                echo "购买总额:¥$totalamount<br>";
            }else{
                echo "<p style='color:red'>参数必须为数字</p></body></html>";
                exit;
            }
    
            //保存订单数据
            @ $fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", "ab");
            if(!$fp){
                echo "<p><strong>您的订单暂时不能处理,请稍后重试</strong></p></body></html>"; //在退出脚本前补全html标记,生成有效的html
                exit;
            }
    
            //将每一个订单拼成一行数据
            $outputstring = $date."	".$tireqty."个轮胎	".$oilqty."桶汽油	".$sparkqty."个火花塞	$".$totalamount."	".$address."
    ";
            fwrite($fp, $outputstring, strlen($outputstring));
            fclose($fp);
    
            echo "<p>订单已存储</p>";
        ?>    
    </body>
    </html>
    View Code

      4.读文件。

         以只读模式打开文件:$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", "rb");

       feof()作为文件结束的测试条件,fgets()从文件中每次读取一行。

       员工查看订单的页面vieworders.php:

    <?php 
        $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
    ?>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
        <title>订单查看页</title>
    </head>
    <body>
        <h1>汽车配件网店</h1>
        <h2>查看订单</h2>
        <?php
            @ $fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", "rb");
    
            if(!$fp){
                echo "<p><strong>暂时还没有订单,请稍后重试。</strong></p></body></html>";
                exit;
            }
            while (!feof($fp)) {
                $order = fgets($fp, 999);
                echo $order."<br/>";
            }
        ?>
    </body>
    </html>
    View Code

         上面脚本的代码几乎可以用readfile("$DOCUMENT_ROOT/../orders/orders.txt")这一句来替代。

       读取整个文件的函数:readfile()将打开文件,将文件内容输出到标准输出(浏览器)中,然后再关闭文件。但是由于“ "在浏览器中不能显示为换行,所以还是用上面的代码显示比较清晰。

      5.文件锁定。

         在读写文件时,锁定该文件,以避免并发带来的问题。

       flock(resource fp, int operation [, int & wouldblock])

       operation有几个值:

        LOCK_SH 读操作锁定,文件可以共享,其他人可以读该文件   

          LOCK_EX  写操作锁定

          LOCK_UN  释放已有的锁定

        LOCK_NB   防止在请求加锁时发生阻塞

       所以对刚才的脚本改进一下,processorder.php:

    flock($fp, LOCK_EX);
    fwrite($fp, $outputstring, strlen($outputstring));
    flock($fp, LOCK_UN);
    fclose($fp);

        vieworders.php:  

         flock($fp, LOCK_SH);
            while (!feof($fp)) {
                $order = fgets($fp, 999);
                echo $order."<br/>";
            }
            flock($fp, LOCK_UN);
            fclose($fp);

      

       

  • 相关阅读:
    【转】win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
    (ring0)Windows内核根据PID获取进程全路径
    Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
    指向API的函数指针定义方法
    ListCtrl列表控件设置到指定位置(自滚动,该特性支持虚拟列表)
    【转】VS设置符号表
    物联网三层架构
    五种测试的区别
    CMMI将能力成熟度分为5个级别
    软件的4种维护(更正性、完善性、预防性、适应性)的区别
  • 原文地址:https://www.cnblogs.com/pandabunny/p/3740222.html
Copyright © 2011-2022 走看看