文章教程

11.2.9实现BLOG归档显示的功能

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

11.2.9 实现BLOG归档显示的功能

BLOG系统通常会提供按年月归档显示日志的功能,本BLOG系统也将实现这一功能。该功能会将某年某月下的所有日志文章列出,方便用户按时间查看每天的日志文章。

浏览归档显示的日志文章,不需要用户登录。向浏览归档日志文章程序传入的参数是一个年月值字符串,程序根据该值找到日志所在目录,从而获取日志文章的文件内容,然后将文件内容显示到Web界面上。代码11-12是该程序的实现,程序命名为archives.php,如下所示。

代码11-12 归档显示日志文章的程序archives.php


01 <?php

02 $ok=false;

03

04 if(!isset($_GET['ym'])||empty($_GET['ym']))//请求参数中的目录信息

05 {

06 $ok=true;

07 $msg='请求参数错误;<a href="index.php">返回首页</a>';

08 }

09

10 $folder_array=array();//归档目录后的所有目录存在此数组中

11 $dir='contents';

12 $folder=$_GET['ym'];

13 if(!is_dir($dir.'/'.$folder))//找到contents目录下的所有归档目录

14 {

15 $ok=true;

16 $msg='请求参数错误;<a href="index.php">返回首页</a>';

17 }

18

19 $dh=opendir($dir);//打开目录

20 if($dh)

21 {

22 $filename=readdir($dh);//读取指定目录下的所有目录

23 while($filename)

24 {

25 if($filename!='.'&&$filename!='..')

26 {

27 $folder_name=$filename;

28 array_push($folder_array,$folder_name);

29 }

30 $filename=readdir($dh);

31 }

32 }

33 rsort($folder_array);//对目录进行排序

34

35 $post_data=array();

36 $dh=opendir($dir.'/'.$folder);

37

38 while(($filename=readdir($dh))!==FALSE)

39 {

40 if(is_file($dir.'/'.$folder.'/'.$filename))

41 {

42 $file=$filename;

43 $file_name=$dir.'/'.$folder.'/'.$file;

44

45 if(file_exists($file_name))//判断文件是否存在

46 {

47 $fp=@fopen($file_name,'r');

48 if($fp)

49 {

50 flock($fp,LOCK_SH);

51 $result=fread($fp,filesize($file_name));//读取文件

52 }

53 flock($fp,LOCK_UN);

54 fclose($fp);

55 }

56 $temp_data=array();

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

58 //以下是文件中的3个日志信息

59 $temp_data['SUBJECT']=$content_array[0];//读取标题

60 $temp_data['DATE']=date('Y-m-d H:i:s',$content_array[1]);//读取日期

61 $temp_data['CONTENT']=$content_array[2];//读取内容

62 array_push($post_data,$temp_data);

63 }

64 }

65 ?>

66

67 <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"

68 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

69 <html>

70 <head>

71 <title>基于文本的简易BLOG</title>

72 <link rel="stylesheet"type="text/css"href="style.css"/>

73 </head>

74 <body>

75

76 <div id="container">

77 <div id="header">

78 <h1>我的BLOG</h1>

79 </div>

80 <div id="title">

81 ----I have dream……

82 </div>

83 <div id="left">

84 <?php

85 if($ok==false)

86 {

87 foreach($post_data as$post)

88 {

89 ?>

90 <div id="blog_entry">

91 <div id="blog_title"><?echo$post['SUBJECT'];?></div>

92 <div id="blog_body">

93 <div id="blog_date"><?echo$post['DATE'];?></div>

94 <?php echo$post['CONTENT'];?>

95 </div><!--blog_body-->

96 </div><!--blog_entry-->

97 <?php}

98 }

99 else{

100 echo$msg;

101 }

102 ?>

103 </div>

104

105 <div id="right">

106 <div id="sidebar">

107 <div id="menu_title">关于我</div>

108 <div id="menu_body">

109 我是个PHP爱好者

110 <br/><br/>

111 <a href="login.php">登录</a>

112 </div>

113 </div>

114 <br/>

115 <div id="sidebar">

116 <div id="menu_title">日志归档</div>

117 <?php foreach($folder_array as$ym)

118 {

119 $entry=$ym;

120 $ym=substr($ym,0,4).'-'.substr($ym,4,2);

121 echo'<div id="menu_body"><a href="archives.php?ym='.$entry.'">'.$ym.'</a></div>';

122 }

123 ?>

124 </div>

125 </div>

126

127 <div id="footer">

128 CopyRight 2011

129 </div>

130 </div>

131

132 <body>

133 </html>

134 <?php close($dh);?>


【代码解析】archives.php首先判断是否传入参数ym,该参数的值类似于201112,表示日志的归档年月。如果没有传入该参数,程序将提示错误信息,如代码第4~8行所示;如果传入的参数值没有其对应的目录,也会提示错误信息,如代码第10~17行所示。

接着,程序会在对应年月的目录下找出日志文章所在文件,这是一个循环查找的过程,如代码第38~64行所示。程序会判断当前文件是目录还是普通文件,如代码第40行所示。如果是普通文件,程序将打开该文件并读取文件内容,存入数组当中。如果不是普通文件,则继续循环查找当前目录下的文件,直到找出所有普通文件(及日志文章所在文件)为止。从BLOG首页可以访问archives.php,结果如图11-17所示。

图 11-17 按年月归档显示日志内容

教程类别