入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

如何使PHP文件与HTML代码更好的分离

创建时间:2008-05-01 投稿人: 浏览次数:265
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

大家都知道,PHP是一种服务器端的内嵌HTML式的脚本编程语言。可是按照内嵌HTML方式来作一网站的话,代码很快就变得庞大而且不可控制。如何才能使PHP代码与HTML分离,做出类似dw的lib(模板)而使得页面更加容易修改并且代码容易维护呢?

后来,看了很多文章,说PHPlib可以实现,随手看了几页,觉得头晕脑涨,顿时没有了看下去的欲望。可是问题还得解决,在一次偶然机会,得以下载vbb论坛的源码,粗粗看过之后,发现除了PHP文件外,很少看见HTML码。心想这不就是我想要的样式吗,唯一的收获是知道了它把HTML码放在数据库里,通过PHP文件调用,经过一系列处理后,用eval函数将希望的变量带入生成所需要的动态页。这样,我就没再看vbb源码,而转入eval函数了。PHP中文手册是这样介绍eval函数的:

函式:eval()

杂项函式库

eval

将值代入字串之中。

语法:voideval(stringcode_str);

传回值:无

函式种类:资料处理

内容说明

本函式可将字串之中的变数值代入,通常用在处理资料库的资料上。参数code_str为欲处理的字串。值得注意的是待处理的字串要符合PHP的字串格式,同时在结尾处要有分号。使用本函式处理后的字串会沿续到PHP程式结束。

使用范例


<?PHP
$string="杯子";
$name="咖啡";
$str="这个$string中装有$name.<br>";
echo$str;
eval("/$str=/"$str/";");
echo$str;
?>

本例的传回值为

这个$string中装有$name。

这个杯子中装有咖啡。

例子测试没有任何问题。可是,当我测试如下代码时,却出现了错误:


<?
$aa="mynameisyyy!";
$str="<inputtype="text"name="textfield"value="$aa">";
eval("/$str=/"$str/";");
echo$str;
?>


百思不得其解后,求救,在网友提出的一系列解决方案中,终于以这种方式运行成功:


<?
$aa="mynameisyyy!";
$str="<inputtype="text"name="textfield"value="/"$aa/"">";
eval("/$str=/"$str/";");
echo$str;
?>

可是,当我把$str插入如下一个表中然后又提取出时,又出错了。

数据库evaltest

#表结构"envtest"


CREATETABLEenvtest(
  idtinyint(4)NOTNULLauto_increment,
  sourmediumtext,
  PRIMARYKEY(id),
  UNIQUEid(id),
  KEYid_2(id)
);

#表内容"envtest"


INSERTINTOenvtestVALUES("1","<inputtype=/"text/"name=/"textfield/"value=/"$aa/">");

PHP文件如下:


<?
$aa="my name isyyy!";
$conn=mysql_connect("localhost","root","");
$sele="selectsourfromenvtestwhereid=1";
$res=mysql_db_query("evaltest",$sele);
$arra=mysql_fetch_array($res);
$str=$arra["sour"];
eval("echo /"$str/";");
?>

再看看PHP中文手册,发现这么一句话:“待处理的字串要符合PHP的字串格式”,什么叫“符合PHP的字串格式”(有谁知道,麻烦告诉一声)。我不知道,也无从查找,只好看看字串处理函数。发现HTMLspecialchars()好像可用,于是试了一把:


<?
$aa="my name isyyy!";
$conn=mysql_connect("localhost","root","");
$sele="selectsourfromenvtestwhereid=1";
$res=mysql_db_query("evaltest",$sele);
$arra=mysql_fetch_array($res);
$str=HTMLspecialchars($arra["sour"]);
eval("echo /"$str/";");
?>

可是在页面上显示是这样的:


<inputtype="text"name="textfield"value="my name isyyy!">

变量带入成功,可显示不符合要求.察看文件源码,内容如下:


<inputtype="text"name="textfield"value="my&bspname&bspisyyy!">

再看看手册的HTMLspecialchars()的用法,发现此函数对字串作了如下操作:

&(和)转成&
"(双引号)转成"
<(小于)转成<
>(大于)转成>

再查找,没发现与此函数作用相反的函数,于是,自己加了几行代码,再作如下调试,终于成功。


<?PHP
functiondeHTML($str){
  $str=str_replace(""",""",$str);
  $str=str_replace("<","<",$str);
  $str=str_replace(">",">",$str);
  $str=str_replace("&","&",$str);        
return$str;
}  
$aa="myname isyyy!";
$conn=mysql_connect("localhost","root","");
$sele="selectsourfromenvtestwhereid=1";
$res=mysql_db_query("evaltest",$sele);
$arra=mysql_fetch_array($res);
$str=HTMLSpecialChars($arra["sour"]);
eval("echo deHTML(/"$str/");");
?>

在这个代码调试成功后,我又把一个内容复杂的HTML页面的源码加入一变量后插入到evaltest表中,再次测试,也成功了。

有关eval函数用法里的"待处理的字串要符合PHP的字串格式",我想是经过HTMLSpecialChars()函数处理过的字串吧,不知正确与否,有待方家斧正。

以上方法敬请各位网友测试,如果发现有什么错误或者有比这更好的解决方法,请告我一声。

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。