如何使php文件与html码更好的分离--eval函数的用法_PHP
如何使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 程式结束。
使用范例
$string = '杯子';
$name = '咖啡';
$str = '这个 $string 中装有 $name.
';
echo $str;
eval( "\$str = \"$str\";" );
echo $str;
?>
本例的传回值为
这个 $string 中装有 $name.
这个 杯子 中装有 咖啡.
例子测试没有任何问题.可是,当我测试如下代码时,却出现了错误:
$aa='my name is yyy!';
$str='';
eval( "\$str = \"$str\";" );
echo $str;
?>
百思不得其解后,在chainasp上求救,在网友提出的一系列解决方案
中,终于以这种方式运行成功:
$aa='my name is yyy!';
$str='';
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', '');
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\";" );
?>
可是在页面上显示是这样的:
变量带入成功,可显示不符合要求.察看文件源码,内容如下:
再看看手册的htmlspecialchars()的用法,发现此函数对字串作了如下操作:
& (和) 转成 &
" (双引号) 转成 "
> (大于) 转成 >
再查找,没发现与此函数作用相反的函数,于是,自己加了几行代码,再作如下调试,终于成功.
function dehtml($str){
$str=str_replace('"','"',$str);
$str=str_replace('
$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()函数处理过的字串吧,不知正确与否,有待方家斧正.
以上方法敬请各位网友测试,如果发现有什么错误或者有比这更好的解决方法,请告我一声,我的邮件
地址为:chensiping@263.net

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go 言語は、クロージャとリフレクションという 2 つの動的関数作成テクノロジを提供します。クロージャを使用すると、クロージャ スコープ内の変数にアクセスでき、リフレクションでは FuncOf 関数を使用して新しい関数を作成できます。これらのテクノロジーは、HTTP ルーターのカスタマイズ、高度にカスタマイズ可能なシステムの実装、プラグイン可能なコンポーネントの構築に役立ちます。

C++ 関数の名前付けでは、読みやすさを向上させ、エラーを減らし、リファクタリングを容易にするために、パラメーターの順序を考慮することが重要です。一般的なパラメータの順序規則には、アクション-オブジェクト、オブジェクト-アクション、意味論的な意味、および標準ライブラリへの準拠が含まれます。最適な順序は、関数の目的、パラメーターの種類、潜在的な混乱、および言語規約によって異なります。

効率的で保守しやすい Java 関数を作成するための鍵は、シンプルに保つことです。意味のある名前を付けてください。特殊な状況に対処します。適切な可視性を使用してください。

1. SUM 関数は、列またはセルのグループ内の数値を合計するために使用されます (例: =SUM(A1:J10))。 2. AVERAGE 関数は、列またはセルのグループ内の数値の平均を計算するために使用されます (例: =AVERAGE(A1:A10))。 3. COUNT 関数。列またはセルのグループ内の数値またはテキストの数をカウントするために使用されます。例: =COUNT(A1:A10)。 4. IF 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

C++ 関数のデフォルト パラメーターの利点には、呼び出しの簡素化、可読性の向上、エラーの回避などがあります。欠点は、柔軟性が限られていることと、名前の制限があることです。可変引数パラメーターの利点には、無制限の柔軟性と動的バインディングが含まれます。欠点としては、複雑さの増大、暗黙的な型変換、デバッグの難しさなどが挙げられます。

C++ で参照型を返す関数の利点は次のとおりです。 パフォーマンスの向上: 参照による受け渡しによりオブジェクトのコピーが回避され、メモリと時間が節約されます。直接変更: 呼び出し元は、返された参照オブジェクトを再割り当てせずに直接変更できます。コードの簡素化: 参照渡しによりコードが簡素化され、追加の代入操作は必要ありません。

C++ の例外処理は、特定のエラー メッセージ、コンテキスト情報を提供し、エラーの種類に基づいてカスタム アクションを実行するカスタム例外クラスを通じて強化できます。 std::Exception から継承した例外クラスを定義して、特定のエラー情報を提供します。カスタム例外をスローするには、throw キーワードを使用します。 try-catch ブロックでdynamic_castを使用して、キャッチされた例外をカスタム例外タイプに変換します。実際の場合、open_file 関数は FileNotFoundException 例外をスローします。例外をキャッチして処理すると、より具体的なエラー メッセージが表示されます。

カスタム PHP 関数と定義済み関数の違いは次のとおりです。 スコープ: カスタム関数はその定義のスコープに限定されますが、事前定義関数はスクリプト全体からアクセスできます。定義方法: カスタム関数は function キーワードを使用して定義されますが、事前定義関数は PHP カーネルによって定義されます。パラメータの受け渡し: カスタム関数はパラメータを受け取りますが、事前定義された関数はパラメータを必要としない場合があります。拡張性: カスタム関数は必要に応じて作成できますが、事前定義された関数は組み込みで変更できません。
