第二章 数据的存储与检索
1.关于时区的设置
- PHP5开始都需要自己设置时区了,具体设置方法如下:
1.可以通过修改php.ini文件中的date.timezone = PRC;
来显示(这种方法修改之后要保存并重启Apache)
2.通过在PHP代码页面开头输入date_default_timezone_set('PRC');
来解决。(此种方法麻烦在于每写一个新的页面就得重新写一个放开头。)
2. fopen()函数-
打开文件或者URL;需要传递2、3或4个参数。通常代码如下:
$fp=fopen("$DOCUMENT_ROOT/../orders/oreders.txt",'ab');
-
fopen()函数第3个参数是可选的,如果要在include_path中搜索某个文件,就可以使用,具体用法是将这个参数设置为1(true)。
$fp=fopen("$DOCUMENT_ROOT/../orders/oreders.txt",'ab',true);
-
第4个参数是允许fopen()函数的文件名称可以以协议名称开始(如http://或ftp:// 等),并且可以远程打开该文件。
- 如果不想使用该参数,可以通过php.ini文件中的allow_url_fopen指令来禁用。
-
- URL中的域名是不区分大小写,但是路径和文件名可能会区分大小写。
- 出现
Warning: fopen(D:/myblog/../orders/orders.txt): failed to open stream: No such file or directory in D:\myblog\PHP&MYSQL\first clas.php on line 65
情况的解决方法。-
原代码如下:
$fp=fopen("$DOCUMENT_ROOT/../orders/orders.txt",'ab');
-
运行之后会报出如下警告:
-
Warning: fopen(D:/myblog/../orders/orders.txt): failed to open stream: No such file or directory in D:\myblog\PHP&MYSQL\first clas.php on line 65
-大致意思是该fopen语句没有找到正确的文件或路径。
-
-
解决办法:
- 由于我是在windows下使用PHP所以需要再
"$DOCUMENT_ROOT/../orders/orders.txt"
这部分中所有的符号都加上转义字符,这样windows才会认为路径正确。 - 尤其需要注意的是"$"符号前也要加入转义字符,不然依旧会报错。
- 由于我是在windows下使用PHP所以需要再
-
- 修改后的代码如下,正反斜线均可以,但前面一定要加入转义字符:
- 1.
$fp=fopen("\$DOCUMENT_ROOT\\..\\orders\\orders.txt",'ab');
- 2.
$fp=fopen("\$DOCUMENT_ROOT\/..\/orders\/orders.txt",'ab');
- 1.
3.fwrite()函数
- 在PHP中写文件。
int fwrite(respice handle,string string[,int length])
- length这个参数是写入的最大字符数,可选。
- fputs()也是写文件,其可以看做是fwrite()的别名函数。
4.feof()函数
- 测试文件指针(1)是否到了文件结束的位置
5.fgets()、fgetss()、fgetcsv()
-
fgets()函数
- 可以从文件中每次读取一行内容,直到遇到换行字符位置"windo: \r\n;Linux: \n"
- 如果指定了长度,则实际读取的长度是指定长度减1B
-
fgetss()函数
- 和fgets()函数一样,也是从文件每次读取每行内容,但区别在于它可以过滤字符串中包含的PHP和HTML标记。
- 如果想要在此之上过滤其他特殊标记,需要把其包含在allowable_tags字符串中
- 出于安全性的考虑,在读取别人所编写的文件或者用户所输入的文件时,推荐使用fgetss()函数,这是因为:
- 允许无限制的HTML代码出现在文件中可能会破坏之前所设计的格式;
- 而允许无限制的PHP代码出现在文件中则可能造成安全方面的问题。
-
fgetcsv()函数
array fgetcsv (resource fp, int length [, string delimiter[, string enclosure]])
- 如果在文件中使用了定界符(2),如制表符或者
,
可以用fgetcsv()函数将文件分成多行。 - 可以像使用fgets()函数一样使用它,不同的是必须向这个函数传递一个用于 分隔表单域的定界符。
- length的长度应该比要读的文件最长数据行的字符数大。
- enclosure用来制定每行中封闭每一个域的字符。如果没有制定任何字符,则默认是
"
。
6.readfile()、fpassthru()、file()
-
readfile()
int readfile(string filename, [int use_include_path [, resource context]]);
- 使用readfile()函数将会打开所指定的文件,并且将文件内容输出到浏览器中,然后再关闭这个文件。
- use_include_path参数可选,其制定了PHP是否应该再include_path中查找文件。
- context参数只有在文件被远程(http://或ftp://)打开时才使用。具体是指该函数返回值从文件中读出的字节总数。
-
fpassthru()
- 使用该函数必须先使用fopen()打开文件。然后文件指针作为参数传递给fpassthru()。这样就可以把文件指针所指向的文件内容发给浏览器。最后 再关闭该文件。
-
flie()
- 出了和readfile()一样可以将读取的文件内容显示到浏览器上之外
- 该函数特殊之处在于,它其实是把结果发送到一个数组中,文件中的每一行都将作为一个元素保存在该数组中。
7.fgetc()
- fgets()函数是一行一行读取内容,fgetc()函数则是每次读取一个字符。
- 该函数的一个缺点在于它会返回文件结束符EOF.
8.fread()
string fread(resource fp, int length);
- 从文件中读取任意长度的字节
- 使用该函数,要么它读满length参数所制定的字节,要么就是读到了文件的末尾,要么是网络数据包的结束。
9.file_exists()
- 该函数可以在不打开文件的前提下,检查一个文件是否存在
10.filesize()
- 该函数以字节为单位返回一个文件的大小。
11.unlink()
- 删除相应的文件。
- 如果无法删除该文件,则函数返回false;同时,如果对该文件的访问权限不够或者该文件不存在,该函数也会返回false。
12.rewind()、fseek()、ftell()
-
rewind()
- 该函数可以将文件指针复位到文件的开始。
-
ftell()
- 该函数可以以字节为单位报告文件指针当前在文件中的位置。
-
fseek()
int feek(resource fp, int offset [, int whence])
- 该函数可以将文件指针fp从whence位置移动offset个字节。
- 其默认值SEEK_SET表示文件的开始处。
- 该参数的其他可能值为SEEK_CUR(文件指针的当前位置)和SEEK_END(文件的结束)
- rewind()函数其实等价于调用一个具有零偏移量的fseek()函数
13.flock()
bool flock(resource fp, int operation [,int & wouldblock])
- 该函数是将文件进行锁定的方法。
- operation的值如下之一:
- LOCK_SH:取得共享锁定(读操作锁定。意味着文件可以共享,其他人可以读该文件)
- LOCK_EX:取得独占锁定(写操作锁定。这是互斥的。该文件不能被共享)
- LOCK_UN:释放锁定(无论共享或独占)
- LOCK_NB:防止在请求加锁时发生阻塞(windows上暂不支持)
- 至于wouldblock值:
- 如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE。(Windows 上暂不支持)
相关词语
1.文件指针:
- 在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。
- 而在PHP中,所谓文件指针个人的理解是类似于我们平时操作文档时鼠标指针的位置,如图所示:
2.定界符:
- 定界符的出现是为了能够在PHP中输入大量文字而不使用转移符。
- 简单来说就是允许程序猿自己定义出了单双引号之外的字符串边界。
- 一般来说在PHP中,我们都是使用
""
或者''
来定义字符串。 - 但是PHP还可以允许程序猿自己定义字符串边界标记
- 使用定界符是以
<<<
开头,来宣告进入定界符模式。 <?php echo<<<EEE 为了能够在PHP中输入大量文字而不是用转义符,人们发明出了定界符。 定界符可能一开始"有点难以理解,学会之后是很有用处的"。 简单来说,'定界符就是允许你自己定义除了单双引号之外的字符串的边界'。 实际使用定界符的时候,要注意字符串的分隔符需要自己单独一行,也就是说,在它前后都不能加空格或tab。 EEE; ?>
- 一般来说在PHP中,我们都是使用
-
特别需要注意!
- 虽然使用定界符之后可以随意使用
""
和''
而不用加转义符,但如果是使用$
依旧需要加转义符"\$"
- 注意字符串的分隔符需要自己单独一行
- 定界符的前后都不能有其他符号或者空格,也就是说开始的EEE这个后面不能有空格或者任意符号,结束的EEE也只能加上个
;
来表示定界符结束。
- 虽然使用定界符之后可以随意使用