这是本人根据自己学习PHP技术页面静态化的过程所写的学习笔记,希望能够对大家有所帮助。
1、基本思想
(1)当我们添加或者更新新闻的时候,同步的创建或更新html页面,解决实时性问题,将生成的html文件的路径放在数据库;
(2)设计一个模版文件,通过模版创建静态页面;
(3)以后每次直接访问html静态页面;
2、数据库沿用上面的数据库结构,数据最好清空
3、代码
news_list.php(新闻列表页面)
<?php
//新闻列表
//查询数据库,获取信息=>SqlHelper.class.php
$conn = mysql_connect("localhost", "root", "root");
if (!$conn) {
die("连接失败");
}
mysql_select_db("static_pages_news", $conn);
mysql_query("set names utf8");
$sql = "select * from news order by id";
$res = mysql_query($sql);
header("content-type:text/html;charset=utf-8");
echo "<h1>新闻列表</h1>";
echo "<a href='add_news.html'>添加新闻</a><hr/>";
echo "<table>";
echo "<tr><td>id</td><td>标题</td><td>查看新闻</td><td>修改新闻</td></tr>";
while ($row = mysql_fetch_assoc($res)) {
echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href='newsfile/news_id{$row['id']}.html'>查看详情</a></td><td><a href='update_newsui.php?id={$row['id']}'>修改详情</a></td></tr>";
}
echo "</table>";
mysql_free_result($res);
mysql_close($conn);
?>
add_news.html(添加新闻页面)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>添加新闻</title>
</head>
<body>
<form action="newsAction.php" method="post">
<table>
<tr>
<td>新闻标题</td>
<td><input type="text" name="title" /></td>
</tr>
<tr>
<td>新闻内容</td>
<td><textarea cols="50" rows="10" name="content"></textarea></td>
</tr>
<tr>
<td><input type="submit" value="添加" /></td>
<td><input type="reset" value="重新填写" /></td>
<!--隐藏域-->
<input type="hidden" name="oper" value="add" />
</tr>
</table>
</form>
</body>
</html>
update_newsui.php(修改新闻页面)
<?php
//接受要修改的新闻的ID
$id = $_GET['id'];
//通过id从数据库中获取新闻信息
$conn = mysql_connect("localhost", "root", "root");
if (!$conn) {
die("连接失败");
}
mysql_select_db("static_pages_news", $conn);
mysql_query("set names utf8");
$sql = "select * from news where id = $id";
$res = mysql_query($sql);
if ($row = mysql_fetch_assoc($res)) {
echo "<form action='newsAction.php' method='post'>";
echo "<input type='hidden' name='oper' value='update'/>";
echo "<input type='text' name='id' value={$row['id']} readonly/><br/>";
echo "<input type='text' name='title' value={$row['title']} /><br/>";
echo "<textarea cols='50' rows='10' name='content'>{$row['content']}</textarea><br/>";
echo "<input type='submit' value='修改'>";
echo "<input type='reset' value='重置'><br/>";
echo "<form action='newsAction.php' method='post'>";
}else {
echo "您所查看的新闻不存在";
}
?>
newsAction.php(添加、修改新闻请求处理页面)
<?php
//处理添加、修改、删除新闻请求
//接收一下操作类型
$oper = $_REQUEST['oper'];
//接受title和content
$title = $_POST['title'];
$content = $_POST['content'];
//检查存放静态页面的文件夹是否存在,若不存在则创建
if (!file_exists("./newsfile/")) {
mkdir("newsfile");
}
//打开数据库
$conn = mysql_connect("localhost", "root", "root");
if (!$conn) {
die("连接失败");
}
mysql_select_db("static_pages_news", $conn);
mysql_query("set names utf8");
//根据接受的参数来确定操作
if ($oper == 'add') {
//把数据放入数据库,同时创建静态页面
//添加到数据库中
//开始事务
mysql_query("BEGIN");
$sql = "insert into news(title, content) values('$title', '$content')";
if (mysql_query($sql)) {
//获取刚刚插入数据的ID号
$id = mysql_insert_id();
//构建文件名
$html_filename = "newsfile/news_id". $id .".html";
//创建HTML文件
createHTML($html_filename, $title, $content);
//将静态页面的路径放入数据库
$sql = "update news set filename='$html_filename' where id = '$id'";
if (mysql_query($sql)) {
//事务提交
mysql_query("COMMIT");
echo "添加到数据库并成功创建html文件<a href='news_list.php'>返回列表</a>";
}else {
//事务回滚
mysql_query("ROLLBACK");
}
header("Location:news_list.php");
}else {
//事务回滚
mysql_query("ROLLBACK");
}
}else if ($oper == 'update') {
//接收修改的id
$id = $_POST['id'];
//开始事务
mysql_query("BEGIN");
$sql = "update news set title='$title', content='$content' where id=$id";
if (mysql_query($sql)) {
//修改数据库成功
$html_filename = "newsfile/news_id". $id .".html";
unlink($html_filename);
//创建HTML文件
createHTML($html_filename, $title, $content);
//事务提交
mysql_query("COMMIT");
echo "更新到数据库并重新创建html文件<a href='news_list.php'>返回列表</a>";
}
}
//关闭数据库
mysql_close($conn);
/**
* 替换函数
*/
function replace($row, $title, $content) {
$row = str_replace("%title%", $title, $row);
$row = str_replace("%content%", $content, $row);
return $row;
}
/**
* 创建HTML文件
*/
function createHTML($file, $title, $content) {
//创建HTML文件
$fp_tmp = fopen("template.tpl", "r");
$fp_html_file = fopen($file, "w");
//逐行读取模版,替换内容,写入静态页面
while (!feof($fp_tmp)) {
$row = fgets($fp_tmp);
//替换内容
$new_row = replace($row, $title, $content);
//把替换后的内容写进静态页面
fputs($fp_html_file, $new_row);
}
//关闭文件
fclose($fp_tmp);
fclose($fp_html_file);
}
?>
template.tpl(新闻展示页面的模版)
<!-- 这是一个模版文件,根据你希望显示的样式来设计 -->
<html>
<head>
<!--%title%是一个占位符-->
<title>%title%</title>
<meta http-equiv='Cache-Control' content='no-cache'/>
<meta http-equiv='Expires' content='-1'/>
<meta http-equiv='Pragma' content='no-cache'/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>%title%</h1>
<hr />
<pre>%content%</pre>
<pre><a href='../news_list.php'>返回列表</a></pre>
</body>
</html>