热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php技术生成静态页面的实现

我们先回顾一些基本的概念。一,PHP脚本与动态页面。PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理。无论以何种方式...
我们先回顾一些基本的概念。

一,PHP脚本与动态页面。

PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式

,以模板的方式对用户请求进行处理。无论以何种方式,它的基本原理是这样的。由客户端提出请求,

请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 

由服务器指定的PHP解析器对脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式

传回给浏览器。由此不难看出,在页面发送到浏览器后,PHP就不存在了,已被转化解析为HTML语句。客

户请求为一动态文件,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回

浏览器。这种页面处理方式被称为"动态页面"。

二,静态页面。

静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。它的处理方式

是。由客户端提出请求,请求某一页面  ----> WEB服务器确认并载入某一页面 ----> WEB服务器将

该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由WEB服

务器的PHP解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成HTML语言信

息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载

能力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器

上必须确实存在该文件。

三,模板及模板解析。

模板即尚未填充内容html文件。例如:

temp.html

Code:

this is a { file } file's templets

PHP处理:

templetest.php

Code:

$title = "拓迈国际测试模板";

$file = "TwoMax Inter test templet,

author:Matrix@Two_Max";

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$content .= str_replace ("{ file }",$file,$content);

$content .= str_replace ("{ title }",$title,$content);

echo $content;

?>

模板解析处理,即将经PHP脚本解析处理后得出的结果填充(content)进模板的处理过程。通常借助

于模板类。目前较流行的模板解析类有 phplib,smarty,fastsmarty等等。模板解析处理的原理通常为

替换。也有些程序员习惯将判断,循环等处理放进模板文件中,用解析类处理,典型应用为block概念,

简单来说即为一个循环处理。由PHP脚本指定循环次数,如何循环代入等,再由模板解析类具体实施这些

操作。

好了,对比过静态页面与动态页面各自的优劣,现在我们就来说说,如何用PHP生成静态文件。

PHP生成静态页面并不是指PHP的动态解析,输出HTML页面,而是指用PHP创建HTML页面。同时因为

HTML的不可写性,我们创建的HTML若有修改,则需删掉重新生成即可。(当然你也可以选择用正则进行修

改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不偿失。)

言归正传。用过PHP文件操作函数的PHP FANS知道,PHP中有一个文件操作函数fopen,即打开文件。

若文件不存在,则尝试创建。这即是PHP可以用来创建HTML文件的理论基础。只要用来存放HTML文件的文

件夹有写权限(即权限定义0777),即可创建文件。(针对UNIX系统而言,Win系统无须考虑。)仍以上例

为例,若我们修改最后一句,并指定在test目录下生成一个名为test.html的静态文件:

Code:

$title = "拓迈国际测试模板";

$file = "TwoMax Inter test templet,

author:Matrix@Two_Max";

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$content .= str_replace ("{ file }",$file,$content);

$content .= str_replace ("{ title }",$title,$content);

// echo $content;

$filename = "test/test.html";

$handle = fopen ($filename,"w"); //打开文件指针,创建文件

/*

检查文件是否被创建且可写

*/

if (!is_writable ($filename)){

die ("文件:".$filename."不可写,请检查其属性后重试!");

}

if (!fwrite ($handle,$content)){ //将信息写入文件

die ("生成文件".$filename."失败!");

}

fclose ($handle); //关闭指针

die ("创建文件".$filename."成功!");

?>

实际应用中常见问题解决方案参考:

一,文章列表问题:

在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据库,对于推荐

文章,只需指向存放静态文件的指定文件夹中的该页面即可。利用PHP操作处理文章列表,存为字符串,

生成页面时替换此字符串即可。如,在页面中放置文章列表的表格加入标记{ articletable },而在PHP

处理文件中:

Code:

$title = "拓迈国际测试模板";

$file = "TwoMax Inter test templet,

author:Matrix@Two_Max";

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$content .= str_replace ("{ file }",$file,$content);

$content .= str_replace ("{ title }",$title,$content);

// 生成列表开始

$list = '';

$sql = "select id,title,filename from article";

$query = mysql_query ($sql);

while ($result = mysql_fetch_array ($query)){

$list .= ''.$result['title'].'

';

}

$content .= str_replace ("{ articletable }",$list,$content);

//生成列表结束

// echo $content;

