存储数据有两种基本方法:保存到普通文件,或者保存到数据库中。
1.文件处理
将数据写入文件的三个步骤:(1)打开这个文件,如果不存在则创建;(2)将数据写入文件;(3)关闭文件
从文件中读取数据的三个步骤:(1)打开这个文件,如果文件不存在则正确的退出;(2)从文件中读取数据;(3)关闭文件。
2.打开文件
(1)使用fopen()来打开文件
如要将一个顾客订单写入Bob订单文件,可以使用如下语句打开该文件:
$fp = fopen("%DOCUMENT_ROOT/../orders/orders.txt", 'w');
上面代码中,使用了内置变量$_SERVER['DOCUMENT_ROOT'],指向web服务器文档树的根。用".."表示文档根目录的父目录。
在Unix系统中,根目录是/,在windows系统中,根目录是C:\。在Unix环境下,目录中的间隔符是正斜线(/)。windows平台下可以使用正斜线或者反斜线,如果使用反斜线,则需要使用转义字符(转义字符为反斜线\)。在PHP中很少使用反斜线,因为这样意味着代码只能在windows下运行。如果使用正斜线吗,代码不需要任何修改就可以在linux下运行。
(2)通过FTP或者HTTP打开文件
除了打开本地文件进行读写之外,还可以使用fopen()函数通过FTP、HTTP或者其它协议来打开文件。在php.ini文件中,可以通过关闭allow_url_fopen指令来禁用这个功能。
如果使用的文件名是以ftp://开始的,fopen()将建立一个连接到指定服务器的被动模式,并返回一个指向文件开始的指针。
如果使用的文件名是以http://开始的,fopen()函数将建立一个到指定服务器的HTTP连接,并返回一个指向HTTP响应的指针。
请注意:URL中的域名不区分大小写,但是路径和文件名可能区分大小写。
(3)打开文件时可能遇到的问题
打开文件时,常见错误时试图打开一个没有权限进行读写操作的文件。
任何人都可以写的目录和文件是非常危险的,不应该具有可以从web上直接可写的目录。
$fp = @fopen("%DOCUMENT_ROOT/../orders/orders.txt", 'w');
上面代码中的@可以抑制所有由该函数调用所产生的错误。通常在出错的时候这是一个不错的方法,但是要在其它地方处理它。
3.写文件
在PHP中写文件相对简单,可以使用fwrite()或者fputs()。fputs()是fwrite()的别名函数。可以使用如下方法调用fwrite:
fwrite($fp, $outputstring);
这个函数用来将$outputstring中的字符串写入到$fp指向的文件中。
fwrite()函数的一个替换函数是file_put_contents(),其原型是:
int file_put_contents(string filename,
string data
[, int flags
[,resource context]]
)
这个函数可以在不需要调用fopen()(或fclose())函数打开要写的文件之前,将包含在data中的字符串数据写入到filename所指定的文件中。
(1)fwrite的参数
fwrite的原型如下:
int fwrite(resource handle, string string[, int length])
第三个参数length是写入的最大字符数。如果给出这个参数,则将向handle指向的文件中写入字符串,一直写到字符串的末尾或者已经写了length字节才停止。
4.关闭文件
使用完文件后要关闭,调用fclose()函数,如下:
fclose($fp);
5.读文件
(1)知道何时读完文件:feof()
(2)每次读取一行数据:fgets(),fgetss()和fgetcsv()
(3)读取整个文件:readfile(),fpassthru()和file()
(4)读取一个字符:fgetc()
(5)读取任意长度:fread()
6.使用其它有用的文件函数
(1)查看文件是否存在:file_exists()
(2)确定文件大小:filesize()
(3)删除一个文件:unlink()
(4)在文件中定位:将文件指针复位到文件的开始rewind(),fseek()(将文件指针指向某个位置)和ftell()(以字节方式报告文件指针在文件的位置)
7.文件锁定
文件锁定是通过flock()来实现的。
8.更好的方式:数据库管理系统
普通文件存在的问题:
(1)文件变大时,使用普通文件将变得非常慢
(2)在一个普通文件中查找特定的一个或者一组记录非常难。
(3)处理并发访问会遇到问题
(4)不利于在文件中间插入或删除