文章教程

11.2.2实现BLOG文章的显示

9/17/2020 9:26:54 PM 人评论 次浏览

11.2.2 实现BLOG文章的显示

这一小节将实现从文件中读取日志内容,并将其显示在页面上。

(1)为了能将日志内容显示到页面,首先建立了一个文本文件,在该文件里存储一些日志数据,文件的内容如下所示。


测试日志标题|1322862787|这是一段日志的测试文字,一切无误的话,它应该正确显示。


这段内容各项以“|”分割,从左向右依次表示日志的标题、发布该日志的日期时间(以UNIX时间戳表示)、日志的实际内容。目前还没有实现添加日志文章的功能,所以先手工建立一个目录及日志内容文件,以便显示日志内容的程序可以读取该文件。将该文件以名称02-215307.txt存储到BLOG系统contents目录的201112目录下。这样的文件命名和目录命名的含义在上一小节已经阐述过,测试时,读者可以自行指定目录和文件名。

(2)接下来,编写PHP程序读出文件的内容,并向浏览器输出。代码11-1是实现读取文件中日志内容并显示日志内容的程序,将其命名为post.php。

代码11-1 读文件并显示日志内容post.php


01 <?php

02 $file_name='contents/201112/02-215307.txt';//存储日志内容的文件

03

04 if(file_exists($file_name))//打开文件前需要判断文件是否存在

05 {

06 $fp=@fopen($file_name,'r');//以只读方式打开文件

07 if($fp)

08 {

09 flock($fp,LOCK_SH);//文件加锁

10 $result=fread($fp,1024);//读出文件的内容,并以字符串形式赋给变量$result

11 }

12 flock($fp,LOCK_UN);//解锁文件

13 fclose($fp);

14 }

15

16 //将字符串$result的内容按“|”分割后存入数组$content_array

17 $content_array=explode('|',$result);

18

19 //以下代码将日志内容输出至浏览器

20 echo'<h1>我的BLOG</h1>';

21 echo'<b>日志标题:</b>'.$content_array[0];

22 echo'<br/><b>发布时间:</b>'.date('Y-m-d H:i:s',$content_array[1]);

23 echo'<hr>';

24 echo$content_array[2];

25 ?>


【代码解析】这段代码第2行首先打开指定目录下的文本文件contents/201112/02-215307.txt,该文件保存了某天某时刻的日志内容。读出文件内容后,将其赋给变量$result,此时变量$result的值为“测试日志标题|1322862787|这是一段日志的测试文字,一切无误的话,它应该正确显示。”,接着程序第17行使用函数explode()将该字符串按竖线“|”做分割,分割后的3个部分分别是:日志的标题、发布日志的时间和日志的实际内容,然后程序将这3项内容存入数组$content_array,作为其单元的值。最后使用echo语句,将数组的内容输出,即将日志内容输出至页面。代码11-1的执行结果如图11-3所示。

图 11-3 显示日志内容的简易界面

注意 文件中存储的时间是一个UNIX时间戳1322862787,程序中使用函数date()将这个时间戳格式化为普通时间格式后输出。如果读者已经对时间戳没有印象,可参考第7.2节。

(3)在代码11-1中,只能读取2011年12月2日某时刻的日志文件,这肯定是不能满足实际需要的。显示BLOG内容的程序应该能够访问每一天的日志文件,这可以通过URL向程序传入参数实现,不同的参数值代表不同的日期时间,程序根据这个参数值的不同,完成访问不同目录下的日志文件,并获取该文件中的数据。比如,传入参数entry=201112-02-215307表示访问目录201112下的02-215307.txt文件。从这个参数可以看出,它的值实际反映出日志路径。代码11-2是使用了URL传入参数的post.php。

代码11-2 处理由URL传入的字符串参数post.php


01 <?php

02 if(!isset($_GET['entry']))

03 {

04 echo'请求参数错误';

05 exit;

06 }

07

08 $path=substr($_GET['entry'],0,6);//日志存储目录

09 $entry=substr($_GET['entry'],7,9);//日志文件名称

10

11 $file_name='contents/'.$path.'/'.$entry.'.txt';//拼接出完整的日志路径

12

13 if(file_exists($file_name))//打开文件前需要判断文件是否存在

14 {

15 $fp=@fopen($file_name,'r');//以只读方式打开文件

16 if($fp)

17 {

18 flock($fp,LOCK_SH);//文件加锁

19 $result=fread($fp,1024);//读出文件中的内容

20 }

21 flock($fp,LOCK_UN);//解锁文件

22 fclose($fp);

23 }

24

25 //将字符串$result的内容按“|”分割后存入数组$content_array

26 $content_array=explode('|',$result);

27

28 //以下代码将日志内容输出

29 echo'<h1>我的BLOG</h1>';

30 echo'<b>日志标题:</b>'.$content_array[0];

31 echo'<br/><b>发布时间:</b>'.date('Y-m-d H:i:s',$content_array[1]);

32 echo'<hr>';

33 echo$content_array[2];

34 ?>


【代码解析】URL中entry参数的值存放在PHP的预定义变量$_GET中。在代码11-2中,第2~6行首先判断是否传入了参数entry,如果通过GET方法没有得到URL参数entry,程序会输出一个提示信息,告知用户请求参数错误。如果得到了参数entry,程序会通过函数substr()将该参数的值分割,分别分割成日志的存储目录和日志文件名。字符串201112-02-215307的前6位代表的是日志的存储目录,因此通过代码第8行的substr($_GET['entry'],0,6)可以得到日志的存储目录,同理,代码第9行中substr($_GET['entry'],7,9)获取的是日志文件名。通过浏览器,访问修改后的post.php,将看到和图11-3完全一样的结果。

提示 如果读者对函数substr()的用法有遗忘,可以参阅5.5节的内容。

至此,从文件中获取BLOG内容的基本功能已完全实现。

教程类别