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


    利用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>";
    ?>
  • 相关阅读:
    iOS14
    iOS 音量键翻页实现
    pod 相关写法
    js 递归树结构数据查找指定元素的所有父级
    前端实现访问一个图片URL直接下载该图片
    HTML5 drag api 的使用
    vue 组件的 patch
    centos7安装nginx
    nginx常用配置说明
    遍历删除
  • 原文地址:https://www.cnblogs.com/xs-yqz/p/4951214.html
Copyright © 2020-2023  润新知