Gracece's Blog

生命不息,折腾不止。

读书笔记[2]-第2章 数据的存储与检索

这是 《php和mysql web开发》的第二章。

这一章主要讲的是对文件的操作。储存数据的两种方式分别是保存到普通文件和保存到数据库。虽然在当今基本都是采用了更加安全且高效的数据库来保存数据,但基本的文件读写还是有其不可替代的作用的,特别是对于小规模的简单数据。下面是我的学习笔记。

文件处理的基本步骤:

  1. 打开文件
  2. 写入/读出文件
  3. 关闭文件

使用fopen()打开文件

打开文件的时候要注意选择模式,这个要根据你的需求来选择,比如你是要把一些信息添加的文件中,那么就应该采用读写模式附加写入。如果你是要读取文件的信息并在网页中显示,则只读模式就够了,不应该让文件处于可写入的模式,以保证数据的安全。另外,二进制模式是推荐一直使用的,因为windows下会区分文本文件和二进制文件,而Unix下是无区别的,为了保证程序最大的可移植性,应该加上“b” .

fopen() 函数mode 参数的可能的值:

mode 说明
“r” 只读方式打开,将文件指针指向文件头。
“r+” 读写方式打开,将文件指针指向文件头。
“w” 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
“w+” 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
“a” 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
“a+” 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
“x” 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
“x+” 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。

注意:为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 ”b” 标记。

更多信息参考w3school的相关信息。

一些小细节:

  • 为了保证数据安全性,可以使用DOCUMENT_ROOT,将文件放在网站根目录的上一层具体的在学到十五章的时候继续探讨。但是更根本的还是使用数据库。

  • 为了保证代码可用性,不推荐使用绝对路径,同时不推荐使用只能在windows上运行的反斜线(\)。

  • 当打开不存在的文件时系统会返回错误信息,这时应该抑制错误实现更好的用户体验。

使用fwrite()写入文件

fwrite(file,string,length)

其中length为可选变量。

在写入文件的时候,要特别注意权限问题,否则会出现无法访问的问题。比如对于一个文件,所属的用户和用户组都是grace,而实际运行php的是www-data,www-data对于这个文件就是在others的范围,没有写入权限。这时的解决办法可以是把文件所属的组改成www-data,并给组加上可写权限。

在任何时候都不应该出现权限为777的情况!

使用fgets(),fgetss(),fgetcsv()等读取文件

上面这三个函数都是一次读取一行的函数,fgets每次从文件中读取一行内容,直到出现换行符\n ,或者EOF,或者最大长度减一。

$order = fgets($fp,999);

fgetss()可以过滤html和php的特殊标记,保证安全性。特别要注意对php标记的过滤以保证安全性。因为如果没有进行过滤,恶意攻击者就可以把一些恶意代码插入到你的网站,这是极大的隐患。使用两个例子来说明:

<?php
$file = fopen("test.htm","r");
echo fgetss($file);
fclose($file);
?> 

输出类似:

This is a paragraph.

下面这一段:

<?php
$file = fopen("test.htm","r");
echo fgetss($file,1024,"<p>,<b>");
fclose($file);
?> 

输出类似: This is a paragraph.

输出的源代码是:

 <b>This is a paragraph.</b>

fgetcsv()可以处理电子表格文件,因为这些文件的分隔符不是\t,而可能是逗号或者其他。fgetcsv()返回的结果是数组。

这些函数的更详细用法,以及其他读取文件的函数可以参考w3school的相关内容 ,这里就不再一一列举。

其他常用的函数

  • file_exists() 判断文件是否存在

  • filesize()  确定文件大小

  • unlink()  删除文件

关于文件读写操作部分大概就是这样,php提供的函数比较多,更重要的还是在实践中对这些函数加以实践,在实践中学习才能取得更好的效果。

截至这一部分,我写的相关代码可查看github 。

下一部分为“使用数组”,待续。

blog comments powered by Disqus