资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,PHP,动态网站程序设计,(,第,2,版,),唐四薪 主编,人民邮电出版社,ISBN,:,978-7-115-50524-8 2020,年,3,月,第,6,章,PHP,文件访问技术,6.1,文件访问技术,PHP,可对服务器端的文件或文件夹进行操作,对文件的操作包括创建文本文件、写入文本文件、读取文本文件等。,对文件夹的操作包括创建、复制、移动或删除文件夹等,6.1,文件访问函数,PHP,对文件操作的一般流程是:,打开文件;,读取或写入文件;,关闭文件,6.1.1,打开文件,fopen(),函数用来打开文件。其语法格式为:,fopen(string filename,string mode),文件路径或,URL,网址,打开方式:,r,只读,w,写入,a,追加写入,例子,$file=fopen(c:datainfo.txt,r);$file=fopen(r);$file=fopen(ftp:/user:password w);,$file=fopen(/home/rasmus/file.txt,r);,/,以二进制写入方式打开,unix,系统目录下的,file.gif,文件,$file=fopen(/home/rasmus/file.gif,wb);?,fopen(),函数参数,mode,的可选值,r,以只读方式打开,如果文件不存在将出错,w,以写入方式打开,将文件指针指向文件头部,并删除文件内容,如果文件不存在则创建文件,a,以追加写入方式打开,将文件指针指向文件末尾,如果文件不存在则创建文件,r+,以读写方式(先读后写)打开,将文件指针指向文件头部。,w+,以读写方式(先写后读)打开,将文件指针指向文件头部,并删除文件内容,a+,以追加读写方式打开,将文件指针指向文件末尾。,x,以只写方式创建并打开文件,并将文件指针指向文件头。如果指定文件存在,就会打开失败,x+,以读写方式创建并打开文件,并将文件指针指向文件头。如果指定文件存在,就会打开失败,b,以二进制模式打开,可与,r,、,w,、,a,合用。,关闭文件,文件内容读写结束后,必须关闭文件,fclose($file);/,关闭,$file,指向的文件,6.1.2,读取文件,fread(),读取整个文件或文件中指定长度的字符串,可用于二进制文件读取,fgets(),读取文件中的一行字符,fgetss(),读取文件中的一行字符,并去掉所有,HTML,和,PHP,标记,fgetc(),读取文件中的一个字符,file_get_contents(),将文件读入字符串,file(),把文件读入到一个数组中,readfile(),读取一个文件,并输出到输出缓冲,1.fread(),函数,fread(),可读取指定长度的文件内容,string fread(resource handle,int length),示例程序,2.fgets(),函数,fgets(),用来读取文本文件中的一行,string fgets(resource handle,int length),示例程序,判断文件指针是否已到达文件末尾,3.fgetss(),函数,fgetss(),函数,:,从文件指针处读取一行的数据,类似于,fgets(),差别在于,fgetss(),函数会删除文件内的,HTML,和,PHP,标记。,4.fgetc(),函数,fgetc(),函数用来从文件指针处读取一个字符,5.file_get_contents(),函数,无须经过打开文件及关闭文件操作就可读取文件中的全部内容,示例程序,6.file(),函数,读取整个文件并将其保存到一个数组中,数组中每个数组元素对应文档中的一行,该函数还可用于读取二进制文件,6.1.3,移动文件指针,移动文件指针到文件的开头,bool,rewind,(resource handle),返回文件指针的当前位置,int,ftell,(resource handle),移动文件指针到指定位置,int,fseek,(resource handle,int offset,int origin),6-3.php,0,文件开头,1,当前位置,2,文件末尾,6.1.4,文本文件的写入,1.fwrite(),函数,可以将一个字符串写入到文本文件中,int fwrite(resource handle,string string,int length),文本文件的追加写入,如果希望在写入后再读取文件中的内容,可以采用可读写的方式写入,?$fp=fopen(new.txt,w+);,fwrite($fp,这是写入的一行话,nr);,rewind($fp);,$str=fread($fp,20);,追加写入,2.file_put_contents,函数,无须经过打开文件及关闭文件的操作就可将字符串写入文件,int file_put_contents(string filename,string data,int mode),例如,读写文件的应用,制作计数器,1.,用文件实现计数器,2.,对计数器设置防刷新功能,3.,用文件及图像实现计数器,6.2,文件及目录的基本操作,6.2.1,复制、移动和删除文件,copy(),copy(,源文件,目的文件,),复制文件,unlink(),unlink(,目标文件,),删除文件,rename(),rename(,旧文件名,新文件名,),重命名文件或目录,或移动文件,ftruncate(),ftruncate(,目标文件资源,截取长度,),将文件截断到指定长度,file_exists(),file_exists(,目标文件名,),判断文件或文件夹是否存在,is_file(),is_file(,文件名,),判断指定的路径存在且为文件,示例程序,说明,rename(),函数既可重命名文件,也可移动文件,复制、移动文件操作都不能自动创建文件夹,因此应保证当前目录下,data,文件夹存在,才能运行该程序,6.2.2,获取文件属性,filesize(),只读,返回文件的大小,$fsize=filesize(tang.txt),filetype(),只读,返回文件的类型,如文件或文件夹。,filetype(tang.txt),,返回,file,filectime(),返回文件创建时间的时间戳,date(Y-m-d H:i:s,filectime(6-10.php),filemtime(),只读,返回文件的修改时间,realpath(),返回文件的物理路径,realpath(6-10.php),pathinfo(),以数组形式返回文件的路径和文件名信息,print_r(pathinfo(6-10.php),dirname(),返回文件相对于当前文件的路径信息,dirname(6-10.php),,返回“,.”,basename(),返回文件的文件名信息,basename(6-10.php),示例程序,6.2.3,目录的基本操作,函数名,说明,示例,mkdir(pathname),新建一个指定的目录,mkdir(temp),rmdir(dirname),删除目录,该目录必须为空,rmdir(data),getcwd(void),取得当前文件所在的目录,echo getcwd();,chdir(dirname),改变当前目录,chdir(./);,opendir(path),打开目录,返回目录的指针,$dirh=opendir(temp),closedir(),关闭目录,参数为目录指针,closedir($dirh);,readdir(),遍历目录,$file=readdir($dirh),scandir(path,sort),以数组形式遍历目录,,sort,参数可设置升序或降序排列,$arr=scandir(D:App,1);,print_r($arr);,rewinddir(),将目录指针重置到目录开头处,即倒回目录开头,rewinddir($dirh),1.,遍历目录,opendir(),用于打开指定的目录,打开成功后返回值为指向该目录的指针。,readdir(),用于读取已经打开的目录,其参数为,opendir,返回的目录指针。,closedir(),用于关闭已经打开的目录,其参数为,opendir,返回的目录指针,它没有返回值。,rewinddir(),用于将目录指针重新指向目录开头,以便重新读取目录中的内容,其参数为,opendir,返回的目录指针,2.,创建、删除和改变目录,创建目录前先要判断该目录是否已存在,删除目录先要判断目录是否不存在,if(!file_exists(temp)mkdir(temp);/,在当前目录下创建,temp,目录,else echo,该目录已存在,不能创建,;,if(file_exists(data)rmdir(data);/,在当前目录下删除,data,目录,else echo,该目录不存在,不能删除,;echo getcwd();/,输出当前所在目录,3.,复制和移动目录,PHP,没有提供这方面的内置函数,自定义函数:首先创建一个目标目录,此时该目录为空,然后对源目录进行遍历,如果遇到的是普通文件,则直接用,copy,函数复制到目标目录中,如果遍历时遇到一个子目录,则必须建立该目录,再对该目录下的文件进行复制操作,6.2.4,统计目录和磁盘大小,filesize(),函数:计算文件的大小,统计磁盘的大小可以使用,disk_free_space(),和,disk_total_space(),6.3,制作生成静态页面的新闻系统,生成静态,HTML,页面的好处,静态,HTML,页面不需要服务器端进行解释,用户打开页面的速度会快些,打开静态页面时,Web,服务器不需要访问数据库,减轻了对数据库服务器访问的压力;,静态,HTML,页面对搜索引擎更加友好,使网站在搜索引擎中的排名能够上升,生成静态,HTML,页面的原理,利用,fopen,(),方法,创建文本文件,再用,fwrite,(),方法向文件中写入符合,HTML,格式的字符串,用户在后台添加一条新闻后,,PHP,程序一方面将这条新闻作为一条记录添加到数据表中;,另一方面将该条新闻根据模板页生成一个静态,HTML,文件,并存放在网站的相应目录下。,为了以后能够修改这条新闻,之所以要使用模板页,是因为如果完全用,WriteLine(),方法将,HTML,代码一行一行写入到文本文件中代码量太大,6.3.1,数据库设计,用于存放所有新闻的,news,表结构,字段名,字段类型,说明,id,int(,自动递增,),新闻的编号,title,varchar,新闻的标题,content,TEXT,新闻的内容,author,varchar,发布者,time,datetime,发布时间,bigclass,varchar,新闻所属栏目,filepath,varchar,新闻对应的静态页面文件的路径,新闻模板页的制作,$mtitle$,$mtitle$,发布者:,$mauthor$,$mcontent$,(,发布时间:,$mtime$,),字段名,字段类型,说明,id,int(,自动递增,),模板的编号,html,TEXT,模板的,html,代码,保存模板页的,moban,表结构,连接数据库,conn.php,6.3.2,新闻添加页面和程序的制作,1.,制作新闻添加的前台页面,addnews.php,替换模板页并生成,html,文件的程序,add.php,6.3.3,新闻后台管理页面的制作,除了能发布新闻外,一个完整的新闻系统还应具有新闻修改和新闻删除的功能。为此,需要先制作一个新闻后台管理页面(,admin.php,),该页面用来显示所有新闻的列表,,并能链接到新闻静态页面,,还提供了“编辑”和“删除”的链接供用户执行修改或删除操作,6.3.4,新闻修改页面的制作,程序(,editform.php,)一方面更新这条新闻在,news,表中的对应记录,另一方面还要重新生成同名的,html,文件,这样会自动覆盖原来的,html,文件。,6.3.5,新闻删除页面的制作,该页面的功能也是分为两部分,其一是将这条新闻对应的记录从,news,表中删除;其二是删除该新闻对应的静态,HTML,文件,这是必要的,否则浏览者还可以通过直接输入,html,文件的,URL,访问到该新闻。,6.3.6,网站首页和栏目首页的静态化,可以使用,file_get_contents(),函数将,PHP,文件的执行结果读入到一个字符串变量中,file_get_contents(),函数的语法如下:,string file_get_contents(string$url),6.4,利用,FSO,生成,RSS,文件,利用,FSO,生成,RSS,文件,利用文件系统组件,FSO,能生成任何文本文件,包括,XML,文件,虽然,XML,文件不能直接显示在网页上,但却能实现与其他网站之间共享数据,例如,RSS,应用,8.4.1 XML,语法概述,XML,(,eXtensible Markup Language,)称为可扩展标记语言,由,W3C,定义,它是一种用于描述数据含义的标记语言,适用于不同的应用程序之间交换数据,XML,被设计用来传输和存储数据,具有良好的跨平台性。,XML,的标记不是预先定义好的,我们可以自己定义,XML,中的标记,而,HTML,语言中的标记是预先定义好的,一段,XML,代码,Everyday Italian,2005,30.00,XML,声明,XML,仅仅用来创建一种结构,存储和传输信息,,XML,只是一种“材料”,而非“工具”,XML,文档的基本规范,必须有,XML,声明语句,声明位于,XML,文档的第一行,所有的,XML,元素必须有一个结束标记;,XML,标记是大小写敏感的;,XML,文档必须有且只有一个根元素;,XML,元素必须正确嵌套;,属性值必须用引号引起来;,XML,文档中的注释符和,HTML,文档的注释符相同,也是,CDATA,的语法,CDATA,全称是,Character Data,,中文意思是字符数据。,XML,解析器不会对,CDATA,段中的内容做任何分析处理(,CDATA,段类似于,HTML,中的,标记),85:A ,提示:“,”,的各个字符之间不能有空格符。,CDATA,段中不可以嵌套另一个,CDATA,段,6.4.2 RSS,概述,RSS,(,Really Simple Syndication,,真正简单的聚合),,RSS,的用途,网站只要提供一个,RSS,文件,这个,RSS,文件中包含的信息就能供其他网站使用,Ajax,技术调用,普通用户在,RSS,订阅器中输入,RSS,文件的,URL,地址,就可以不用打开网站,也知道网站内容更新了什么。,典型的,RSS,文件,W3Schools Home Page,Free web building tutorials,RSS Tutorial,RSS tutorial on W3Schools,XML Tutorial,XML tutorial on W3Schools,RSS,文件的主要元素,(,1,),rss,:该元素是整个,RSS,文档的根元素,并可用来声明,RSS,的版本号;,(,2,),channel,:它用来定义网站的频道,即栏目,因此网站的一个栏目就对应一个,channel,。,(,3,),item,:用于显示,RSS,中每条新闻、文章或消息的元素。而,item,元素对应一条新闻,因此一个,channel,标记中可包含许多个,item,标记。,channel,标记内的元素及说明,元素名称,说明,元素名称,说明,title,频道的名称,pubDate,频道的创建日期,link,频道的链接地址,lastBuildDate,频道的最后修改日期,description,对频道的描述信息,image,频道中的图像信息,item,标记内的元素及说明,元素名称,说明,元素名称,说明,title,新闻的标题,comments,评论新闻的相关信息,link,新闻的链接地址,guid,新闻的唯一的标识,description,新闻内容的简单描述,pubDate,新闻的发布日期,author,编辑新闻的作者,source,新闻的来源,category,新闻的类别,enclosure,用于导入媒体文件,6.4.3,用,PHP,直接输出,RSS,文档,读取数据库中最新的几条新闻记录,然后把记录中相应字段的内容分别输出到,RSS,文档的,标记下的,、,、,和,等标记中,6.4.4,用,FSO,组件生成静态,RSS,文档,建立一个字符串变量,str,,把,rss,文档的头部代码保存到该字符串中;,创建记录集,把记录集中的字段放在,rss,文档的相应标记中形成字符串,再把这些字符串追加到,str,变量中;,把,rss,文档的尾部代码也追加到,str,变量中,这样,str,变量就保存了一篇完整的,rss,文档代码;,使用,fso,组件创建,rss.xml,文档;,使用,WriteLine,方法将,str,变量的内容写入到,rss.xml,中,习题,1.,下列哪个函数可以用来打开或创建一个文件,A.open B.fopenC.fwriteD.write,2.fopen,函数的哪个参数值表示打开一个文件进行读取并写入,A.wB.rC.w+D.r+,3.,如果要从文本文件中读取一个单独的行,应使用,,如果要读取二进制数据文件,应使用,A.fgets,fseekB.fread,fgetsC.fgets,fgetssD.fgets,fread,习题,4.file(),函数返回的数据类型是,A.,数组,B.,字符串,C.,整型,D.,根据文件而定,5.PHP,中删除文件的函数是,A.rmB.delC.unlinkD.drop,6.PHP,中用来获取当前目录的函数是,A.cdB.chdirC.rmdirD.getcwd,7.,使用,fopen,函数刚打开一个文件时,文件指针指向,A.,文件开头,B.,文件末尾,C.,文件中间,D.,根据该函数参数而定,习题,8.,使用,fopen,函数时,打开文件的基本模式有,、,、,。,9.,函数将文件指针移动到文件开头;,函数可检测文件指针是否到达了文件末尾的位置。,10.rename(),函数除了可以重命名文件或目录外,还有,功能。,11.,若要列出一个目录中的所有文件和子目录,可以使用,函数或,函数。,12.,在,PHP,中,读取文件内容有哪四种方式?,13.fopen(),函数访问文件模式中的“,w+”,和“,a+,有什么区别?,14.,如果知道一个网页的网址(如,
展开阅读全文