如何使php文件與html碼更好的分離 ------eval函數的用法 大家都知道,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; ?> 百思不得其解后,在chainasp上求救,在網友提出的一系列解決方案 中,終于以這種方式運行成功: <? $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='mynameis 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='mynameis 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="mynameis 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 nameis 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( "echodehtml(\"$str\");" ); ?> 在這個代碼調試成功后,我又把一個內容復雜的html頁面的源碼加入一變量后插入到evaltest表中, 再次測試,也成功了. 有關eval函數用法里的"待處理的字串要符合 PHP 的字串格式",我想是經過 HTMLSpecialChars()函數處理過的字串吧,不知正確與否,有待方家斧正.
以上方法敬請各位網友測試,如果發現有什么錯誤或者有比這更好的解決方法,請告我一聲,我的郵件 地址為:chensiping@263.net
|