如何使PHP檔案與HTML代碼更好的分離?

來源:互聯網
上載者:User

 大家都知道,php是一種伺服器端的內嵌html式的指令碼程式設計語言.可是按照內嵌html方式來作一網站的話,代碼很快就變得龐大而且不可控制.如何才能使php代碼與html分離,做出類似dw的lib(模板)而使得頁面更加容易修改並且代碼容易維護呢?

  後來,看了很多文章,說phplib可以實現,隨手看了幾頁,覺得頭暈腦漲,頓時沒有了看下去的慾望(那位大蝦如果有此心得,敬請不吝賜教,先行謝過!).可是問題還得解決,在鬱悶了多日之後,一次偶然機會,得以下載vbb論壇的源碼,粗粗看過之後,發現除了php檔案外,很少看見html碼.心想這不就是我想要的樣式嗎,看吧.依然頭暈腦漲:(,唯一的收穫是知道了它把html碼放在資料庫裡,通過php檔案調用,經過一系列處理後,用eval函數將希望的變數帶入產生所需要的動態網頁.這樣,我就沒再看vbb源碼,而轉入eval函數了.php中文手冊是這樣介紹eval函數的:

  函式:eval()

  雜項函式庫

  eval

  將值代入字串之中。

  文法: void eval(string code_str);

  傳回值: 無

  函式種類: 資料處理

  內容說明

  本函式可將字串之中的變數值代入,通常用在處理資料庫的資料上。參數 code_str

  為欲處理的字串。值得注意的是待處理的字串要符合 PHP 的字串格式,同時在結尾

  處要有分號。使用本函式處理後的字串會沿續到 PHP 程式結束。

  使用範例

<?php
$string = '杯子';
$name = '咖啡';
$str = '這個 $string 中裝有 $name.<br>';
echo $str;
eval( "$str = "$str";" );
echo $str;
?>
本例的傳回值為

  這個 $string 中裝有 $name.

這個 杯子 中裝有 咖啡.

  例子測試沒有任何問題.可是,當我測試如下代碼時,卻出現了錯誤:

<?
$aa='my name is yyy!';
$str='<input type="text" name="textfield" value="$aa">';
eval( "$str = "$str";" );
echo $str;
?>

  百思不得其解後,求救,在網友提出的一系列解決方案中,終於以這種方式運行成功:

<?
$aa='my name is yyy!';
$str='<input type="text" name="textfield" value="'$aa'">';
eval( "$str = "$str";" );
echo $str;
?>
可是,當我把$str 插入如下一個表中然後又提取出時,又出錯了,簡直惱火

  死了.

  資料庫 evaltest

  # 表結構 'envtest'

CREATE TABLE envtest (
id tinyint(4) NOT NULL auto_increment,
sour mediumtext,
PRIMARY KEY (id),
UNIQUE id (id),
KEY id_2 (id)
);
#表內容 'envtest'

  INSERT INTO envtest VALUES( '1', '<input type="text" name="textfield" value="$aa">');

  php檔案如下:

<?
$aa='my name is yyy!';
$conn=mysql_connect('localhost','root','');
$sele='select sour from envtest where id=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 is yyy!';
$conn=mysql_connect('localhost','root','');
$sele='select sour from envtest where id=1';
$res=mysql_db_query('evaltest',$sele);
$arra=mysql_fetch_array($res);
$str=htmlspecialchars($arra['sour']);
eval( "echo "$str";" );
?>
可是在頁面上顯示是這樣的:

  <input type="text" name="textfield" value="my name is yyy!">

  變數帶入成功,可顯示不符合要求.察看檔案源碼,內容如下:

  <input type="text" name="textfield" value="my &bsp name &bsp is yyy!">

  再看看手冊的htmlspecialchars()的用法,發現此函數對字串作了如下操作:

  & (和) 轉成 &

  " (雙引號) 轉成 "

  < (小於) 轉成 <

  > (大於) 轉成 >

  再尋找,沒發現與此函數作用相反的函數,於是,自己加了幾行代碼,再作如下調試,終於成功.

<?php
function dehtml($str){
$str=str_replace('"','"',$str);
$str=str_replace('<','<',$str);
$str=str_replace('>','>',$str);
$str=str_replace('&','&',$str);    
return $str;
} 
$aa='my name is yyy!';
$conn=mysql_connect('localhost','root','');
$sele='select sour from envtest where id=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()函數處理過的字串吧,不知正確與否,有待方家斧正.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.