学习过程实录之写文件

PHP学习实录 2013年07月07日 , ,

第二部分 PHP数据的存储与检索(二)

知识回顾

在上一节的《PHP学习过程实录之数据存储》中主要讲解了如下内容:

  1. PHP数据保存方式与特点。
  2. PHP文件操作的过程与步骤。

在PHP打开一个文件可以使用fopen()函数。打开一个文件,还需要指定如何使用它,也就是文件模式。

打开文件

文件模式

当打开一个文件时,有三种选择:

  1. 只读、只写或者读写方式。
  2. 如果要写一个文件,可以选择数据覆盖原数据,或者附加到文件的末尾。
  3. 指定二进制写入还是文件写入。

打开文件

将订单数据写入到订单文件时,可以使用如下方式:

$document_root = $_SERVER[‘DOCUMENT_ROOT’];
$fp = fopen(“$document_root/../orders/orders.txt”,’w’);

首先使用PHP内置的变量$_SERVER[‘DOCUMENT_ROOT’]来获取文档树的根目录,并将其保存为一个简短的变量中。

fopen ()第一个参数是要打开的文件,将这个文件放置在Web服务器的文档目录的外部。这里使用相关目录进行设置。当然也可以使用绝对路径,但是当变换文件在其他服务器上时需要修改大量的代码来使程序依然好用。

fopen()第二个参数是文件模式,它是一个字符串。

模式 意义
r 只读方式打开,将文件指针指向文件头。
r+ 读写方式打开,将文件指针指向文件头。
w 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
w+ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
a 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
a+ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
x 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
x+ 创建并以读写方式打开,其他的行为和x一样。
c 写入方式打开,将文件指针指向文件头但不将文件大小截为零,也不生成错误。用于修改文件。如果文件不存在则尝试创建之。
c+ 创建并以读写方式打开,其他的行为和c一样。
b 二进制模式进行读写。UNIX不区分,可移植性强。
t 文本模式进行读写。Windows特有选项。

在例子中使用w,新一个订单写入文件就将把原订单替换,这不是想要的结果,采取追加模式比较合适。

$document_root = $_SERVER[‘DOCUMENT_ROOT’];
$fp = fopen(“$document_root/../orders/orders.txt”,’ab’);

附加b是以二进制进行写入。

写文件

在PHP中写文件相对比较简单,可以使用fwrite()或者fputs(),fputs()是fwrite()的別名函数。

fwrite($fp, $outputstring);

这个函数将字符串$outputstring写入到$fp指向的文件中。fwrite()函数的原型为,

int fwrite ( resource $handle , string $string [, int $length ] )

length为写入的最大字符数。

在写入数据的时候,数据的格式应该是什么样子的由自己来决定。例如:

$outputstring = $date."\t".$pcQuantity."\t".$cameraQuantity."\t"
.$cellphoneQuantity."\t".$totalAmount."\t".$address."\n";

这里使用水平制表符来分隔数据单元,使用换行符来分隔订单数据。使用的分隔符一定不能出现在输入的数据中,这将在以后进行学习。

关闭文件

当使用完文件后,应该关闭文件。使用fclose()函数来关闭文件,

fclose($fp);

至此,processorder.php文件代码清单如下:

<h1>枫竹梦的电子货物</h1>
<h2>订单结果</h2>
<?php
    //获得表单数据
    $pcQuantity = $_POST['pcquantity'];
    $cameraQuantity = $_POST['cameraquantity'];
    $cellphoneQuantity = $_POST['cellphonequantity'];
    $address = $_POST['address'];
    $date = date('H:i, jS F Y');
    echo '<p>订单已处理 '.$date.'</p>';

    //输出订单信息
    $totalQuantity = $pcQuantity + $cameraQuantity + $cellphoneQuantity;
    echo '<br />订购总量:'.$totalQuantity.'<br />';
    define('pcPrice',4399);
    define('cameraPrice',6599);
    define('cellphonePrice',1999);
    $totalAmount = $pcQuantity * pcPrice
        + $cameraQuantity * cameraPrice
        + $cellphoneQuantity * cellphonePrice;
    echo '合计:¥'.number_format($totalAmount,2).'<br />';
    $taxrate = 0.06;          //营业税
    $totalAmount *= (1 + $taxrate);
    echo '总计(含税):¥'.number_format($totalAmount,2).'<br />';
    $outputstring = $date."\t".$pcQuantity."\t".$cameraQuantity."\t".$cellphoneQuantity."\t".$totalAmount."\t".$address."\n";
    @$fp = fopen("orders.txt",'ab');
    flock($fp,LOCK_EX);
    if(!$fp)
    {
        echo "<p><b>您的订单现在不能处理,请稍后再提交!</b></p></div></body></html>";
        exit;
    }
    fwrite($fp,$outputstring,strlen($outputstring));
    flock($fp,LOCK_UN);
    fclose($fp);
?>

上述程序中的使用的flock()函数,用来锁定文件,在Windows下会被强制执行。

  • 要取得共享锁定(读取的程序),将 operation 设为LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
  • 要取得独占锁定(写入的程序),将 operation 设为LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
  • 要释放锁定(无论共享或独占),将 operation 设为LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
  • 如果不希望flock()在锁定时堵塞,则给 operation 加上LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。

本文地址:http://furzoom.com/php-develop-file-write/

总结

  1. 介绍PHP打开文件时的文件模式。
  2. 介绍PHP打开文件、写文件和关闭文件的方法和相关函数。

你若要放弃,那我就可以安慰自己了,因为这样我不再孤独了,可以参考能够不断往前走,成功难道不是早晚的是事吗?

相关链接:

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《学习过程实录之写文件》
日志链接:http://furzoom.com/php-develop-file-write/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部