制作生成静态页面的新闻系统

利用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>";
?>
原文地址:https://www.cnblogs.com/xs-yqz/p/4951214.html