利用PHP生成静态HTML页面的好处很多:
1.静态页面不需要Web服务器解释执行,用户打开网页的速度会快些;
2.打开静态页面时,Web服务器不需要访问数据库,减轻了对数据库访问的压力;
3.静态HTML页面对搜索引擎更加友好,使网站在搜索引擎中的排名能够上升。
原理:利用fopen()方法创建文本文件,再用fwrite()方法向文件中写入符合HTML格式的字符串。
因此,用户在后台添加一条新闻后,PHP程序一方面将这条新闻作为一条记录添加到数据库中;另一方面根据这条新闻创建一个静态的HTML页面。
创建HTML页面的过程:首先制作一个新闻页面的模板,然后将这条新闻的各个字段替换掉模板页中的标志内容。最后将替换后的模板页用fwrite()方法写入到创建的文件中。
1.数据库的设计
CREATE TABLE `news` ( id INT PRIMARY KEY AUTO_INCREMENT , title VARCHAR( 30 ) , content TEXT, author VARCHAR( 200 ) , TIME DATETIME, bigclass VARCHAR( 200 ) , filepath VARCHAR( 100 ) ) ENGINE = INNODB DEFAULT CHARSET = utf8
可以看出,与普通的news表相比,生成静态页面的新闻系统主要多了一个filepath字段,用于将生成的HTML文件的文件名和路径名保存到news表中,便于在新闻表页能建立到这些HTML文件的链接。
2.新闻模板页的制作
在数据库中再建一个表moban,用来保存模板页的HTML代码,之所以要将模板页的代码保存到数据库中,是为了方便能够通过新闻系统后台对模板页的代码进行修改,还能在MOBAN表中保存多个模板页,让用户从后台发布新闻时可以选择任意一套模板。
CREATE TABLE `moban` (
id INT PRIMARY KEY AUTO_INCREMENT ,
html TEXT
) ENGINE = INNODB DEFAULT CHARSET = utf8
新闻添加页面的程序制作
1.制作新闻添加的前台页面addnews.php
<?php /* * * @Authors peng--jun * @Email 1098325951@qq.com * @Date 2015-11-11 13:24:24 * @Link http://www.cnblogs.com/xs-yqz/ * @version $Id$ ========================================== */ header("Content-type: text/html; charset=UTF-8"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加页面</title> </head> <body> <h2 align="center">添加新闻页面</h2> <form action="add.php" method="post"> <table> <tr> <td width="125">新闻标题:</td> <td width="475"><input type="text" name="title"></td> </tr> <tr> <td width="125">发布者:</td> <td width="475"><input type="text" name="author"></td> </tr> <tr> <td width="125">所属栏目:</td> <td width="475"><input type="text" name="lanmu"></td> </tr> <tr> <td width="125">新闻内容:</td> <td width="475"><textarea name="content" id="" cols="30" rows="3"></textarea></td> </tr> <tr> <td width="125"></td> <td width="475"><input type="submit" name="submit" value="提交"></td> </tr> </table> </form> </body> </html>
2.保存新闻到news表的程序(add.php)
<?php /* * * @Authors peng--jun * @Email 1098325951@qq.com * @Date 2015-11-11 13:30:53 * @Link http://www.cnblogs.com/xs-yqz/ * @version $Id$ ========================================== */ header("Content-type: text/html; charset=UTF-8"); require("include/conn.php"); $title=$_POST["title"]; $author = $_POST["author"]; $lanmu = $_POST["lanmu"]; $content = $_POST["content"]; date_default_timezone_set('PRC'); $time = date("Y-m-d H:i:s"); //创建存放当天静态HTML文件 $root = $_SERVER['DOCUMENT_ROOT']; $foldername = date("Y-m-d"); $folderpath = "list/".$foldername;//目录形式2015-11-11 if(!file_exists($folderpath)) //如果该目录不存在 mkdir($folderpath);//创建该目录 //用时间创建HTML文件的文件名 $filename = date("H-i-s").".html"; $filepath = $folderpath."/".$filename; if (!file_exists($filepath)) { //从模板中读取模板代码 $sql = "select html from moban where id = 1"; $rs = mysql_query($sql,$conn)or die("执行错误".mysql_error()); $rows = mysql_fetch_row($rs); $moban = $rows[0]; //将模板页代码保存到$moban //替换模板页中相应的标识符 $moban = str_replace("-lanmu-", $lanmu, $moban); $moban = str_replace("-title-", $title, $moban); $moban = str_replace("-time-", $time, $moban); $moban = str_replace("-content-", $content, $moban); $moban = str_replace("-author-", $author, $moban); $fp = fopen($filepath, "w"); fwrite($fp, $moban);//将替换好的内容写入发到文件中 fclose($fp); $filepath = $foldername."/".$filename;//保存生成的HTML文件的路径 $sql = "insert into news(bigclass,title,content,filepath,author,time)values( '$lanmu','$title','$content','$filepath','$author','$time')"; if (mysql_query($sql)) { echo "插入成功"; }else{ echo "<script>alert('添加失败');location.href='addnews.php';</script>"; } } ?>
3.新闻管理后台系统admin.php
<?php /* * * @Authors peng--jun * @Email 1098325951@qq.com * @Date 2015-11-11 15:13:39 * @Link http://www.cnblogs.com/xs-yqz/ * @version $Id$ ========================================== */ header("Content-type: text/html; charset=UTF-8"); require("include/conn.php"); $sql = "select * from news order by id desc"; $rs = mysql_query($sql,$conn)or die("数据库操作失败".mysql_errno()); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>新闻后台管理系统</title> </head> <body> <h2 align="center">新闻后台管理系统</h2> <p align="right"><a href="addnews.php">添加新闻</a></p> <table border="1"> <thead> <tr> <th>ID</th> <th>新闻标题</th> <th>发布者</th> <th>发布时间</th> <th>操作</th> </tr> </thead> <tbody> <?php while ( $rows = mysql_fetch_assoc($rs)) { ?> <tr> <td rowspan="2"><?= $rows['id']?></td> <td><a href="list/<?= $rows['filepath']?>"><?= $rows['title']?></a></td> <td><?= $rows['author']?></td> <td><?= $rows['time']?></td> <td rowspan="2"> <a href="editnews.php?id=<?= $rows['id']?>">编辑</a> <a href="del.php?id=<?= $rows['id']?>">删除</a> </td> </tr> <tr><td colspan="3" align="center">内容:<?= $rows['content']?></td></tr> <?php } ?> </tbody> </table> </body> </html>
该程序每条新闻的标题都是连接到生成的静态HTML文件的URL上($row['filepath']保存了静态文件的URL地址),这样用户才能通过链接打开这些HTML文件。
4.新闻修改页面的制作
(1)获取admin.php页传过来的ID值,根据ID读取原来的记录,显示在该页的表单中供用户修改。
(2)当用户提交修改页面之后,使用用户提交的信息更新news表中对应的记录。
(3)使用用户提交的信息替换模板页中的相应字符,再重新生成同名的HTML文件。
<?php /* * * @Authors peng--jun * @Email 1098325951@qq.com * @Date 2015-11-11 15:54:50 * @Link http://www.cnblogs.com/xs-yqz/ * @version $Id$ ========================================== */ header("Content-type: text/html; charset=UTF-8"); require("include/conn.php"); $id = $_GET["id"];//获取当前文件的id if ($_POST["submit"]) { $title=$_POST["title"]; $author = $_POST["author"]; $lanmu = $_POST["lanmu"]; $content = $_POST["content"]; $path = $_POST['path']; $time = $_POST["time"]; //创建存放当天静态HTML文件 $root = $_SERVER['DOCUMENT_ROOT']; $filepath = "list/$path"; if (file_exists($filepath)) { //从模板中读取模板代码 $sql = "select html from moban where id = 1"; $rs = mysql_query($sql,$conn)or die("执行错误".mysql_error()); $rows = mysql_fetch_row($rs); $moban = $rows[0]; //将模板页代码保存到$moban //替换模板页中相应的标识符 echo $moban; $moban = str_replace("-lanmu-", $lanmu, $moban); $moban = str_replace("-title-", $title, $moban); $moban = str_replace("-time-", $time, $moban); $moban = str_replace("-content-", $content, $moban); $moban = str_replace("-author-", $author, $moban); $fp = fopen($filepath, "w"); fwrite($fp, $moban);//将替换好的内容写入发到文件中 fclose($fp); $sql = "update `news` set bigclass = '$lanmu',title = '$title',content ='$content' ,author = '$author' where id = $id"; if (mysql_query($sql)) { echo "<script>alert('修改成功');location.href='admin.php'</script>"; }else{ echo "<script>alert('修改失败');location.href='addnews.php';</script>"; } } } $sql = "select * from news where id = $id"; $result = mysql_query($sql)or die("操作数据库失败".mysql_errno()); $rows = mysql_fetch_assoc($result); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>新闻修改页面</title> </head> <body> <h3>新闻修改页面</h3> <form action="?id=<?= $rows['id']?>" method="post"> <table> <tr> <td width="125">新闻标题:</td> <td width="475"><input type="text" name="title" value="<?= $rows['title']?>"></td> </tr> <tr> <td width="125">发布者:</td> <td width="475"><input type="text" name="author" value="<?= $rows['author']?>"></td> </tr> <tr> <td width="125">所属栏目:</td> <td width="475"><input type="text" name="lanmu" value="<?= $rows['lanmu']?>"></td> </tr> <tr> <td width="125">新闻内容:</td> <td width="475"><textarea name="content" id="" cols="30" rows="3"><?= $rows['content']?></textarea></td> </tr> <tr> <td> <input type="hidden" name="time" value="<?= $rows['time']?>"> </td> <td> <input type="hidden" name="path" value="<?= $rows['filepath']?>"> </td> </tr> <tr> <td width="125"></td> <td width="475"><input type="submit" name="submit" value="提交"></td> </tr> </table> </form> </body> </html>
5.页面的删除系统del.php
该页面的删除也分为两个部分,其一是将这条新闻的记录从news表中删除;其二是删除该新闻对应的静态HTML文件,这是必要的,否则浏览者还可以通过直接输入html文件的URL访问到该新闻页面。
<?php /* * * @Authors peng--jun * @Email 1098325951@qq.com * @Date 2015-11-11 16:41:58 * @Link http://www.cnblogs.com/xs-yqz/ * @version $Id$ ========================================== */ header("Content-type: text/html; charset=UTF-8"); require("include/conn.php"); $id=$_GET["id"]; $sql="select * from news where id=$id"; $rs=mysql_query($sql); $rows=mysql_fetch_assoc($rs); $path=$rows["filepath"]; //找到待删除新闻对应的静态html文件的url $root=$_SERVER['DOCUMENT_ROOT']; $filepath="list/".$path; if(file_exists($filepath)) unlink($filepath); //删除静态html文件 $path=substr($path,0,10); //找到为存放静态html文件而创建的目录 $folderpath="list/$path"; $folder=opendir($folderpath); //打开该目录 $n=0; while($f=readdir($folder)) { if($f<>"."&&$f<>"..") //如果目录中还有其他文件 $n++; } closedir(); if($n==0) //目录中已经没有任何文件 rmdir($folderpath); //删除该目录 $sql="delete from news where id=$id"; //删除数据表中的记录 if(mysql_query($sql)) echo "<script language=javascript>alert('删除成功!');window.location='admin.php'</script>"; else echo "<script language=javascript>alert('操作错误!');window.location='admin.php'</script>"; ?>