$filename = "test/test.html";

$handle = fopen ($filename,"w"); //打开文件指针,创建文件

/*

检查文件是否被创建且可写

*/

if (!is_writable ($filename)){

die ("文件:".$filename."不可写,请检查其属性后重试!");

}

if (!fwrite ($handle,$content)){ //将信息写入文件

die ("生成文件".$filename."失败!");

}

fclose ($handle); //关闭指针

die ("创建文件".$filename."成功!");

?>

二,分页问题。

如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询

得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i

取,分析,文章生成,都在此循环中执行。不同的是,die ("创建文件".$filename."成功!";这句去掉

,放到循环后的显示,因为该语句将中止程序执行。例:

Code:

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$Onepage= '20';

$sql = "select id from article where channel='$channelid'";

$query = mysql_query ($sql);

$num = mysql_num_rows ($query);

$allpages = ceil ($num / $onepage);

for ($i = 0;$i<$allpages; $i++){

if ($i == 0){

$indexpath = "index.html";

} else {

$indexpath = "index_".$i."html";

}

$start = $i * $onepage;

$list = &#39;&#39;;

$sql_for_page = "select name,filename,title from article where channel=&#39;$channelid&#39;

limit $start,$onepage";

$query_for_page = mysql_query ($sql_for_page);

while ($result = $query_for_page){

$list .= &#39;&#39;.$title.&#39;

&#39;;

}

$cOntent= str_replace ("{ articletable }",$list,$content);

if (is_file ($indexpath)){

@unlink ($indexpath); //若文件已存在,则删除

}

$handle = fopen ($indexpath,"w"); //打开文件指针,创建文件

/*

检查文件是否被创建且可写

*/

if (!is_writable ($indexpath)){

echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo

}

if (!fwrite ($handle,$content)){ //将信息写入文件

echo "生成文件".$indexpath."失败!"; //修改为echo

}

fclose ($handle); //关闭指针

}

fclose ($fp);

die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");

?>

大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。

在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注意的地方还有

很多。但大致思路即是如此,其它方面可举一反三而得。

用PHP制作静态网站的模板框架

模板能够改善网站的结构。本文阐述如何通过PHP 4的一个新功能和模板类,在由大量静态HTML页面构

成的网站中巧妙地运用模板控制页面布局。

提纲:

===================================

分离功能和布局

避免页面元素重复

静态网站的模板框架

===================================

分离功能和布局

首先我们来看看应用模板的两个主要目的:

* 分离功能(PHP)和布局(HTML)

* 避免页面元素重复

第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP脚本,

同时另一组设计人员设计HTML和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两

组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含PHP代码的文件,无需关心页面的

外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面

的PHP代码。

如果你曾经看过几个关于PHP模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的

页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。这种网站可以拥有如下模板文件

{HEADER}
{LEFTNAV}{CONTENT}


Foo


Bar

可以看出页面如何由这些模板构造而成:main模板控制着整个页面的布局;header模板和leftnav模

板控制着页面的公共元素。花括号"{}"里面的标识符是内容占位符。使用模板最主要的好处在于界面

设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布

局。界面设计者可以用任何普通HTML编辑器或者可视化工具编辑这些页面,因为这些文件都只包含HTML

代码,没有任何PHP代码。

PHP代码全部保存到单独的文件中,这个文件也就是由页面URL实际调用的文件。Web服务器通过PHP引

擎解析该文件,然后把结果返回给浏览器。一般地,PHP代码总是动态地生成页面内容,比如查询数据库

或者执行某种计算等。下面是一个例子:

// example.php

require(&#39;class.FastTemplate.php&#39;);

$tpl = new FastTemplate(&#39;.&#39;);

$tpl->define( array( &#39;main&#39; => &#39;main.htm&#39;,

&#39;header&#39; => &#39;header.htm&#39;,

&#39;leftnav&#39; => &#39;leftnav.htm&#39; ) );

// 此处的PHP代码设置$content使其包含合适的页面内容

$tpl->assign(&#39;CONTENT&#39;, $content);

$tpl->parse(&#39;HEADER&#39;, &#39;header&#39;);

$tpl->parse(&#39;LEFTNAV&#39;, &#39;leftnav&#39;);

$tpl->parse(&#39;MAIN&#39;, &#39;main&#39;);

$tpl->FastPrint(&#39;MAIN&#39;);

?>

这里我们使用的是流行的FastTemplate模板类,但其基本思路对于其他许多模板类来说都一样。首

先你实例化一个类,告诉它到哪里去寻找模板文件以及哪一个模板文件与页面的哪部分对应;接下来是

生成页面内容,把结果赋予内容的标识符;然后,依次解析各个模板文件,模板类将执行必要的替换操

作;最后把解析结果输出到浏览器。

这个文件完全由PHP代码构成,不包含任何HTML代码,这是它最大的优点。现在,PHP程序员可以集

中精力编写生成页面内容的代码,而不必为了如何生成HTML去正确地格式化最终页面而担心。

你可以使用这种方法和上面的文件构造出一个完整的网站。如果PHP代码是以URL中的查询字符串为

基础生成页面内容,例如http://www.foo.com/example.php?article=099,你可以据此构造出一个完整

的杂志网站。

很容易看出采用模板还有第二个好处。如上例所示,页面左边的导航条单独保存为一个文件,我们

只需编辑这一个模板文件就可以改变网站所有页面左边的导航条。

避免页面元素重复

"这确实不错",你也许会想,"我的网站主要就是由大量的静态页面构成。现在我可以从所有页

面中删除它们的公共部分,要更新这些公共部分实在太麻烦了。以后我就可以用模板制作出很容易维护

的统一页面布局。"但事情并非这么简单,"大量的静态页面"道出了问题的所在。

请考虑上面的例子。这个例子实际上只有一个example.php页面,它之所以能够生成整个网站的所

有页面,是因为它利用了URL中的查询字符串从数据库之类的信息源动态地构造出页面。

我们之中的大多数人所运行的网站并不一定都有数据库支持。我们的网站大多数由静态页面构成,

然后用PHP在这里、那里加上一些动态功能,比如搜索引擎、反馈表单等。那么,如何在这种网站上应用

模板呢?

最简单的方法是为每一个页面复制一份PHP文件,然后在每一个页面中把PHP代码里代表内容的变量

设置成合适的页面内容。例如,假设有三个页面,它们分别是主页(home)、关于(about)和产品

(product),我们可以用三个文件分别生成它们。这三个文件的内容都类如:

// home.php

require(&#39;class.FastTemplate.php&#39;);

$tpl = new FastTemplate(&#39;.&#39;);

$tpl->define( array( &#39;main&#39; => &#39;main.htm&#39;,

&#39;header&#39; => &#39;header.htm&#39;,

&#39;leftnav&#39; => &#39;leftnav.htm&#39; ) );

$cOntent= "

欢迎访问

希望你能够喜欢本网站

";

$tpl->assign(&#39;CONTENT&#39;, $content);

$tpl->parse(&#39;HEADER&#39;, &#39;header&#39;);

$tpl->parse(&#39;LEFTNAV&#39;, &#39;leftnav&#39;);

$tpl->parse(&#39;MAIN&#39;, &#39;main&#39;);

$tpl->FastPrint(&#39;MAIN&#39;);

?>

显然,这种方法有三个问题:我们必须为每一个页面复制这些复杂的、牵涉到模板的PHP代码,这

与重复公共页面元素一样使得页面难以维护;现在文件又混合了HTML和PHP代码;为内容变量赋值将变得

非常困难,因为我们必须处理好大量的特殊字符。

解决这个问题的关键就在于分离PHP代码和HTML内容,虽然我们不能从文件中删除所有的HTML内容

,但可以移出绝大多数PHP代码。

静态网站的模板框架

首先,我们象前面一样为所有的页面公用元素以及页面整体布局编写模板文件;然后从所有的页面

删除公共部分,只留下页面内容;接下来再在每个页面中加上三行PHP代码,如下所示:

你好

欢迎访问

希望你能够喜欢本网站


这种方法基本上解决了前面提到的各种问题。现在文件里只有三行PHP代码,而且没有任何一行代码

直接涉及到模板,因此要改动这些代码的可能性极小。此外,由于HTML内容位于PHP标记之外,所以也不

存在特殊字符的处理问题。我们可以很容易地将这三行PHP代码加入到所有静态HTML页面中。

require函数引入了一个PHP文件,这个文件包含了所有必需的与模板相关的PHP代码。其中

pageStart函数设置模板对象以及页面标题,pageFinish函数解析模板然后生成结果发送给浏览器。

这是如何实现的呢?为什么在调用pageFinish函数之前文件中的HTML不会发送给浏览器?答案就在

于PHP 4的一个新功能,这个功能允许把输出到浏览器的内容截获到缓冲区之中。让我们来看看

prepend.php的具体代码:

require(&#39;class.FastTemplate.php&#39;);

function pageStart($title = &#39;&#39;) {

GLOBAL $tpl;

$tpl = new FastTemplate(&#39;.&#39;);

$tpl->define( array( &#39;main&#39; => &#39;main.htm&#39;,

&#39;header&#39; => &#39;header.htm&#39;,

&#39;leftnav&#39;=> &#39;leftnav.htm&#39; ) );

$tpl->assign(&#39;TITLE&#39;, $title);

ob_start();

}

function pageFinish() {

GLOBAL $tpl;

$cOntent= ob_get_contents();

ob_end_clean();

$tpl->assign(&#39;CONTENT&#39;, $content);

$tpl->parse(&#39;HEADER&#39;, &#39;header&#39;);

$tpl->parse(&#39;LEFTNAV&#39;, &#39;leftnav&#39;);

$tpl->parse(&#39;MAIN&#39;, &#39;main&#39;);

$tpl->FastPrint(&#39;MAIN&#39;);

}

?>

pageStart函数首先创建并设置了一个模板实例,然后启用输出缓存。此后,所有来自页面本身的

HTML内容都将进入缓存。pageFinish函数取出缓存中的内容,然后在模板对象中指定这些内容,最后解

析模板并输出完成后的页面。

这就是整个模板框架全部的工作过程了。首先编写包含了网站各个页面公共元素的模板,然后从所

有页面中删除全部公共的页面布局代码,代之以三行永远无需改动的PHP代码;再把FastTemplate类文件

和prepend.php加入到包含路径,这样你就得到了一个页面布局可以集中控制的网站,它有着更好的可靠

性和可维护性,而且网站级的大范围修改也变得相当容易。

本文下载包包含了一个可运行的示例网站,它的代码注释要比前面的代码注释更详细一些。

FastTemplate类可以在http://www.thewebmasters.net/找到,最新的版本号是1.1.0,那里还有一个用

于保证该类在PHP 4中正确运行的小补丁。本文下载代码中的类已经经过该补丁的修正。

PHP简易生成静态页面

/*

* 文件名:index.php

*/

require "conn.php";

$query = "select * from news order by datetime desc";

$result = mysql_query($query);

?>

while($re = mysql_fetch_array($result)){

?>

}

?>

标题发布时间
">
 添加新闻

--------------------------------------------------------------------------

/*

文件名:AddNews.php

简易动态添加生成静态新闻页面

#

# 表的结构 `news`

#

CREATE TABLE `news` (

`newsid` int(11) NOT NULL auto_increment,

`title` varchar(100) NOT NULL default &#39;&#39;,

`content` text NOT NULL,

`datetime` datetime NOT NULL default &#39;0000-00-00 00:00:00&#39;,

KEY `newsid` (`newsid`)

) TYPE=MyISAM AUTO_INCREMENT=11 ;

*/

if(isset($_POST["title"])){

$title = $_POST["title"];

$cOntent= $_POST["content"];

//定义模版文件的内容,可用其它方法

$filecOntent= &#39;

{title}
{content}
{datetime}

&#39;;

$datetime = date("Y-m-d H:i:s");

$query = "insert into news values(&#39;&#39;,&#39;".$title."&#39;,&#39;".$content."&#39;,&#39;".$datetime."&#39;)";

require "conn.php";//连接数据库

$result = mysql_query($query) or die(mysql_error());

if($result){

$id = mysql_insert_id();

$filename = $id.".html";

if($fp = fopen($filename, "w")){//新建文件,成功后添加内容

$filecOntent= str_replace("{title}", $title, $filecontent);

$filecOntent= str_replace("{content}", $content, $filecontent);

$filecOntent= str_replace("{datetime}", $datetime, $filecontent);

if(!fwrite($fp, $filecontent)){//把内容写入文件

$query = "delete from news where newsid=".$id;

$result = mysql_query($query) or die(mysql_error());

fclose($fp);

unlink($filename);

echo "";

exit;

}else {

echo "";

}

}

}

}

?>

标题
内容
 

PHP生成静态页面详解

应用实例:

http://xjtusky.net/down

说明:有一部分功能还没有完全做好,修改中,有兴趣的朋友可以看看下面这篇文章,看

完了一定要说好!生成页面的速度快的~~~呵呵。下面文章中一些地方请自行修改!

PHP生成静态页面详解

http://xjtusky.net/article/htmld ... /article_594_1.html

看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系

统,遂谈些看法,以供各位参考。好了,我们先回顾一些基本的概念。

一,PHP脚本与动态页面。

PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函

数封装等形式,以模板的方式对用户请求进行处理。无论以何种方式,它的基本原理是这

样的。由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理

-----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对脚本进行解析形成H

TML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器。由此不难看出,在

页面发送到浏览器后,PHP就不存在了,已被转化解析为HTML语句。客户请求为一动态文件

,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回浏览器

。这种页面处理方式被称为"动态页面"。

二,静态页面。

静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。

它的处理方式是。由客户端提出请求,请求某一页面 ----> WEB服务器确认并载入某一

页面 ----> WEB服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下

动态页面,即可方现。动态页面需由WEB服务器的PHP解析器进行解析,而且通常还需连接

数据库,进行数据库存取操作,然后才能形成HTML语言信息包;而静态页面,无须解析,

无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能力,大幅提供页

面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必

须确实存在该文件。

三,模板及模板解析。

模板即尚未填充内容html文件。例如:

Code: [点击这里把以下内容复制到剪贴板]

temp.html

this is a {file} file&#39;s templets

PHP处理:

templetest.php

$title = "拓迈国际测试模板";

$file = "TwoMax Inter test templet,
author:Matrix@Two_Max";

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$content .= str_replace ("{file}",$file,$content);

$content .= str_replace ("{title}",$title,$content);

echo $content;

?>

模板解析处理,即将经PHP脚本解析处理后得出的结果填充(content)进模板的处理过

程。通常借助于模板类。目前较流行的模板解析类有phplib,smarty,fastsmarty等等。

模板解析处理的原理通常为替换。也有些程序员习惯将判断,循环等处理放进模板文件中

,用解析类处理,典型应用为block概念,简单来说即为一个循环处理。由PHP脚本指定循

环次数,如何循环代入等,再由模板解析类具体实施这些操作。

好了,对比过静态页面与动态页面各自的优劣,现在我们就来说说,如何用PHP生成静

态文件。

PHP生成静态页面并不是指PHP的动态解析,输出HTML页面,而是指用PHP创建HTML页面

。同时因为HTML的不可写性,我们创建的HTML若有修改,则需删掉重新生成即可。(当然你

也可以选择用正则进行修改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不

偿失。)

言归正传。用过PHP文件操作函数的PHP FANS知道,PHP中有一个文件操作函数fopen,

即打开文件。若文件不存在,则尝试创建。这即是PHP可以用来创建HTML文件的理论基础。

只要用来存放HTML文件的文件夹有写权限(即权限定义0777),即可创建文件。(针对UNIX

系统而言,Win系统无须考虑。)仍以上例为例,若我们修改最后一句,并指定在test目录

下生成一个名为test.html的静态文件:

Code: [点击这里把以下内容复制到剪贴板]

$title = "拓迈国际测试模板";

$file = "TwoMax Inter test templet,
author:Matrix@Two_Max";

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$content .= str_replace ("{file}",$file,$content);

$content .= str_replace ("{title}",$title,$content);

// echo $content;

$filename = "test/test.html";

$handle = fopen ($filename,"w"); //打开文件指针,创建文件

/*

检查文件是否被创建且可写

*/

if (!is_writable ($filename)){

die ("文件:".$filename."不可写,请检查其属性后重试!");

}

if (!fwrite ($handle,$content)){ //将信息写入文件

die ("生成文件".$filename."失败!");

}

fclose ($handle); //关闭指针

die ("创建文件".$filename."成功!");

?>

实际应用中常见问题解决方案参考:

一,文章列表问题:

在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据

库,对于推荐文章,只需指向存放静态文件的指定文件夹中的该页面即可。利用PHP操作处

理文章列表,存为字符串,生成页面时替换此字符串即可。如,在页面中放置文章列表的

表格加入标记{articletable},而在PHP处理文件中:

Code: [点击这里把以下内容复制到剪贴板]

$title = "拓迈国际测试模板";

$file = "TwoMax Inter test templet,
author:Matrix@Two_Max";

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$content .= str_replace ("{file}",$file,$content);

$content .= str_replace ("{title}",$title,$content);

// 生成列表开始

$list = &#39;&#39;;

$sql = "select id,title,filename from article";

$query = mysql_query ($sql);

while ($result = mysql_fetch_array ($query)){

$list .= &#39;&#39;.$result[

&#39;title&#39;].&#39;
&#39;;

}

$content .= str_replace ("{articletable}",$list,$content);

//生成列表结束

// echo $content;

$filename = "test/test.html";

$handle = fopen ($filename,"w"); //打开文件指针,创建文件

/*

检查文件是否被创建且可写

*/

if (!is_writable ($filename)){

die ("文件:".$filename."不可写,请检查其属性后重试!");

}

if (!fwrite ($handle,$content)){ //将信息写入文件

die ("生成文件".$filename."失败!");

}

fclose ($handle); //关闭指针

die ("创建文件".$filename."成功!");

?>

二,分页问题。

如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先

我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i

lpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,die (

"创建文件".$filename."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序

执行。例:

Code: [点击这里把以下内容复制到剪贴板]

$fp = fopen ("temp.html","r");

$cOntent= fread ($fp,filesize ("temp.html"));

$Onepage= &#39;20&#39;;

$sql = "select id from article where channel=&#39;$channelid&#39;";

$query = mysql_query ($sql);

$num = mysql_num_rows ($query);

$allpages = ceil ($num / $onepage);

for ($i = 0;$i<$allpages; $i++){

if ($i == 0){

$indexpath = "index.html";

} else {

$indexpath = "index_".$i."html";

}

$start = $i * $onepage;

$list = &#39;&#39;;

$sql_for_page = "select name,filename,title from article where channel=&#39;

$channelid&#39; limit $start,$onepage";

$query_for_page = mysql_query ($sql_for_page);

while ($result = $query_for_page){

$list .= &#39;&#39;.$titl

e.&#39;
&#39;;

}

$cOntent= str_replace ("{articletable}",$list,$content);

if (is_file ($indexpath)){

@unlink ($indexpath); //若文件已存在,则删除

}

$handle = fopen ($indexpath,"w"); //打开文件指针,创建文件

/*

检查文件是否被创建且可写

*/

if (!is_writable ($indexpath)){

echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo

}

if (!fwrite ($handle,$content)){ //将信息写入文件

echo "生成文件".$indexpath."失败!"; //修改为echo

}

fclose ($handle); //关闭指针

}

fclose ($fp);

die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");

?>

大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在

页面中加入。

在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注

意的地方还有很多。但大致思路即是如此,其它方面可举一反三而得。

目前网络上好多网站的新闻发布系统都采用了 动态服务器技术生成静态HTML的做法,这样做的好处是:一是能减轻其服务器的负担,二是因为生成了HTML静态页面,所以其网站被搜索引擎搜索到的机率 更大一些。笔者的网站曾经使用PHP这一动态技术来构建新闻发布系统,其原理也就是应用了PHP生成HTML静态页面的技术,相关平台是 Windows XP Sp2+php4.32+mysql,因此,在这里,想简单地谈一下这种做法的思路。这篇文章适合于对PHP+MYSQL数据库操作,SQL语句以及网页 设计有点基础的朋友,如果您是一个从头开始学的朋友,那么请先打好基础吧!到这里就不用往下看了。如果您都符合上述条件的话,那么恭喜您,请接着往下看。 但是,在具体动手构建之前,您还要做好以下几点准备工作。

一、 具备本地调试PHP的功能

在WINDOWS XP操作系统下,笔者建议你可以到网上下载一个PHP+MYSQL+APHCHE的服务器套装,如华军软件园,去那里搜索一下就可以下载到。下载完后默认 安装即可,这样您就具备了在本地测试PHP的功能了,省去了很多手动配置的麻烦,怎么样,简单吧,OK,这仅仅只是第一步。

二、 构思新闻发布系统所具备的功能

首页的新闻发布往往是通过后台更新的,后台的更新无非是由添加、编辑、删除数据等基本的功能所实现的。在这里,你可以使用网页设计软件来构建你的想 要的后台界面,其功能的实现当然是要用到PHP喽。这一步建议您先想好新闻发布系统要有的功能。在这里,如何用PHP添加、编辑、删除数据就不再重复,因 为重点是如何在这基础上生成静态技术。

三、 PHP生成HTML的技术原理。

哈哈。费话说了那么多,终于到了该讲的地方了。其实,这一原理并不复杂,综合地来讲的话,应该是PHP中一个替换数据语法的应用。OK,讲一个简单 范例吧,一步一步地分析!相信聪明的你能看得明白的咯,仔细看好每一步即可,在这里,只是引导大家如何做而已,具体的可以实践一下!

(1)在MYSQL里新建一数据库,命名为 database (可自定义),新建一表,命名为 news(因为是新闻发布嘛,取个好记的名字即可,可自定义),然后建立这几个字段名:

id (自动递增,这是关键,类型:INT)

title (顾名思义,新闻标题,类型可取 TEXT)

content (新闻内容,类型可取 TEXT)

path (HTML文件路径,类型可取 TEXT)

(2)建立 conn.php

这是连接数据库的PHP文件,你可以把连接数据的语句单独放在这一文件里,以后多个需要连接数据库的文件直接引用这个文件即可。

(3)设计添加新闻的表格 add.form 简单的源代码如下:

//提交至 add.php

新闻标题:

新闻内容:

(4)建立一个 HTML 的模板,另存为model.htm,和 add.php可以在同一目录下。

示例源代码:

此新闻的标题:{title}

此新闻的内容:{content}

{ }大括号内的内容即是要被替换的内容,整个静态模板的设计可以根据自己的思路,但{ }内被替换的内容必须包含在内,如上面的{title},{content};咔咔~简单地说,设计好一个很好看的新闻模板后,把要被替换的如 {title},{content}等标记放到需要的地方就可以了撒。

(5)详解 add.php 源码

require_once("conn.php"); //引用conn.php,连接数据库

$title=$_POST["title"];

$cOntent=$_POST["content"]; //获得表单变量

//以下建立一文本文档,其值自动计数

$countfile="count.txt";

if(!file_exists($countfile))

{

fopen($countfile,"w"); //如果此文件不存在,则自动建立一个

}

$fp=fopen($countfile,"r");

$num=fgets($fp,20);

$num=$num+1; //每次其值自动加一

fclose($fp);

$fp=fopen($countfile,"w");

fwrite($fp,$num); //更新其值

fclose($fp);

//利用上面自动计数的值获得HTML的路径$path

$houzui=".html";

$path=$num.$houzui;

//这样形成的路径是自动增长的,如1.html,2.html,3.html……….添加一条新闻便自动加上1

//以下用SQL语句添加数据至表 news

$sql="insert into news (title,content,path) values (‘".$title."’,’".$content."’,’".$path."’)";

$query=mysql_query($sql);

//以下为关键之处,把从表单获得的数据替换模板中的{title},{content}标记 $fp=fopen("model.htm","r") //只读打开模板

$str=fread($fp,filesize("mode.htm"));//读取模板中内容

$str=str_replace("{title}",$title,$str);

$str=str_replace("{content}",$content,$str);//替换内容

fclose($fp);

$handle=fopen($path,"w"); //写入方式打开新闻路径

fwrite($handle,$str); //把刚才替换的内容写进生成的HTML文件

fclose($handle);

//收尾工作:

echo "查看刚才添加的新闻";

?>

OK,整个生成HTML的示例源码就到这里,其关键是用了替换的方法。

$str=str_replace("{被替换的内容}",$替换的内容,$str);

因此,总结一下以上的做法:先设计好新闻模板,把需要被替换的内容用{ }放到模板中相应的位置,然后设计表单,再是最后的表单处理程序,把从表单中获取的变量替换模板中相应的内容即可,这样每次都会生成不同的HTML;如果 需要修改HTML的内容也是一样的,获得修改后的表单内容后,先用 update 语句更新数据库,再重新替换一下模板中的内容即可;删除的话,先delete表中要删除的内容,再用unlink($path) 来删除HTML的物理文件即可。


本文地址:

转载随意,但请附上文章地址:-)

推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
tantyana428_673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有