﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava--随笔分类-php</title><link>http://www2.blogjava.net/jackstudio/category/12649.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 19:49:44 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 19:49:44 GMT</pubDate><ttl>60</ttl><item><title>字符串中的变量调用</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 15 Dec 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/87964.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/87964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/87964.html</trackback:ping><description><![CDATA[[PHP][Basic]字符串中的变量调用 <br />描述<br />单引号：无法在单引号中调用到变量值。 <br />双引号：当用双引号或者定界符指定字符串时，其中的变量会被解析。 <br />如果遇到美元符号（$），解析器会尽可能多地取得后面的字符以组成一个合法的变量名；如果想明示指定名字的结束，用花括号把变量名括起来。 <br />复杂（花括号{}）语法可以在字符串中包含任何在名字空间的值：仅仅用和在字符串之外同样的方法写一个表达式，然后用 { 和 } 把它包含进来。 <br />因为不能转义“{”，花括号语法仅在$紧跟在 { 后面时被识别（用“{\$”或者“\{$”来得到一个字面上的“{$”）。 <br />花括号语法同样也可以解析数组索引或者对象属性：对于数组索引，右方括号（]）标志着索引的结束。对象属性则和简单变量适用同样的规则。 <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">php <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">* <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />* description: 字符串中的变量解析示例 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />* @author Sandy Lee <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 简单变量调用 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$fruit</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">apple</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">We have an $food</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt;We have an apple) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">We have some ${food}s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt;We have some apples) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">We have some {$food}s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt;We have some apples) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />// 数组调用 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$fruits</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">strawberry</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">red</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">banana</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">yellow</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is $fruits[banana].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt;A banana is yellow.) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is {$fruits['banana']}.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt;A banana is yellow.) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is {$fruits[banana]}.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt;A banana is yellow.)        </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is $fruits['banana'].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt; wrong!) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$arr</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">arr: {$arr['a']['a2']}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; arr: a-2) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />// 类的调用 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> foo <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$foo</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$arr</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> foo() <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    { <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">foo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Foo</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">arr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    } <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />} <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$c</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> foo(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo: $c-&gt;foo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; foo: Foo) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo: {$c-&gt;foo}s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; foo: Foos) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo arr: {$c-&gt;arr['a']['a2']}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; foo arr: a-2) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.blogjava.net/jackstudio/aggbug/87964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-15 15:52 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP截取中文字符串，UTF-8、GBK</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Dec 2006 21:11:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/86638.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/86638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/86638.html</trackback:ping><description><![CDATA[ function substring($str, $start, $len) {<br />    $tmpstr = "";<br />    $strlen = $start + $len;<br />    for($i = 0; $i &lt; $strlen; $i++) {<br />        if(ord(substr($str, $i, 1)) &gt; 0xa0) {<br />            $tmpstr .= substr($str, $i, 2);<br />            $i++;<br />        } else<br />            $tmpstr .= substr($str, $i, 1);<br />    }<br />    return $tmpstr;<br />}<img src ="http://www.blogjava.net/jackstudio/aggbug/86638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-10 05:11 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP连接MySQL出现乱码的一些个人看法</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Dec 2006 21:08:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/86637.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/86637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/86637.html</trackback:ping><description><![CDATA[
		<table height="30" cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td class="hjj22">转载：<a href="http://www.52net.com/html/2006/0428/63042.html">http://www.52net.com/html/2006/0428/63042.html</a><br />作者：不祥<br /><br /><br />PHP连接MySQL的过程中如果出现乱码很多人会说，用"Set names '??'"就能解决问题，但很多时候还是会出现各种怪现象，比如说页面能正常存取，但是phpmyadmin不能正常存取等现象。小弟经过验证，产生了一些个人看法，欢迎大家讨论和指正。<br /><br />MySQL数据库操作过程中出现了三种字符集：<br />1、页面字符集（也就是 content="TEXT/HTML; CHARSET=GBK"）<br />2、连接字符集（也就是 "Set names 'GBK'"）<br />3、字段字符集（无论是库还是表的字符集，将最终反映到字段上）<br />一、实验：<br />1、情况一<br />数据库字段字符集：utf-8<br />连接字符集：没有显式设置，默认为latin1<br />页面字符集：gbk<br /><br />存入过程：<br />1)页面用GBK表示的SQL向服务器提交存入请求；<br />2)默认情况下（不用Set Names '??'）服务器用latin1打开连接；<br />3)服务器误认为当前的SQL语句是用latin1表示的；<br />4)服务器将GBK字符当作latin1字符，错误的运用“latin1转UTF-8函数”将字符转换后存入UTF-8字段中；<br />5)（ 错误的latin1(其实是GBK) =&gt; 错误的UTF-8）<br />6)如果用phpmyadmin打开该表（用utf8连接）将会看到该字段为乱码；<br /><br />读取过程：<br />1)默认情况下（不用Set Names '??'）服务器用latin1打开连接；<br />2)服务器将UTF-8字段中的值转换为latin1返回给客户端；<br />3)（错误的UTF-8 =&gt; 错误的latin1(其实是GBK)）该过程为存入过程5的逆过程。（刚好错错得对了）<br />4)将服务器误认为是latin1的GBK编码按页面字符集正常显示；<br /><br />用示意图来表示就是：<br /><br /><!--c1--><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   存入过程：<br />   ----------------------<br />   页面    连接     存储<br />   ----------------------<br />   GBK =&gt; latin1 =&gt; utf-8<br />          ---------------<br />   ------------- |<br />         |       +------- 该过程得到的utf-8是一串不知所云的乱码，但MySQL固执的认为这串码为UTF-8<br />         |<br />         +------ MySQL将GBK误认为是latin1<br /><br />   读取过程：<br />   ----------------------<br />   页面    连接     存储<br />   ----------------------<br />   GBK &lt;= latin1 &lt;= utf-8<br />          ---------------<br />   ------------- |<br />         |       +------- 正是这串乱码经过逆过程转换回正确的GBK编码，只是MySQL认为是latin1而已<br />         |<br />         +------ MySQL将误认为是latin1的GBK编码传回了页面，刚好得到正确的编码。<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2-->2、情况二<br />数据库字段字符集：utf-8<br />连接字符集：gbk<br />页面字符集：gbk<br /><br />文字描述略。<br /><br /><br />示意图:<br /><br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   存入过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK =&gt; GBK =&gt; utf-8<br />          ------------<br />   ------------- |<br />         |       +------- 该过程得到的utf-8是由GBK转换而来的，是正确的utf-8编码<br />         |<br />         +------ 页面字符集等于连接字符集，MySQL认为页面传递给它的是GBK编码，它的想法正好符合事实。<br /><br /><br />   读取过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK &lt;= GBK &lt;= utf-8<br />              ---------------<br />   ------------- |<br />         |       +------- 用“utf-8转GBK函数”将正确的utf-8编码转换回GBK<br />         |<br />         +------ 页面字符集等于连接字符集，显示没有任何问题。<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br />3、情况三<br />数据库字段字符集：gbk<br />连接字符集：没有显式设置，默认为latin1<br />页面字符集：gbk<br /><br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   存入过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK =&gt; latin1 =&gt; GBK<br />          ------------<br />   ------------- |<br />         |       +------- 字符被“latin1转GBK函数”转换的成了乱码，但MySQL认为它是GBK，所以工具无法正常显示。<br />         |<br />         +------ MySQL认为页面传递给它的是latin1编码，它将在后续过程中画蛇添足地将正确的GBK转换为乱码。<br /><br /><br />   读取过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK &lt;= latin1 &lt;= GBK<br />          ---------------<br />   ------------- |<br />         |       +------- “GBK转latin1函数”将乱码转换为GBK，但MySQL却认为它们是latin1<br />         |<br />         +------ 错误的latin1编码其实是正确的GBK编码，页面显示正常，但工具显示不正常。<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br /><br />二、字符集之间的转换<br />笔者试着将GBK字符误当作latin1转换为错误的utf-8能成功，逆过程中将乱码转换回latin1得到的刚好是正确的GBK<br /><br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   $str = "中文测试";<br />   $str_tran = iconv('latin1', 'utf-8', $str);<br />   echo $str_tran; // 显示乱码，既不是GBK也不是utf-8和latin1<br /><br /><br />   echo "&lt;br&gt;-----------&lt;br&gt;";<br /><br /><br />   $str_re_tran = iconv('utf-8', 'latin1', $str_tran);<br />   echo $str_re_tran;  // 显示 “中文测试”<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br /><br />而将GBK字符误当作utf-8转换为错误的GBK编码则出现错误<br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   $str = "中文测试";<br />   #$str_tran = iconv('utf-8', 'gbk', $str);    // 错误！！！<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br /><br />可见一种编码是否能被当作另一种编码被转换为第三种编码，取决于编码的固有属性，上面我们举的第一个例子只是碰巧GBK编码能被误当作latin1被转换为utf-8。如果是如下情况，则数据库肯定不能正常存取数据。<br />GBK =&gt; utf-8 =&gt; GBK（未实验）<br />三、结论<br />页面能正常存取但phpmyadmin不能正常存取，从严格意义上来说应该是一种错误，页面是否能正常存取取决于连接字符集是否能正常的被转换为存储字符集。<br />要保证页面能正常存取，并且工具也能正常使用，一般保持页面字符集等于或兼容连接字符集就可以了。</span></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jackstudio/aggbug/86637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-10 05:08 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分页类,调用很简单. ........</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 26 Oct 2006 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/77425.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/77425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/77425.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: asp-----																Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->						  1												&lt;						% 						  2														...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/77425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-26 16:27 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smarty的程序设计部分</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Tue, 05 Sep 2006 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/67864.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/67864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/67864.html</trackback:ping><description><![CDATA[
		<font color="#0000bb">smarty的程序设计部分：</font>
		<p>
				<font color="#0000bb">在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍，这一节主要来介绍一下如何在smarty中开始我们程</font>
		</p>
		<p>
				<font color="#0000bb">序设计。</font>
		</p>
		<font color="#0000bb">
				<p>
						<br />PHP代码: <br />    首先来介绍一下在上一节中我们使用的过的.php文件中的一些元素。同样，我们拿上一节中最开始的那个index.php文件来说明一下： <br />     <br />   ================================================ <br />     index.php <br />   ================================================ <br />   &lt;?php <br />     /********************************************* <br />      * <br />      * 文件名： index.php <br />      * 作  用： 显示实例程序 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#0066a7">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      include_once("./comm/Smarty.class.php"); //包含smarty类文件 </p>
				<p>      $smarty = new Smarty();  //建立smarty实例对象$smarty <br />      $smarty-&gt;templates("./templates"); //设置模板目录 <br />      $smarty-&gt;templates_c("./templates_c"); //设置编译目录 </p>
				<p>
						<br />      //****大家注意，这里我是我新加入的****// <br />      $smarty-&gt;cache("./cache"); //设置缓存目录 <br />      $smarty-&gt;cache_lifetime = 60 * 60 * 24;  //设置缓存时间 <br />      $smarty-&gt;caching = true;      //设置缓存方式 <br />       <br />      //---------------------------------------------------- <br />      //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />      //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />      //---------------------------------------------------- <br />      $smarty-&gt;left_delimiter = "&lt;{"; <br />      $smarty-&gt;right_delimiter = "}&gt;"; </p>
				<p>      $smarty-&gt;assign("name", "李晓军"); //进行模板变量替换 <br />       <br />      //编译并显示位于./templates下的index.tpl模板 <br />      $smarty-&gt;display("index.tpl"); <br />   ?&gt; <br />        <br />       我们可以看到，smarty的程序部分实际就是符合php语言规范的一组代码，我们依次来解释一下： <br />         1。/**/语句： <br />            包含的部分为程序篇头注释。主要的内容应该为对程序的作用，版权与作者及编写时间做一个简单的介绍，这在smarty中不是必 </p>
				<p>需的，但从程序的风格来讲，这是一个好的风格。 <br />     <br />     2。include_once语句： <br />        它将安装到网站的smarty文件包含到当前文件中，注意包含的路径一定要写正确。 </p>
				<p>     3。$smarty = new Smarty(): <br />        这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。 </p>
				<p>     4。$smarty-&gt;templates(""): <br />            这一句指明$smarty对象使用tpl模板时的路径，它是一个目录，在没有这一句时，Smarty默认的模板路径为当前目录的templates </p>
				<p>目录，实际在写程序时，我们要将这一句写明，这也是一种好的程序风格。 <br />     5。$smarty-&gt;templates_c(""): <br />        这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言，而这个目录，就是它编译 </p>
				<p>模板的目录，这里要注意，如果站点位于*nix服务器上，请确保teamplates_c里定义的这个目录具有可写可读权限，默认情况下它的编译目录 </p>
				<p>是当前目录下的templates_c，出于同样的理由我们将其明确的写出来。 <br />    <br />         6。$smarty-&gt;left_delimiter与$smarty-&gt;right_delimiter: <br />        指明在查找模板变量时的左右分割符。默认情况下为"{"与"}"，但在实际中因为我们要在模板中使用&lt;script&gt;,Script中的函数定 </p>
				<p>义难免会使用{}，虽然它有自己的解决办法，但习惯上我们将它重新定义为"&lt;{"与"}&gt;"或是"&lt;!--{"与"}--&gt;"或其它标志符，注意，如果在这里 </p>
				<p>定义了左右分割符后，在模板文件中相应的要使每一个变量使用与定义相同的符号，例如在这里指定为"&lt;{"与"}&gt;"，tpl模板中也要相应的将 </p>
				<p>{$name}变成&lt;{$name}&gt;,这样程序才可以正确的找到模板变量。 <br />     </p>
				<p>     7。$smarty-&gt;cache("./cache"): <br />        告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存，这里就是设置缓存的目录。默认情 </p>
				<p>况下为当前目录下的cache目录，与templates_c目录相当，在*nix系统中我们要确保它的可读可写性。 <br />     <br />     8. $smarty-&gt;cache_lifetime = 60 * 60 * 24: <br />         <br />        这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的 </p>
				<p>取值为-1时表示建立起的缓存从不过期，为0时表示在程序每次执行时缓存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。 </p>
				<p>     9. $smarty-&gt;caching = 1: <br />        这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值，0：Smarty默认值，表示不对模板进行缓存；1：表示 </p>
				<p>Smarty将使用当前定义的cache_lifetime来决定是否结束cache；2：表示Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使 </p>
				<p>用true与false来表示是否进行缓存。 </p>
				<p>     10. $smarty-&gt;assign("name", "李晓军")： <br />        该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量，var指出要将模板变量替换的变量名；其 </p>
				<p>第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法，assign是Smarty的核心函数之一，所有对模板变 </p>
				<p>量的替换都要使用它。 </p>
				<p>     11. $smarty-&gt;display("index.tpl"): <br />         该函数原形为display(string varname),作用为显示一个模板。简单的讲，它将分析处理过的模板显示出来，这里的模板文件不 </p>
				<p>用加路径，只要使用一个文件名就可以了，它路径我们已经在$smarty-&gt;templates(string path)中定义过了。 </p>
				<p>       程序执行完后我们可以打开当前目录下的templates_c与cache目录，就会发现在下边多出一些%%的目录，这些目录就是Smarty的编译与 </p>
				<p>缓存目录，它由程序自动生成，不要直接对这些生成的文件进行修改。 <br />       以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下，在后边的例子中你可以看到将它们将被多次的使用。 <br />     <br />     <br />    接下来介绍一个section循环块与foreach循环块，本来它应该属于模板部分，但是由于它们是smarty的精华所在，而且与smarty程序设计 </p>
				<p>部分联系非常紧密，所以就在本节单独拿出来讲一下。 </p>
				<p>   1. foreach：用于循环简单数组，它是一个选择性的section循环，它的定义格式为: <br />     <br />    {foreach from=$array item=array_id} <br />    {foreachelse} <br />    {/foreach} <br />    其中，from 指出要循环的数组变量，item为要循环的变量名称，循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当 </p>
				<p>程序中传递过来的数组为空时的处理，下面是一个简单的例子： <br />  =========================================== <br />    example6.tpl <br />  =========================================== <br />  &lt;html&gt; <br />    &lt;head&gt;&lt;title&gt;这是一个foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />    &lt;body&gt; <br />       这里将输出一个数组：&lt;br&gt; <br />       {foreach from=$newsArray item=newsID} <br />         新闻编号：{$newsID}&lt;br&gt; <br />     新闻内容：{$newsTitle}&lt;br&gt;&lt;hr&gt; <br />       {foreachelse} <br />         对不起，数据库中没有新闻输出！ <br />       {/foreach} <br />    &lt;/body&gt; <br />  &lt;/html&gt; </p>
				<p>  ========================================== <br />  example6.php <br />  ========================================== <br />六。smarty的程序设计部分：</p>
				<p>在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍，这一节主要来介绍一下如何在smarty中开始我们程</p>
				<p>序设计。</p>
				<p>
						<br />PHP代码: <br />    首先来介绍一下在上一节中我们使用的过的.php文件中的一些元素。同样，我们拿上一节中最开始的那个index.php文件来说明一下： <br />     <br />   ================================================ <br />     index.php <br />   ================================================ <br />   &lt;?php <br />     /********************************************* <br />      * <br />      * 文件名： index.php <br />      * 作  用： 显示实例程序 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#0066a7">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      include_once("./comm/Smarty.class.php"); //包含smarty类文件 </p>
				<p>      $smarty = new Smarty();  //建立smarty实例对象$smarty <br />      $smarty-&gt;templates("./templates"); //设置模板目录 <br />      $smarty-&gt;templates_c("./templates_c"); //设置编译目录 </p>
				<p>
						<br />      //****大家注意，这里我是我新加入的****// <br />      $smarty-&gt;cache("./cache"); //设置缓存目录 <br />      $smarty-&gt;cache_lifetime = 60 * 60 * 24;  //设置缓存时间 <br />      $smarty-&gt;caching = true;      //设置缓存方式 <br />       <br />      //---------------------------------------------------- <br />      //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />      //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />      //---------------------------------------------------- <br />      $smarty-&gt;left_delimiter = "&lt;{"; <br />      $smarty-&gt;right_delimiter = "}&gt;"; </p>
				<p>      $smarty-&gt;assign("name", "李晓军"); //进行模板变量替换 <br />       <br />      //编译并显示位于./templates下的index.tpl模板 <br />      $smarty-&gt;display("index.tpl"); <br />   ?&gt; <br />        <br />       我们可以看到，smarty的程序部分实际就是符合php语言规范的一组代码，我们依次来解释一下： <br />         1。/**/语句： <br />            包含的部分为程序篇头注释。主要的内容应该为对程序的作用，版权与作者及编写时间做一个简单的介绍，这在smarty中不是必 </p>
				<p>需的，但从程序的风格来讲，这是一个好的风格。 <br />     <br />     2。include_once语句： <br />        它将安装到网站的smarty文件包含到当前文件中，注意包含的路径一定要写正确。 </p>
				<p>     3。$smarty = new Smarty(): <br />        这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。 </p>
				<p>     4。$smarty-&gt;templates(""): <br />            这一句指明$smarty对象使用tpl模板时的路径，它是一个目录，在没有这一句时，Smarty默认的模板路径为当前目录的templates </p>
				<p>目录，实际在写程序时，我们要将这一句写明，这也是一种好的程序风格。 <br />     5。$smarty-&gt;templates_c(""): <br />        这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言，而这个目录，就是它编译 </p>
				<p>模板的目录，这里要注意，如果站点位于*nix服务器上，请确保teamplates_c里定义的这个目录具有可写可读权限，默认情况下它的编译目录 </p>
				<p>是当前目录下的templates_c，出于同样的理由我们将其明确的写出来。 <br />    <br />         6。$smarty-&gt;left_delimiter与$smarty-&gt;right_delimiter: <br />        指明在查找模板变量时的左右分割符。默认情况下为"{"与"}"，但在实际中因为我们要在模板中使用&lt;script&gt;,Script中的函数定 </p>
				<p>义难免会使用{}，虽然它有自己的解决办法，但习惯上我们将它重新定义为"&lt;{"与"}&gt;"或是"&lt;!--{"与"}--&gt;"或其它标志符，注意，如果在这里 </p>
				<p>定义了左右分割符后，在模板文件中相应的要使每一个变量使用与定义相同的符号，例如在这里指定为"&lt;{"与"}&gt;"，tpl模板中也要相应的将 </p>
				<p>{$name}变成&lt;{$name}&gt;,这样程序才可以正确的找到模板变量。 <br />     </p>
				<p>     7。$smarty-&gt;cache("./cache"): <br />        告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存，这里就是设置缓存的目录。默认情 </p>
				<p>况下为当前目录下的cache目录，与templates_c目录相当，在*nix系统中我们要确保它的可读可写性。 <br />     <br />     8. $smarty-&gt;cache_lifetime = 60 * 60 * 24: <br />         <br />        这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的 </p>
				<p>取值为-1时表示建立起的缓存从不过期，为0时表示在程序每次执行时缓存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。 </p>
				<p>     9. $smarty-&gt;caching = 1: <br />        这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值，0：Smarty默认值，表示不对模板进行缓存；1：表示 </p>
				<p>Smarty将使用当前定义的cache_lifetime来决定是否结束cache；2：表示Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使 </p>
				<p>用true与false来表示是否进行缓存。 </p>
				<p>     10. $smarty-&gt;assign("name", "李晓军")： <br />        该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量，var指出要将模板变量替换的变量名；其 </p>
				<p>第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法，assign是Smarty的核心函数之一，所有对模板变 </p>
				<p>量的替换都要使用它。 </p>
				<p>     11. $smarty-&gt;display("index.tpl"): <br />         该函数原形为display(string varname),作用为显示一个模板。简单的讲，它将分析处理过的模板显示出来，这里的模板文件不 </p>
				<p>用加路径，只要使用一个文件名就可以了，它路径我们已经在$smarty-&gt;templates(string path)中定义过了。 </p>
				<p>       程序执行完后我们可以打开当前目录下的templates_c与cache目录，就会发现在下边多出一些%%的目录，这些目录就是Smarty的编译与 </p>
				<p>缓存目录，它由程序自动生成，不要直接对这些生成的文件进行修改。 <br />       以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下，在后边的例子中你可以看到将它们将被多次的使用。 <br />     <br />     <br />    接下来介绍一个section循环块与foreach循环块，本来它应该属于模板部分，但是由于它们是smarty的精华所在，而且与smarty程序设计 </p>
				<p>部分联系非常紧密，所以就在本节单独拿出来讲一下。 </p>
				<p>   1. foreach：用于循环简单数组，它是一个选择性的section循环，它的定义格式为: <br />     <br />    {foreach from=$array item=array_id} <br />    {foreachelse} <br />    {/foreach} <br />    其中，from 指出要循环的数组变量，item为要循环的变量名称，循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当 </p>
				<p>程序中传递过来的数组为空时的处理，下面是一个简单的例子： <br />  =========================================== <br />    example6.tpl <br />  =========================================== <br />  &lt;html&gt; <br />    &lt;head&gt;&lt;title&gt;这是一个foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />    &lt;body&gt; <br />       这里将输出一个数组：&lt;br&gt; <br />       {foreach from=$newsArray item=newsID} <br />         新闻编号：{$newsID}&lt;br&gt; <br />     新闻内容：{$newsTitle}&lt;br&gt;&lt;hr&gt; <br />       {foreachelse} <br />         对不起，数据库中没有新闻输出！ <br />       {/foreach} <br />    &lt;/body&gt; <br />  &lt;/html&gt; </p>
				<p>  ========================================== <br />  example6.php <br />  ========================================== </p>
				<p>  &lt;?php <br /><br />     </p>
		</font>
		<font color="#ff8000">/********************************************* <br />      * <br />      * 文件名： example6.php <br />      * 作  用： 显示实例程序2 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#000080">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      </font>
		<font color="#007700">include_once(</font>
		<font color="#dd0000">"./comm/Smarty.class.php"</font>
		<font color="#007700">); <br /><br />      </font>
		<font color="#0000bb">$smarty </font>
		<font color="#007700">= new </font>
		<font color="#0000bb">Smarty</font>
		<font color="#007700">();   <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">templates</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"./templates"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">templates_c</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"./templates_c"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">cache</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"./cache"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">cache_lifetime  </font>
		<font color="#007700">= </font>
		<font color="#0000bb">0</font>
		<font color="#007700">; <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">caching         </font>
		<font color="#007700">= </font>
		<font color="#0000bb">true</font>
		<font color="#007700">; <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">left_delimiter  </font>
		<font color="#007700">= </font>
		<font color="#dd0000">"{"</font>
		<font color="#007700">; <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">right_delimiter </font>
		<font color="#007700">= </font>
		<font color="#dd0000">"}"</font>
		<font color="#007700">; <br />       <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">1</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第1条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">2</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第2条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">3</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第3条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">4</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第4条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">5</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第5条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">6</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第6条新闻"</font>
		<font color="#007700">); <br /><br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">assign</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"newsArray"</font>
		<font color="#007700">, </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">); <br /><br />      </font>
		<font color="#ff8000">//编译并显示位于./templates下的index.tpl模板 <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">display</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"example6.tpl"</font>
		<font color="#007700">); <br />   </font>
		<font color="#0000bb">?&gt; <br />   ================================================= <br />   example6.php 输出文件 <br />   ================================================= <br />   &lt;html&gt; <br />     &lt;head&gt;&lt;title&gt;foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />     &lt;body&gt; <br />        这里将输出一个数组：&lt;br&gt; </font>
		<blockquote>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：1&lt;br&gt; <br />    新闻内容：第1条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：2&lt;br&gt; <br />    新闻内容：第2条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：3&lt;br&gt; <br />    新闻内容：第3条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：4&lt;br&gt; <br />    新闻内容：第4条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：5&lt;br&gt; <br />    新闻内容：第5条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：6&lt;br&gt; <br />    新闻内容：第6条新闻&lt;br&gt;&lt;hr&gt; <br />     &lt;/body&gt; <br />   &lt;/html&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   foreach还可以用foreachelse来匹配，用foreachelse来表示当传递给foreach的数组为空值时程序要执行的操作，具体的使用方法，请参考 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">手册的说明。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   2. section: <br />     section的产生是为解决foreach的不足的，与foreach一样，它用于设计模板内的循环块，它较为复杂，可极大程序上满足程序需要，所 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">以在程序中我习惯使用它而不使用foreach,基本原形为： </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">     {section name = name loop = $varName[, start = $start, step = $step, max = $max, show = true]} </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">     name: section的名称，不用加$ <br />     $loop: 要循环的变量，在程序中要使用assign对这个变量进行操作。 <br />     $start: 开始循环的下标，循环下标默认由0开始 <br />     $step:  每次循环时下标的增数 <br />     $max:   最大循环下标 <br />     $show:  boolean类型，决定是否对这个块进行显示，默认为true </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">     这里有个名词需要说明： <br />         循环下标：实际它的英文名称为index，是索引的意思，这里我将它译成"下标"，主要是为了好理解。它表示在显示这个循环块时当 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">前的循环索引，默认从0开始，受$start的影响，如果将$start设为5，它也将从5开始计数，在模板设计部分我们使用过它，这是当前 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">{section}的一个属性，调用方式为Smarty.section.sectionName.index,这里的sectionName指的是函数原型中的name属性。 <br />    {section}块具有的属性值，分别为： <br />      1. index:      上边我们介绍的"循环下标"，默认为0 <br />      2. index_prev: 当前下标的前一个值，默认为-1 <br />      3. index_next: 当前下标的下一个值，默认为1 <br />      4. first:      是否为第一下循环 <br />      5. last:       是否为最后一个循环 <br />      6. iteration:  循环次数 <br />      7. rownum:     当前的行号，iteration的另一个别名 <br />      8. loop:       最后一个循环号，可用在section块后统计section的循环次数 <br />      9. total: 循环次数，可用在section块后统计循环次数 <br />      10. show: 在函数的声明中有它，用于判断section是否显示 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      它们的具体属性大家可以参考手册，在程序中可灵活使用它的这些属性，模板部分我就使用过index属性，大家可以回过头去看看。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      同样，{section}也可以配合使用{sectionelse}，用来表示传入的数组变量为空时对模板进行的处理。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      我们把上边的那个例子使用{section}来替代{foreach}来实现现样的功能，注意，在这个例子中我只将tpl模板中的{foreach}用 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">{section}来实现，php程序文件中没有任何改动，同时加了{sectionelse}处理块： </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">  =========================================== <br />    example7.tpl <br />  =========================================== <br />  &lt;html&gt; <br />    &lt;head&gt;&lt;title&gt;这是一个foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />    &lt;body&gt; <br />       这里将输出一个数组：&lt;br&gt; <br />       {section name=loop, loop=$News} <br />         新闻编号：{$News[loop].newsID}&lt;br&gt; <br />         新闻标题：{$News[loop].newsTitle}&lt;br&gt;&lt;hr&gt; <br />       {sectionelse} <br />         对不起，没有任何新闻输入！ <br />       {/section} <br />    &lt;/body&gt; <br />  &lt;/html&gt; <br />   <br />  ========================================== <br />  example6.php <br />  ========================================== <br />  &lt;?php <br />     /********************************************* <br />      * <br />      * 文件名： example7.php <br />      * 作  用： 显示实例程序2 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#0066a7">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      include_once("./comm/Smarty.class.php"); </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      $smarty = new Smarty();   <br />      $smarty-&gt;templates("./templates"); <br />      $smarty-&gt;templates_c("./templates_c"); <br />      $smarty-&gt;cache("./cache"); <br />      $smarty-&gt;cache_lifetime  = 0; <br />      $smarty-&gt;caching         = true; <br />      $smarty-&gt;left_delimiter  = "{"; <br />      $smarty-&gt;right_delimiter = "}"; <br />       <br />      $array[] = array("newsID"=&gt;1, "newsTitle"=&gt;"第1条新闻"); <br />      $array[] = array("newsID"=&gt;2, "newsTitle"=&gt;"第2条新闻"); <br />      $array[] = array("newsID"=&gt;3, "newsTitle"=&gt;"第3条新闻"); <br />      $array[] = array("newsID"=&gt;4, "newsTitle"=&gt;"第4条新闻"); <br />      $array[] = array("newsID"=&gt;5, "newsTitle"=&gt;"第5条新闻"); <br />      $array[] = array("newsID"=&gt;6, "newsTitle"=&gt;"第6条新闻"); </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      $smarty-&gt;assign("newsArray", $array); </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      //编译并显示位于./templates下的index.tpl模板 <br />      $smarty-&gt;display("example6.tpl"); <br />   ?&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   ================================================= <br />   example7.php 输出文件 <br />   ================================================= <br />   &lt;html&gt; <br />     &lt;head&gt;&lt;title&gt;foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />     &lt;body&gt; <br />        这里将输出一个数组：&lt;br&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：1&lt;br&gt; <br />    新闻内容：第1条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：2&lt;br&gt; <br />    新闻内容：第2条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：3&lt;br&gt; <br />    新闻内容：第3条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：4&lt;br&gt; <br />    新闻内容：第4条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：5&lt;br&gt; <br />    新闻内容：第5条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：6&lt;br&gt; <br />    新闻内容：第6条新闻&lt;br&gt;&lt;hr&gt; <br />     &lt;/body&gt; <br />   &lt;/html&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   这里的{section}块的对于变量的命名方式感觉有些别扭，不过没关系，你只要记住模板变量使用： <br />   $loopName[name].var这种模式就行了，loopName为loop处赋予的变量名，[name]为name处赋予的字符串，.后为为你要在程序数组中设定要 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">与值相对应的下标名称就行了。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   <br />   好了，smarty学习指南---程序设计篇就写到这里，对于一般的应用，这些知识已经够用了，其它的一些高级技巧大家请参看手册中的例子 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">，下一节将讲讲Smarty在实际应用中的例子，将分别以php内置的mysql语句，phplib中的DB类，ADODB，Pear中DB类来分别讲一下各个类库在同一个例子中的实现。 <br /></font>
						</font>
				</p>
		</blockquote>
<img src ="http://www.blogjava.net/jackstudio/aggbug/67864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-05 18:14 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smarty，PHP模板引擎 </title><link>http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Tue, 05 Sep 2006 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/67860.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/67860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/67860.html</trackback:ping><description><![CDATA[关键词： <br /> smarty，PHP模板引擎 <br /><br /><br />一、什么是smarty? <br /> smarty是一个使用PHP写出来的模板PHP模板引擎，它提供了逻辑与外在内容的分离，简单的讲，目的就是要使用PHP程序员同美工分 <br />离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计，美工重新修改页面不会影响到程序的程序逻辑，这在多人合作的项目 <br />中显的尤为重要。 <br /><br />二、smarty优点： <br /> 1. 速度：采用smarty编写的程序可以获得最大速度的提高，这一点是相对于其它的模板引擎技术而言的。 <br />  <br /> 2. 编译型：采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件，这个文件采用了PHP与HTML混合的方式，在下一次访 <br />问模板时将WEB请求直接转换到这个文件中，而不再进行模板重新编译（在源程序没有改动的情况下） <br />  <br /> 3. 缓存技术：smarty选用的一种缓存技术，它可以将用户最终看到的HTML文件缓存成一个静态的HTML页，当设定smarty的cache属性为 <br />  true时，在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来，这相当于调用一个静态的HTML文件。 <br /><br /> 4. 插件技术：smarty可以自定义插件。插件实际就是一些自定义的函数。 <br />  <br /> 5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。 <br /><br /><br />三、不适合使用smarty的地方： <br />  <br /> 1. 需要实时更新的内容。例如像股票显示，它需要经常对数据进行更新，这类型的程序使用smarty返而会使模板处理速度变慢。 <br />  <br /> 2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目，使用smarty返而会丧失php开发迅速的优点。 <br /><br />四、安装smarty类： <br />  <br /> 安装smarty的环境：php版本4.06以上版本。 <br /><br /> 安装smarty方法非常简单，从http://samrty.php.net中下载smarty.tar.gz,解压后找到LIB目录,在当前站点中建立目录comm,将LIB中所有文件 <br />  拷入comm目录,完成基本安装. <br />  <br /> 其它高级安装使用方法请看手册. <br /><br />五、smarty在模板中的使用： <br />  <br />  本节通过几个实例来讲一讲smarty的使用。smarty模板通常使用.tpl来标识，有些人为了美工方便，将扩展名直接写成.html，也是可以 <br />的。本文中采用smarty标准写法:以.tpl来表示为一个smarty模板。 <br /><br /> 实例1： <br /><br />  先来看一个简单的例子。 <br />  ===================================================== <br />  index.tpl <br />  ===================================================== <br />  <br />  {* 显示是smarty变量识符里的用*包含的文字为注释内容 *} <br />  {include file="header.tpl"}{*页面头*} <br /> 大家好，我叫{$name}, 欢迎大家阅读我的smarty学习材料。 <br />  {include file="foot.tpl"}{*页面尾*} <br /><br /> 上边的这个例子是一个tpl模板，其中： <br /> 1. {**}是模板页的注释，它在smarty对模板进行解析时不进行任何输出，仅供模板设计师对模板进行注释。 <br /> 2. {include file="xxx.tpl"}使用此句将一个模板文件包含到当前页面中，例子中将在网站中公用事的head.tpl与foot.tpl进行了包含，你可以 <br /> 这样想，使用这一句将xxx.tpl中的内容全部复制在当前语句处。当然，你不使用这一句也可以，将XXX.tpl中的内容复制到当前语句处 <br />  也是完全可以了。 <br /><br /> 3.{$name}: 模板变量，smarty中的核心组成，采用smarty定义的左边界符{与右边界符}包含着、以PHP变量形式给出，在smarty程序中将使用 <br /> $smarty-&gt;assign("name", "李晓军")；将模板中的$name替换成“李晓军”三个字。 <br />  <br />  整个实例源程序如下： <br />  ============================= <br />  header.tpl <br />  ============================= <br />  &lt;html&gt; <br />  &lt;head&gt; <br /> &lt;title&gt;大师兄smarty教程&lt;/title&gt; <br />  &lt;/head&gt; <br />  &lt;body&gt; <br />  <br /><br />  =============================== <br />  foot.tpl <br />  =============================== <br />  &lt;hr&gt; <br /> &lt;center&gt; CopyRight(C) by 大师兄 2004年8月 Email: teacherli@163.com &lt;/center&gt; <br />  &lt;hr&gt; <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br />  ===================================================== <br />  index.tpl <br />  ===================================================== <br />  <br />  {* 显示是smarty变量识符里的用*包含的文字为注释内容 *} <br />  {include file="header.tpl"}{*页面头*} <br /> 大家好，我叫{$name}, 欢迎大家阅读我的smarty学习材料。 <br />  {include file="foot.tpl"}{*页面尾*} <br /><br /> ================================================ <br /> index.php <br /> ================================================ <br /> &lt;?php <br /> /********************************************* <br />  * <br />  * 文件名： index.php <br />  * 作用： 显示实例程序 <br />  * <br />  * 作者： 大师兄 <br />  * Email：teacherli@163.com <br />  * <br />  *********************************************/ <br />  include_once("./comm/Smarty.class.php"); //包含smarty类文件 <br /><br />  $smarty = new Smarty();//建立smarty实例对象$smarty <br />  $smarty-&gt;templates("./templates"); //设置模板目录 <br />  $smarty-&gt;templates_c("./templates_c"); //设置编译目录 <br />  <br />  //---------------------------------------------------- <br />  //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />  //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />  //---------------------------------------------------- <br />  $smarty-&gt;left_delimiter = "{"; <br />  $smarty-&gt;right_delimiter = "}"; <br /><br />  $smarty-&gt;assign("name", "李晓军"); //进行模板变量替换 <br />  <br />  //编译并显示位于./templates下的index.tpl模板 <br />  $smarty-&gt;display("index.tpl"); <br /> ?&gt; <br />  <br /> 最终执行这个程序时将显示为： <br /> ================================ <br /> 执行index.php <br /> ================================ <br /> &lt;html&gt; <br />  &lt;head&gt; <br /> &lt;title&gt;大师兄smarty教程&lt;/title&gt; <br />  &lt;/head&gt; <br />  &lt;body&gt; <br /> 大家好，我叫李晓军, 欢迎大家阅读我的smarty学习材料。 <br /> &lt;hr&gt; <br /> &lt;center&gt; CopyRight(C) by 大师兄 2004年8月 Email: teacherli@163.com &lt;/center&gt; <br />  &lt;hr&gt; <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br /><br /><br />实例2： <br />  这个例子是综合使用smarty模板参数的一个例子，这些参数用来控制模板的输出，我只选其中几个，其它的参数你去看参考吧。 <br /><br />  ================================================ <br />  exmple2.tpl <br />  ================================================ <br />  &lt;html&gt; <br />  &lt;head&gt;&lt;title&gt;大师兄smarty示例2&lt;/title&gt;&lt;/head&gt; <br />  &lt;body&gt; <br />  1. 第一句首字母要大写：{$str1|capitalize}&lt;br&gt; <br />  2. 第二句模板变量 + 李晓军：{$str2|cat:"李晓军"}&lt;br&gt; <br />  3. 第三句输出当前日期：{$str3|date_format:"%Y年%m月%d日"} <br />  4. 第四句.php程序中不处理，它显示默认值：{$str4|default:"没有值！"} <br />  5。第五句要让它缩进8个空白字母位，并使用"*"取替这8个空白字符：&lt;br&gt; <br /> {$str5|indent:8:"*"}}&lt;br&gt; <br />  6. 第六句把TEACHerLI@163.com全部变为小写：{$str6|lower}&lt;br&gt; <br />  7. 第七句把变量中的teacherli替换成：李晓军：{$str7|replace:"teacherli":"李晓军"}&lt;br&gt; <br />8. 第八句为组合使用变量修改器：{$str8|capitalize|cat:"这里是新加的时间："|date_format:"%Y年%m月%d日"|lower} <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br />  =============================================== <br />  example2 .php <br />  =============================================== <br />  &lt;?php <br /> /********************************************* <br />  * <br />  * 文件名： example2.php <br />  * 作用： 显示实例程序2 <br />  * <br />  * 作者： 大师兄 <br />  * Email：teacherli@163.com <br />  * <br />  *********************************************/ <br />  include_once("./Smarty.class.php"); //包含smarty类文件 <br /><br />  $smarty = new Smarty();//建立smarty实例对象$smarty <br />  $smarty-&gt;templates("./templates"); //设置模板目录 <br />  $smarty-&gt;templates_c("./templates_c"); //设置编译目录 <br />  <br />  //---------------------------------------------------- <br />  //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />  //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />  //---------------------------------------------------- <br />  $smarty-&gt;left_delimiter = "{"; <br />  $smarty-&gt;right_delimiter = "}"; <br /><br />  $smarty-&gt;assign("str1", "my name is xiao jun, li."); //将str1替换成My Name Is Xiao Jun, Li. <br />  $smarty-&gt;assign("str2", "我的名字叫："); //输出: 我的名字叫:李晓军 <br />  $smarty-&gt;assign("str3", "公元"); //输出公元2004年8月21日（我的当前时间） <br />  //$smarty-&gt;assign("str4", ""); //第四句不处理时会显示默认值，如果使用前面这一句则替换为"" <br />  $smarty-&gt;assign("str5", "前边8个*"); //第五句输出：********前边8个* <br />  $smarty-&gt;assign("str6", "TEACHerLI@163.com"); //这里将输出teacherli@163.com <br />  $smarty-&gt;assign("str7", "this is teacherli"); //在模板中显示为：this is 李晓军 <br />  $smarty-&gt;assign("str8", "HERE IS COMBINING:"); <br /><br />  //编译并显示位于./templates下的index.tpl模板 <br />  $smarty-&gt;display("example2.tpl"); <br /> ?&gt; <br />  <br />  最终输出效果： <br />  ====================================================== <br />  example2.php输出效果： <br />  ====================================================== <br />  &lt;html&gt; <br />  &lt;head&gt;&lt;title&gt;大师兄smarty示例2&lt;/title&gt;&lt;/head&gt; <br />  &lt;body&gt; <br />  1. 第一句首字母要大写：My Name Is Xiao Jun, Li.&lt;br&gt; <br />  2. 第二句模板变量 + 李晓军：我的名字叫：李晓军&lt;br&gt; <br />  3. 第三句输出当前日期：公元2004年8月21日&lt;br&gt; <br />  4. 第四句.php程序中不处理，它显示默认值：没有值！&lt;br&gt; <br />  5。第五句要让它缩进8个空白字母位，并使用"*"取替这8个空白字符：&lt;br&gt; <br /> ********前边8个*&lt;br&gt; <br />  6. 第六句把TEACHerLI@163.com全部变为小写：teacherli@163.com&lt;br&gt; <br />  7. 第七句把变量中的teacherli替换成：李晓军：this is 李晓军&lt;br&gt; <br />8. 第八句为组合使用变量修改器：Here is Combining:这里是新加的时间：2004年8月21日 <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br /> 在模板中的这些参数被称为变量修改器（variable modifiers），使用这些参数可对模板进行一系列的修改控制。变量修改器 <br /> 使用"|"和调节器名称应用修改器， 使用":"分开修改器参数。变量修改器可以组合使用，像第八句一样，实际使用中可以灵活应用。 <br /><img src ="http://www.blogjava.net/jackstudio/aggbug/67860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-05 17:48 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php常见问题</title><link>http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 10 Aug 2006 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/62766.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/62766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/62766.html</trackback:ping><description><![CDATA[
		<p>1:为什么我得不到变量</p>
		<p>　　我在一网页向另一网页POST数据name，为什么输出$name时却得不到任何值?</p>
		<p>在PHP4.2以后的版本中register_global默认为off<br />　　若想取得从另一页面提交的变量:</p>
		<p>　　方法一:在PHP.ini中找到register_global，并把它设置为on.<br />　　方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()).<br />　　方法三:一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等，这种方法虽然麻烦，但比较安全.</p>
		<p>　　2：调试你的程序</p>
		<p>　　在运行时必须知道某个变量为何值。我是这样做的，建立一文件debug.php,其内容如下:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　Ob_Start();<br />　　Session_Start();<br />　　Echo "&lt;pre&gt;";</p>
		<p>　　Echo "本页得到的_GET变量有:";<br />　　Print_R($_GET);</p>
		<p>　　Echo "本页得到的_POST变量有:";<br />　　Print_R($_POST);</p>
		<p>　　Echo "本页得到的_COOKIE变量有:";<br />　　Print_R($_COOKIE);</p>
		<p>　　Echo "本页得到的_SESSION变量有:";<br />　　Print_R($_SESSION);</p>
		<p>　　Echo "&lt;/pre&gt;";<br />　　?&gt;</p>
		<p>　　然后在php.ini中设置：include_path = "c:/php"，并将debug.php放在此文件夹,以后就可以在每个网页里包含此文件，查看得到的变量名和值.</p>
		<p>　　3：如何使用session</p>
		<p>　　凡是与session有关的,之前必须调用函数session_start();</p>
		<p>　　为session付值很简单,如:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　Session_start();<br />　　$Name = "这是一个Session例子";<br />　　Session_Register("Name");//注意,不要写成：Session_Register("$Name");<br />　　Echo $_SESSION["Name"];<br />　　//之后$_SESSION["Name"]为"这是一个Session例子"<br />　　?&gt;</p>
		<p>　　在php4.2之后,可以为session直接付值:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　Session_Start();<br />　　$_SESSION["name"]="value";<br />　　?&gt;</p>
		<p>　　取消session可以这样:</p>
		<p>
				<br />PHP代码: </p>
		<p>
				<br />　　&lt;?php<br />　　session_start();<br />　　session_unset();<br />　　session_destroy();<br />　　?&gt;</p>
		<p>　　取消某个session变量在php4.2以上还有BUG.</p>
		<p>　　注意:</p>
		<p>　　1:在调用Session_Start()之前不能有任何输出.例如下面是错误的.<br />　　==========================================<br />　　1行<br />　　2行 3行 Session_Start();//之前在第一行已经有输出<br />　　4行 .....<br />　　5行 ?&gt;<br />　　==========================================</p>
		<p>　　提示1:</p>
		<p>　　凡是出现" ........headers already sent.......... ",就是Session_Start()之前向浏览器输出信息.去掉输出就正常,（COOKIE也会出现这种错误,错误原因一样）</p>
		<p>　　提示2:</p>
		<p>　　如果你的Session_Start()放在循环语句里,并且很难确定之前哪里向浏览器输出信息,可以用下面这种方法:<br />　　1行 &lt;?PHP Ob_Start(); ?&gt;<br />　　........这里是你的程序......</p>
		<p>　　2:这是什么错误</p>
		<p>　　Warning: session_start(): open(/tmp\sess_7d190aa36b4c5ec13a5c1649cc2da23f, O_RDWR) failed:....<br />因为你没有指定session文件的存放路径.</p>
		<p>　　解决方法:<br />　　(1)在c盘建立文件夹tmp<br />　　(2)打开php.ini,找到session.save_path,修改为session.save_path= "c:/tmp"</p>
		<p>4:为什么我向另一网页传送变量时,只得到前半部分,以空格开头的则全部丢失</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　$Var="hello php";//修改为$Var="     hello php";试试得到什么结果<br />　　$post= "receive.php?Name=".$Var;<br />　　header("location:$post");<br />　　?&gt;</p>
		<p>　　receive.php的内容:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　Echo "&lt;pre&gt;";<br />　　Echo   $_GET["Name"];<br />　　Echo "&lt;/pre&gt;";<br />　　?&gt;</p>
		<p>　　正确的方法是:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　$Var="hello php";<br />　　$post= "receive.php?Name=".urlencode($Var);<br />　　header("location:$post");<br />　　?&gt;</p>
		<p>　　在接收页面你不需要使用Urldecode(),变量会自动编码.<br />5:如何截取指定长度汉字而不会出现以"?&gt;"结尾,超出部分以"..."代替</p>
		<p>　　一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字，包括标点.</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$str="这个字符好长呀,^_^";<br />　　$Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符...<br />　　Echo   "$Short_Str";<br />　　Function csubstr($str,$start,$len) <br />　　{ <br />　　$strlen=strlen($str); <br />　　$clen=0; <br />　　for($i=0;$i&lt;$strlen;$i++,$clen++) <br />　　{ <br />　　if ($clen&gt;=$start+$len) <br />　　break; <br />　　if(ord(substr($str,$i,1))&gt;0xa0) <br />　　{ <br />　　if ($clen&gt;=$start) <br />　　$tmpstr.=substr($str,$i,2); <br />　　$i++; <br />　　} <br />　　else <br />　　{ <br />　　if ($clen&gt;=$start) <br />　　$tmpstr.=substr($str,$i,1); <br />　　} <br />　　} </p>
		<p>　　return $tmpstr; <br />　　} <br />　　Function showShort($str,$len) <br />　　{ <br />　　$tempstr = csubstr($str,0,$len); <br />　　if ($str&lt;&gt;$tempstr) <br />　　$tempstr .= "..."; //要以什么结尾,修改这里就可以.</p>
		<p>　　return $tempstr; <br />　　}</p>
		<p>
				<br />　　6:规范你的SQL语句</p>
		<p>　　在表格，字段前面加上"`",这样就不会因为误用关键字而出现错误，当然我并不推荐你使用关键字.</p>
		<p>　　例如<br />　　$Sql="INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', '2003-07-11 00:00:00')"</p>
		<p>　　"`"怎么输入? 在TAB键上面.</p>
		<p>
				<br />　　7:如何使Html/PHP格式的字符串不被解释,而是照原样显示</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$str="&lt;h1&gt;PHP&lt;/h1&gt;";<br />　　Echo "被解释过的: ".$str."&lt;br&gt;经过处理的:";<br />　　Echo   htmlentities(nl2br($str));<br />　　?&gt;</p>
		<p>
				<br />　　8:怎么在函数里取得函数外的变量值</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$a="PHP";<br />　　foo();<br />　　Function foo()<br />　　{<br />　　 global $a;//删除这里看看是什么结果<br />　　 Echo "$a";<br />　　}<br />　　?&gt;</p>
		<p>9:我怎么知道系统默认支持什么函数</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php <br />　　$arr = get_defined_functions(); <br />　　Function php() {<br />　　}<br />　　echo   "&lt;pre&gt;"; <br />　　Echo   "这里显示系统所支持的所有函数,和自定以函数php\n";<br />　　print_r($arr); <br />　　echo   "&lt;/pre&gt;"; <br />　　?&gt;  </p>
		<p>
				<br />　　10:如何比较两个日期相差几天</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$Date_1="2003-7-15";//也可以是:$Date_1="2003-7-15 23:29:14";<br />　　$Date_2="1982-10-1";<br />　　$d1=strtotime($Date_1);<br />　　$d2=strtotime($Date_2);<br />　　$Days=round(($d1-$d2)/3600/24);<br />　　Echo   "偶已经奋斗了 $Days 天^_^";<br />　　?&gt;</p>
		<p>
				<br />　　11:为什么我升级PHP后,原来的程序出现满屏的 Notice: Undefined variable:</p>
		<p>　　这是警告的意思,由于变量未定义引起的.<br />　　打开php.ini,找到最下面的error_reporting,修改为error_reporting = E_ALL &amp; ~E_NOTICE</p>
		<p>　　对于Parse error错误<br />　　error_reporting(0)无法关闭.<br />　　如果你想关闭任何错误提示,打开php.ini,找到display_errors,设置为display_errors = Off.以后任何错误都不会提示.</p>
		<p>　　那什么是error_reporting?</p>
		<p>
				<br />　　12:我想在每个文件最前，最后面都加上一文件.但一个一个添加很麻烦</p>
		<p>　　1:打开php.ini文件<br />　　设置 include_path= "c:"</p>
		<p>　　2:写两个文件 <br />　　auto_prepend_file.php 和 auto_append_file.php 保存在c盘,他们将自动依附在每个php文件的头部和尾部.</p>
		<p>　　3:在php.ini中找到:<br />　　Automatically add files before or after any PHP document.<br />　　auto_prepend_file = auto_prepend_file.php;依附在头部<br />　　auto_append_file = auto_append_file.php;依附在尾部</p>
		<p>　　以后你每个php文件就相当于</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php <br />　　Include "auto_prepend_file.php" ;</p>
		<p>　　.......//这里是你的程序</p>
		<p>　　Include "auto_append_file.php";<br />　　?&gt;</p>
		<p>
				<br />　　13:如何利用PHP上传文件</p>
		<p>　　PHP代码: </p>
		<p>　　&lt;html&gt;&lt;head&gt;<br />　　&lt;title&gt;上载文件表单&lt;/title&gt;&lt;/head&gt; <br />　　&lt;body&gt; <br />　　&lt;form enctype="multipart/form-data" action="" method="post"&gt; <br />　　请选择文件： &lt;br&gt;<br />　　&lt;input name="upload_file" type="file"&gt;&lt;br&gt;<br />　　&lt;input type="submit" value="上传文件"&gt; <br />　　&lt;/form&gt; <br />　　&lt;/body&gt;<br />　　&lt;/html&gt; </p>
		<p>
				<br />&lt;?<br />　　$upload_file=$_FILES['upload_file']['tmp_name'];<br />　　$upload_file_name=$_FILES['upload_file']['name'];</p>
		<p>　　if($upload_file){<br />　　$file_size_max = 1000*1000;// 1M限制文件上传最大容量(bytes)<br />　　$store_dir = "d:/";// 上传文件的储存位置<br />　　$accept_overwrite = 1;//是否允许覆盖相同文件<br />　　// 检查文件大小<br />　　if ($upload_file_size &gt; $file_size_max) {<br />　　echo "对不起，你的文件容量大于规定";<br />　　exit;<br />　　}</p>
		<p>　　// 检查读写文件<br />　　if (file_exists($store_dir . $upload_file_name) &amp;&amp; !$accept_overwrite) {<br />　　Echo   "存在相同文件名的文件";<br />　　exit;<br />　　}</p>
		<p>　　//复制文件到指定目录<br />　　if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {<br />　　echo "复制文件失败";<br />　　exit;<br />　　}</p>
		<p>　　}</p>
		<p>　　Echo   "&lt;p&gt;你上传了文件:";<br />　　echo  $_FILES['upload_file']['name'];<br />　　echo "&lt;br&gt;";<br />　　//客户端机器文件的原名称。 </p>
		<p>　　Echo   "文件的 MIME 类型为:";<br />　　echo $_FILES['upload_file']['type'];<br />　　//文件的 MIME 类型，需要浏览器提供该信息的支持，例如“image/gif”。 <br />　　echo "&lt;br&gt;";</p>
		<p>　　Echo   "上传文件大小:";<br />　　echo $_FILES['upload_file']['size'];<br />　　//已上传文件的大小，单位为字节。 <br />　　echo "&lt;br&gt;";</p>
		<p>　　Echo   "文件上传后被临时储存为:";<br />　　echo $_FILES['upload_file']['tmp_name'];<br />　　//文件被上传后在服务端储存的临时文件名。 <br />　　echo "&lt;br&gt;";</p>
		<p>
				<br />　　$Erroe=$_FILES['upload_file']['error'];<br />　　switch($Erroe){<br />        　　case 0:<br />            　Echo   "上传成功"; break;<br />        　　case 1:<br />            　Echo   "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;<br />        　　case 2:<br />            　Echo   "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。";    break;<br />        　　case 3:<br />            　Echo   "文件只有部分被上传";break;<br />        　　case 4:<br />            　Echo   "没有文件被上传";break;<br />　　}<br />　　?&gt;</p>
		<p>
				<br />　　14:如何配置GD库</p>
		<p>　　下面是我的配置过程<br />　　1:用dos命令(也可以手动操作,拷贝dlls文件夹里所有dll文件到system32目录下) copy c:\php\dlls\*.dll c:\windows\system32\ <br />　　2:打开php.ini<br />　　设置extension_dir = "c:/php/extensions/";<br />　　3:<br />　　extension=php_gd2.dll;把extension前面的逗号去掉，如果没有php_gd2.dll，php_gd.dll也一样,保证确实存在这一文件c:/php/extensions/php_gd2.dll<br />　　4:运行下面程序进行测试</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　Ob_end_flush();<br />　　//注意,在此之前不能向浏览器输出任何信息,要注意是否设置了 auto_prepend_file.<br />　　header ("Content-type: image/png");<br />　　$im = @imagecreate (200, 100)<br />    　or die ("无法创建图像");<br />　　$background_color = imagecolorallocate ($im, 0,0, 0);<br />　　$text_color = imagecolorallocate ($im, 230, 140, 150);<br />　　imagestring ($im, 3, 30, 50,  "A Simple Text String", $text_color);<br />　　imagepng ($im);<br />　　?&gt;</p>
		<p>　　点击这里查看结果</p>
		<p>
				<br />　　15:什么是UBB代码</p>
		<p>　　UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外一个BBS程序，国内也有不少地方使用这个程序)采用的一种特殊的TAG.<br />　　即使禁止使用 HTML，你也可以用 UBBCode? 来实现.也许你更希望使用 UBBCode? 而不是 HTML, 即使论坛允许使用 HTML, 因为使用起来代码较少也更安全.</p>
		<p>[回顾]:上集介绍了"调试程序","如何使用session","规范SQL语句"等15个问题（Php高手带路--问题汇总解答[1]）。本集继续作出16条常见问题的解答。</p>
		<p>16:我想修改MySQL的用户,密码<br />　　首先要声明一点，大部分情况下，修改MySQL是需要有mysql里的root权限的， </p>
		<p>　　所以一般用户无法更改密码，除非请求管理员.</p>
		<p>　　方法一 </p>
		<p>　　使用phpmyadmin，这是最简单的了，修改mysql库的user表， </p>
		<p>　　不过别忘了使用PASSWORD函数。</p>
		<p>　　方法二 </p>
		<p>　　使用mysqladmin，这是前面声明的一个特例。 </p>
		<p>　　mysqladmin -u root -p password mypasswd </p>
		<p>　　输入这个命令后，需要输入root的原密码，然后root的密码将改为mypasswd。 </p>
		<p>　　把命令里的root改为你的用户名，你就可以改你自己的密码了。 </p>
		<p>　　当然如果你的mysqladmin连接不上mysql server，或者你没有办法执行mysqladmin， </p>
		<p>　　那么这种方法就是无效的。 </p>
		<p>　　而且mysqladmin无法把密码清空。 <br />　　下面的方法都在mysql提示符下使用，且必须有mysql的root权限： </p>
		<p>　　方法三 </p>
		<p>　　mysql&gt; INSERT INTO mysql.user (Host,User,Password) </p>
		<p>　　VALUES('%','jeffrey',PASSWORD('biscuit')); </p>
		<p>　　mysql&gt; FLUSH PRIVILEGES </p>
		<p>　　确切地说这是在增加一个用户，用户名为jeffrey，密码为biscuit。 </p>
		<p>　　在《mysql中文参考手册》里有这个例子，所以我也就写出来了。 </p>
		<p>　　注意要使用PASSWORD函数，然后还要使用FLUSH PRIVILEGES。</p>
		<p>方法四 </p>
		<p>　　和方法三一样，只是使用了REPLACE语句 </p>
		<p>　　mysql&gt; REPLACE INTO mysql.user (Host,User,Password) </p>
		<p>　　VALUES('%','jeffrey',PASSWORD('biscuit')); </p>
		<p>　　mysql&gt; FLUSH PRIVILEGES </p>
		<p>　　方法五 </p>
		<p>　　使用SET PASSWORD语句， </p>
		<p>　　mysql&gt; SET PASSWORD FOR <a href="mailto:jeffrey@&quot;%">jeffrey@"%</a>" = PASSWORD('biscuit'); </p>
		<p>　　你也必须使用PASSWORD()函数， </p>
		<p>　　但是不需要使用FLUSH PRIVILEGES。</p>
		<p>　　方法六 </p>
		<p>　　使用GRANT ... IDENTIFIED BY语句 </p>
		<p>　　mysql&gt; GRANT USAGE ON *.* TO <a href="mailto:jeffrey@&quot;%">jeffrey@"%</a>" IDENTIFIED BY 'biscuit'; </p>
		<p>
				<br />　　这里PASSWORD()函数是不必要的，也不需要使用FLUSH PRIVILEGES。 <br />　　注意： PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。 </p>
		<p>
				<br />17:我想知道他是通过哪个网站连接到本页<br />　　PHP代码:</p>
		<p>　　&lt;?php</p>
		<p>　　//必须通过超级连接进入才有输出</p>
		<p>　　Echo $_SERVER['HTTP_REFERER'];</p>
		<p>　　?&gt;</p>
		<p>18:数据放入数据库和取出来显示在页面需要注意什么<br />　　入库时</p>
		<p>　　$str=addslashes($str);</p>
		<p>　　$sql="insert into `tab` (`content`) values('$str')";</p>
		<p>　　出库时</p>
		<p>　　$str=stripslashes($str);</p>
		<p>　　显示时</p>
		<p>　　$str=htmlspecialchars(nl2br($str)) ; <br />　　&lt;?php</p>
		<p>　　//$content来自数据库</p>
		<p>　　$content=nl2br(htmlspecialchars($content));</p>
		<p>　　$content=str_replace(" ","&amp;nbsp;",$content);</p>
		<p>　　$content=str_replace("\n","&lt;br&gt;\n",$content);</p>
		<p>　　?&gt;</p>
		<p>19:如何读取当前地址栏信息<br />　　PHP代码:</p>
		<p>　　&lt;?php </p>
		<p>　　$s="<a href="http://{$_SERVER['HTTP_HOST']}:{$_SERVER[&quot;SERVER_PORT&quot;]}{$_SERVER['SCRIPT_NAME'">http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME'</a>]}"; </p>
		<p>　　$se=''; <br />　　foreach ($_GET as $key =&gt; $value) { <br />　　$se.=$key."=".$value."&amp;"; <br />　　} <br />　　$se=Preg_Replace("/(.*)&amp;$/","$1",$se); <br />　　$se?$se="?".$se:"";<br />　　echo $s."?$se"; <br />　　?&gt; </p>
		<p>
				<br />20:我点击后退按钮,为什么之前填写的东西不见<br />　　这是因为你使用了session.</p>
		<p>　　解决办法:<br />　　PHP代码:</p>
		<p>　　&lt;?php session_cache_limiter('private, must-revalidate');session_start(); <br />　　.....................?&gt;</p>
		<p>21:怎么在图片里显示IP地址</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;? Header("Content-type: image/png"); </p>
		<p>　　$img = ImageCreate(180,50); <br />　　$ip = $_SERVER['REMOTE_ADDR'];</p>
		<p>　　 ImageColorTransparent($img,$bgcolor); </p>
		<p>　　$bgColor = ImageColorAllocate($img, 0x2c,0x6D,0xAF); // 背景颜色</p>
		<p>　　$shadow = ImageColorAllocate($img, 250,0,0); // 阴影颜色</p>
		<p>　　$textColor = ImageColorAllocate($img, oxff,oxff,oxff); // 字体颜色 </p>
		<p>　　ImageTTFText($img,10,0,78,30,$shadow,"d:/windows/fonts/Tahoma.ttf",$ip); <br />//显示背景 </p>
		<p>　　ImageTTFText($img,10,0,25,28,$textColor,"d:/windows/fonts/Tahoma.ttf","your ip is".$ip);</p>
		<p> // 显示IP 　　　</p>
		<p>　　ImagePng($img); 　　　</p>
		<p>　　imagecreatefrompng($img); <br />　　ImageDestroy($img);　　　　　　</p>
		<p>　　?&gt;</p>
		<p>22:如何取得用户的真实IP</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;? function iptype1 () {</p>
		<p>　　 if (getenv("HTTP_CLIENT_IP"))</p>
		<p>　　 { <br />　　return getenv("HTTP_CLIENT_IP"); </p>
		<p>　　} </p>
		<p>　　else </p>
		<p>　　{ </p>
		<p>　　return "none"; <br />　　} </p>
		<p>　　} </p>
		<p>　　function iptype2 () { </p>
		<p>　　if (getenv("HTTP_X_FORWARDED_FOR")) </p>
		<p>　　{</p>
		<p>　　 return <br />　　getenv("HTTP_X_FORWARDED_FOR"); </p>
		<p>　　} </p>
		<p>　　else { </p>
		<p>　　return "none"; <br />　　} </p>
		<p>　　} </p>
		<p>function iptype3 () { </p>
		<p>　　if (getenv("REMOTE_ADDR")) </p>
		<p>　　{</p>
		<p>　　 return getenv("REMOTE_ADDR"); <br />　　}</p>
		<p>　　 else { </p>
		<p>　　return "none";</p>
		<p>　　 }</p>
		<p>　　 } </p>
		<p>　　function ip() {</p>
		<p>　　 $ip1 = iptype1();</p>
		<p>　　 $ip2 = iptype2(); </p>
		<p>　　$ip3 = iptype3(); </p>
		<p>　　if (isset($ip1) &amp;&amp; $ip1 != "none" &amp;&amp; $ip1 != "unknown") </p>
		<p>　　{ </p>
		<p>　　return $ip1; </p>
		<p>　　}</p>
		<p>　　 elseif (isset($ip2) &amp;&amp; $ip2 != "none" &amp;&amp; $ip2 != "unknown") <br />　　{ </p>
		<p>　　return $ip2; </p>
		<p>　　} </p>
		<p>　　elseif (isset($ip3) &amp;&amp; $ip3 != "none" &amp;&amp; $ip3 != "unknown")</p>
		<p>　　 { </p>
		<p>　　return $ip3; </p>
		<p>　　}</p>
		<p>　　 else </p>
		<p>　　{ return "none"; } </p>
		<p>　　}</p>
		<p>　　 Echo ip(); </p>
		<p>　　?&gt; </p>
		<p>
				<br />23:如何从数据库读取三天内的所有记录<br />　　首先表格里要有一个DATETIME字段记录时间,</p>
		<p>　　格式为'2003-7-15 16:50:00'<br />　　SELECT * FROM `xltxlm` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) &lt;= 3;</p>
		<p>
				<br />24:如何远程链接Mysql数据库</p>
		<p>　　在增加用户的mysql表里有一个host字段，修改为"%",或者指定允许连接的ip地址,这样，你就可以远程调用了。<br />　　$link=mysql_connect("192.168.1.80:3306","root","");</p>
		<p>
				<br />25:正则到底怎么用</p>
		<p>正则表达式中的特殊字符</p>
		<p>26:用Apache后,主页出现乱码 </p>
		<p>　　方法一: </p>
		<p>　　AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset off <br />　　方法二: </p>
		<p>　　AddDefaultCharset GB2312</p>
		<p>
				<br />27:为什么单引号,双引号在接受页面变成(\'\")<br />　　解决方法:</p>
		<p>　　方法一:在php.ini中设置:magic_quotes_gpc = Off</p>
		<p>　　方法二: $str=stripcslashes($str)</p>
		<p>
				<br />28:怎么让程序一直运行下去,而不是超过30秒就停止<br />　　set_time_limit(60)//最长运行时间一分钟</p>
		<p>　　set_time_limit(0)//运行到程序自己结束,或手动停止</p>
		<p>
				<br />29:计算当前在线人数<br />　　例子一:用文本实现<br />　　PHP代码:</p>
		<p>　　&lt;?php </p>
		<p>　　//首先你要有读写文件的权限</p>
		<p>　　//本程序可以直接运行,第一次报错,以后就可以</p>
		<p>　　 $online_log = "count.dat"; //保存人数的文件,</p>
		<p>　　 $timeout = 30;//30秒内没动作者,认为掉线 </p>
		<p>　　 $entries = file($online_log); <br />　　 $temp = array(); </p>
		<p>
				<br />for ($i=0;$i&lt;count($entries);$i++) { </p>
		<p>　　 $entry = explode(",",trim($entries[$i])); </p>
		<p>　　 if (($entry[0] != getenv('REMOTE_ADDR')) &amp;&amp; ($entry[1] &gt; time())) <br />{ </p>
		<p>　　 array_push($temp,$entry[0].",".$entry[1]."\n"); //取出其他浏览者的信息,并去掉超时者,保存进$temp</p>
		<p>　　 } </p>
		<p>　　 } <br />　　 array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."\n"); <br />//更新浏览者的时间</p>
		<p>　　 $users_online = count($temp); //计算在线人数<br />　　 $entries = implode("",$temp); </p>
		<p>　　 //写入文件</p>
		<p>　　 $fp = fopen($online_log,"w"); </p>
		<p>　　 flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作</p>
		<p>　　 fputs($fp,$entries); </p>
		<p>　　 flock($fp,LOCK_UN); </p>
		<p>　　 fclose($fp); <br />　　 echo "当前有".$users_online."人在线"; <br />　　?&gt; </p>
		<p>
				<br />30:什么是模板,怎么用<br />　　我用的是phplib模板</p>
		<p>　　下面是其中几个函数的使用<br />　　$T-&gt;Set_File("随便定义","模板文件.tpl"); <br />　　$T-&gt;Set_Block("在set_file中定义的","&lt;!-- 来自模板 --&gt;","随便定义"); </p>
		<p>　　$T-&gt;Parse("在Set_Block中定义的","&lt;!-- 来自模板 --&gt;",true); </p>
		<p>　　$T-&gt;Parse("随便输出结果","在Set_File中定义的"); <br />　　设置循环格式为:<br />　　&lt;!--(多于一个空格) BEGIN $handle(多于一个空格)--&gt;<br />　　如何将模板生成静态网页</p>
		<p>
				<br />　　PHP代码:</p>
		<p>　　&lt;?php</p>
		<p>　　//这里使用phplib模板</p>
		<p>　　............</p>
		<p>　　............</p>
		<p>　　$tpl-&gt;parse("output","html");</p>
		<p>　　$output = $tpl-&gt;get("output");// $output 为整个网页内容</p>
		<p>
				<br />　　function wfile($file,$content,$mode='w') {</p>
		<p>　　$oldmask = umask(0);</p>
		<p>　　$fp = fopen($file, $mode);</p>
		<p>　　if (!$fp) return false;</p>
		<p>　　fwrite($fp,$content);</p>
		<p>　　fclose($fp);</p>
		<p>　　umask($oldmask);</p>
		<p>　　return true;</p>
		<p>　　}</p>
		<p>　　// 写到文件里</p>
		<p>　　Wfile($FILE,$output);</p>
		<p>　　header("location:$FILE");//重定向到生成的网页</p>
		<p>　　}</p>
		<p>　　?&gt; <br />　　phplib下载地址 smarty下载地址 </p>
		<p>
				<br />31:怎么用php解释字符　　　</p>
		<p>　　比如:输入2+2*(1+2),自动输出8　　可以用eval函数</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;form method=post action=""&gt;</p>
		<p>　　&lt;input type="text" name="str"&gt;&lt;input type="submit"&gt;</p>
		<p>　　&lt;/form&gt;</p>
		<p>　　&lt;?php</p>
		<p>　　$str=$_POST['str'];</p>
		<p>　　eval("\$o=$str;");</p>
		<p>　　Echo "$o";</p>
		<p>　　?&gt;</p>
		<p>
				<br />　　到此，php的问题解答就为大家介绍完毕，希望能对各位有所帮助。<br /></p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/62766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-08-10 12:19 <a href="http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHPliB类详解</title><link>http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 10 Aug 2006 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/62765.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/62765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/62765.html</trackback:ping><description><![CDATA[
		<strong>转载：<a href="http://bbs.cnaust.com/archiver/?tid-4849.html">http://bbs.cnaust.com/archiver/?tid-4849.html</a><br /><br />PHPliB类详解<br /><br /></strong>自已的BLOG空间打不开了，放些资料在这。<br /><br /><br />&lt;?php  <br />/*  <br />* PHPlib模板7.4中文版(不足之处还请各位指正)  <br />* (C) Copyright 1999-2000 NetUSE GmbH  <br />* Kristian Koehntopp  <br />* 彭赞群注释于2004年6月,QQ:9537075 TEL:13787877670  <br />* Email:mylovepzq@163.com  <br />*/  <br /><br /><br />/*这里是定义类Template*/  <br />class Template  <br />{   <br />/* 如果设置了，则输出参数 */  <br />var $classname = "Template";  <br />var $debug = false; //是否调试  <br />var $root = ".";//root为模板文件的存放目录  <br />var $file = array(); //包含了所有的模板文件名和模板名的数组  <br />var $varkeys = array(); //存放文本元素的键名  <br />var $varvals = array(); //存放文本元素的值  <br />var $unknowns = "remove";   <br />/* "remove" =&gt; 删除未定义的变量 "comment" =&gt; 将未定义的变量变成注释 "keep" =&gt; 保留未定义的变量 */  <br />var $halt_on_error = "yes";  <br />/* "yes" =&gt; 退出 "report" =&gt; 报告错误，继续运行* "no" =&gt; 忽略错误*/  <br />var $last_error = "";  <br />/* 上一次的错误保存在这里 */  <br />/* public: 构造函数  <br />* root: 模板目录  <br />* unknowns: 如何处理未知的变量(译者：变量定义为{ name })  <br />*/  <br /><br /><br />/*这里是定义函数Template*/  <br />function Template($root = ".", $unknowns = "remove")   <br />{   <br />if ($this-&gt;debug &amp; 4)   <br />{   <br />echo "&lt;p&gt;&lt;b&gt;模板:&lt;/b&gt; root = $root, unknowns = $unknowns&lt;/p&gt;\n";  <br />}  <br />$this-&gt;set_root($root);//默认将文件目录设置为相同的目录  <br />$this-&gt;set_unknowns($unknowns);//unknowns默认设置为"remove"  <br />}  <br /><br /><br />/*这里是函数set_root*/  <br />function set_root($root)  <br />{   <br />if ($this-&gt;debug &amp; 4)   <br />{   <br />echo "&lt;p&gt;&lt;b&gt;设置根目录:&lt;/b&gt; root = $root&lt;/p&gt;\n";  <br />}  <br />if (!is_dir($root))  <br />{   <br />$this-&gt;halt("设置根目录: $root 不是一个无效的目录.");  <br />return false;  <br />}  <br />$this-&gt;root = $root;  <br />return true;  <br />}  <br /><br /><br />//这里是函数set_unknowns,即对未知变量的处理  <br />function set_unknowns($unknowns = "remove")  <br />{   <br />if ($this-&gt;debug &amp; 4)  <br />{   <br />echo "&lt;p&gt;&lt;b&gt;未知的:&lt;/b&gt; 未知 = $unknowns&lt;/p&gt;\n";  <br />}  <br />$this-&gt;unknowns = $unknowns;  <br />}  <br /><br /><br />/*这里是函数set_file.......................................................*/  <br />//该方法在数组file中根据$varname提供的键名加入值  <br />function set_file($varname, $filename = "")  <br />{   <br />if (!is_array($varname))//如果varname是数组  <br />{   <br />if ($this-&gt;debug &amp; 4)  <br />{   <br />echo "&lt;p&gt;&lt;b&gt;设置文件:&lt;/b&gt; (with scalar) varname = $varname, filename = $filename&lt;/p&gt;\n";  <br />}  <br />if ($filename == "")//如果文件名为空,输出错误  <br />{   <br />$this-&gt;halt("设置文件:变量名 $varname 文件名是空的.");  <br />return false;  <br />}  <br />$this-&gt;file[$varname] = $this-&gt;filename($filename);  <br />}   <br />else  <br />{   <br />reset($varname);//将varname的键名作为file数组的键名  <br />//将键名对应的值作为file数组的值  <br />while(list($v, $f) = each($varname))  <br />{   <br />if ($this-&gt;debug &amp; 4)  <br />{   <br />echo "&lt;p&gt;&lt;b&gt;set_file:&lt;/b&gt; (with array) varname = $v, filename = $f&lt;/p&gt;\n";  <br />}  <br />if ($f == "")  <br />{   <br />$this-&gt;halt("set_file: For varname $v filename is empty.");  <br />return false;  <br />}  <br />$this-&gt;file[$v] = $this-&gt;filename($f);  <br />}  <br />}  <br />return true;  <br />}  <br /><br /><br />//该方法取出某个父模板文件中的一个子模板  <br />//将其作为块来加载  <br />//并用另外一个模板变量取代之  <br />/* public: set_file(array $filelist)  <br />* comment: 设置多个模板文件  <br />* filelist: （句柄，文件名）数组  <br />* public: set_file(string $handle, string $filename)  <br />* comment: 设置一个模板文件  <br />* handle: 文件的句柄  <br />* filename: 模板文件名  <br />*/  <br />function set_block($parent, $varname, $name = "") {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;set_block:&lt;/b&gt; parent = $parent, varname = $varname, name = $name&lt;/p&gt;\n";  <br />}  <br />if (!$this-&gt;loadfile($parent)) {   <br />$this-&gt;halt("set_block: unable to load $parent.");  <br />return false;  <br />}  <br />if ($name == "") {   <br />$name = $varname;//如果没有指定模板变量的值就用子模板名作为模板变量名  <br />}  <br /><br />$str = $this-&gt;get_var($parent);  <br />$reg = "/[ \t]*&lt;!--\s+BEGIN $varname\s+--&gt;\s*?\n?(\s*.*?\n?)\s*&lt;!--\s+END $varname\s+--&gt;\s*?\n?/sm";  <br />preg_match_all($reg, $str, $m);  <br />$str = preg_replace($reg, "{ " . "$name }", $str);  <br />$this-&gt;set_var($varname, $m[1][0]);  <br />$this-&gt;set_var($parent, $str);  <br />return true;  <br />}  <br /><br /><br />//该方法向Varname和varkeys数组中添加新的键一值对  <br />/* public: set_var(array $values)  <br />* values: (变量名，值)数组  <br />* public: set_var(string $varname, string $value)  <br />* varname: 将被定义的变量名  <br />* value: 变量的值  <br />*/  <br />function set_var($varname, $value = "", $append = false) {   <br />if (!is_array($varname))//如果不是阵列  <br />{   <br />if (!empty($varname)) //如果是空的  <br />{   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;set_var:&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $varname, htmlentities($value));  <br />}  <br />$this-&gt;varkeys[$varname] = "/".$this-&gt;varname($varname)."/";  <br />if ($append &amp;&amp; isset($this-&gt;varvals[$varname])) {   <br />$this-&gt;varvals[$varname] .= $value;  <br />} else {   <br />$this-&gt;varvals[$varname] = $value;  <br />}  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (!empty($k)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;set_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $k, htmlentities($v));  <br />}  <br />$this-&gt;varkeys[$k] = "/".$this-&gt;varname($k)."/";  <br />if ($append &amp;&amp; isset($this-&gt;varvals[$k])) {   <br />$this-&gt;varvals[$k] .= $v;  <br />} else {   <br />$this-&gt;varvals[$k] = $v;  <br />}  <br />}  <br />}  <br />}  <br />}  <br /><br /><br />//定义函数clear_var  <br />function clear_var($varname) {   <br />if (!is_array($varname))//如果varname不是阵列  <br />{   <br />if (!empty($varname)) //如果是空的  <br />{   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;clear_var:&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $varname);  <br />}  <br />$this-&gt;set_var($varname, "");  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (!empty($v)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;clear_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $v);  <br />}  <br />$this-&gt;set_var($v, "");  <br />}  <br />}  <br />}  <br />}  <br /><br /><br />/*这里是函数unset_var,删除变量的定义*/  <br />function unset_var($varname) {   <br />if (!is_array($varname)) {   <br />if (!empty($varname)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;unset_var:&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $varname);  <br />}  <br />unset($this-&gt;varkeys[$varname]);  <br />unset($this-&gt;varvals[$varname]);  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (!empty($v)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;unset_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $v);  <br />}  <br />unset($this-&gt;varkeys[$v]);  <br />unset($this-&gt;varvals[$v]);  <br />}  <br />}  <br />}  <br />}  <br /><br /><br />//将模板文件中的变化内容替换成确定内容的操作,实现数据和显示的分离  <br />function subst($varname) {   <br />$varvals_quoted = array();  <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;subst:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br />if (!$this-&gt;loadfile($varname)) //装载模板文件,如果出错就停止  <br />{   <br />$this-&gt;halt("subst: unable to load $varname.");  <br />return false;  <br />}  <br /><br />reset($this-&gt;varvals);  <br />while(list($k, $v) = each($this-&gt;varvals)) {   <br />$varvals_quoted[$k] = preg_replace(array(’/\\\\/’, ’/\$/’), array(’\\\\\\’, ’\\\\$’), $v);  <br />}  <br /><br />//读入文件内容到字符串中并在下行对已知键值进行替换并返回结果  <br />$str = $this-&gt;get_var($varname);  <br />$str = preg_replace($this-&gt;varkeys, $varvals_quoted, $str);  <br />return $str;  <br />}  <br /><br /><br />//同subst,只是直接输出结果  <br />function psubst($varname) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;psubst:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br />print $this-&gt;subst($varname);  <br /><br />return false;  <br />}  <br /><br /><br />//将varname代表的一个或多个文件中的内容完成替换  <br />//存放在target为键值的varvals数组无素中或追加到其后  <br />//返回值和sub相同  <br />function parse($target, $varname, $append = false) {   <br />if (!is_array($varname)) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;parse:&lt;/b&gt; (with scalar) target = $target, varname = $varname, append = $append&lt;/p&gt;\n";  <br />}  <br />$str = $this-&gt;subst($varname);  <br />if ($append) {   <br />$this-&gt;set_var($target, $this-&gt;get_var($target) . $str);  <br />} else {   <br />$this-&gt;set_var($target, $str);  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($i, $v) = each($varname)) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;parse:&lt;/b&gt; (with array) target = $target, i = $i, varname = $v, append = $append&lt;/p&gt;\n";  <br />}  <br />$str = $this-&gt;subst($v);  <br />if ($append) {   <br />$this-&gt;set_var($target, $this-&gt;get_var($target) . $str);  <br />} else {   <br />$this-&gt;set_var($target, $str);  <br />}  <br />}  <br />}  <br /><br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;parse:&lt;/b&gt; completed&lt;/p&gt;\n";  <br />}  <br />return $str;  <br />}  <br /><br /><br />//同parse方法,只是该方法将结果输出  <br />function pparse($target, $varname, $append = false) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;pparse:&lt;/b&gt; passing parameters to parse...&lt;/p&gt;\n";  <br />}  <br />print $this-&gt;finish($this-&gt;parse($target, $varname, $append));  <br />return false;  <br />}  <br /><br /><br />//返回所有的键一值对中的值所组成的数组  <br />function get_vars() {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;get_vars:&lt;/b&gt; constructing array of vars...&lt;/p&gt;\n";  <br />}  <br />reset($this-&gt;varkeys);  <br />while(list($k, $v) = each($this-&gt;varkeys)) {   <br />$result[$k] = $this-&gt;get_var($k);  <br />}  <br />return $result;  <br />}  <br /><br /><br />//根据键名返回对应的键一值勤对应的值  <br />function get_var($varname) {   <br />if (!is_array($varname)) //如果不是阵列  <br />{   <br />if (isset($this-&gt;varvals[$varname])) //如果变量不存在  <br />{   <br />$str = $this-&gt;varvals[$varname];  <br />} else {   <br />$str = "";  <br />}  <br />if ($this-&gt;debug &amp; 2) {   <br />printf ("&lt;b&gt;get_var&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $varname, htmlentities($str));  <br />}  <br />return $str;  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (isset($this-&gt;varvals[$v])) {   <br />$str = $this-&gt;varvals[$v];  <br />} else {   <br />$str = "";  <br />}  <br />if ($this-&gt;debug &amp; 2) {   <br />printf ("&lt;b&gt;get_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $v, htmlentities($str));  <br />}  <br />$result[$v] = $str;  <br />}  <br />return $result;  <br />}  <br />}  <br /><br /><br />//如果加载文件失败,返回错误并停止  <br />function get_undefined($varname) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;get_undefined:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br />if (!$this-&gt;loadfile($varname)) {   <br />$this-&gt;halt("get_undefined: unable to load $varname.");  <br />return false;  <br />}  <br /><br />preg_match_all("/{ ([^ \t\r\n }]+) }/", $this-&gt;get_var($varname), $m);  <br />$m = $m[1];  <br />//如果无法找到匹配的文本,返回错误  <br />if (!is_array($m)) {   <br />return false;  <br />}  <br />//如果能找到大括号中的非空字符,则将其值作为键值,组成一个新的数组  <br />reset($m);  <br />while(list($k, $v) = each($m)) {   <br />if (!isset($this-&gt;varkeys[$v])) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;get_undefined:&lt;/b&gt; undefined: $v&lt;/p&gt;\n";  <br />}  <br />$result[$v] = $v;  <br />}  <br />}  <br />//如是该数组不为空就返回该数组,否则就返回错误  <br />if (count($result)) {   <br />return $result;  <br />} else {   <br />return false;  <br />}  <br />}  <br /><br /><br />//完成对str的最后的处理工作,利用类的属性unknowns来确定对模板中无法处理的动态部分的处理方法  <br />function finish($str) {   <br />switch ($this-&gt;unknowns) {   <br />case "keep": //保持不变  <br />break;  <br /><br />case "remove": //删除所有的非控制符  <br />$str = preg_replace(’/{ [^ \t\r\n }]+ }/’, "", $str);  <br />break;  <br /><br />case "comment"://将大括号中的HTML注释  <br />$str = preg_replace(’/{ ([^ \t\r\n }]+) }/’, "&lt;!-- Template variable \\1 undefined --&gt;", $str);  <br />break;  <br />}  <br /><br />return $str;  <br />}  <br /><br /><br />//将参数变量对诮的数组中的值处理后输出  <br />function p($varname) {   <br />print $this-&gt;finish($this-&gt;get_var($varname));  <br />}  <br /><br /><br />//将参数变量对应的数组中的值处理后返回  <br />function get($varname) {   <br />return $this-&gt;finish($this-&gt;get_var($varname));  <br />}  <br /><br /><br />//检查并补充给定的文件名  <br /><br />function filename($filename) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;filename:&lt;/b&gt; filename = $filename&lt;/p&gt;\n";  <br />}  <br />if (substr($filename, 0, 1) != "/")   <br />//如果文件名不是以斜杠开头,则表示是相对路径,将其补充为完整的绝对路径   <br />{   <br />$filename = $this-&gt;root."/".$filename;  <br />}  <br />//如果文件不存在  <br />if (!file_exists($filename)) {   <br />$this-&gt;halt("filename: file $filename does not exist.");  <br />}  <br />return $filename;//返回文件名  <br />}  <br /><br /><br />//对变量名进行处理,将正则表达式中的敏感字符变为转义字符,并在变量名两端加上大括号  <br />function varname($varname) {   <br />return preg_quote("{ ".$varname." }");  <br />}  <br /><br /><br />//该方法根据varname加载文件到键一值对中  <br />function loadfile($varname) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;loadfile:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br /><br />if (!isset($this-&gt;file[$varname])) //如果没有指定就返加错误  <br />{   <br />// $varname does not reference a file so return  <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;loadfile:&lt;/b&gt; varname $varname does not reference a file&lt;/p&gt;\n";  <br />}  <br />return true;  <br />}  <br /><br />if (isset($this-&gt;varvals[$varname]))//如果已经加载了varname为名柄的文件,直接返回真值  <br />{   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;loadfile:&lt;/b&gt; varname $varname is already loaded&lt;/p&gt;\n";  <br />}  <br />return true;  <br />}  <br />$filename = $this-&gt;file[$varname];//句柄有效则取出对应的文件名  <br />$str = implode("", @file($filename));//将文件的每一行连接成一个字符串  <br />if (empty($str)) //字符串空说明文件空或者不存在,返回错误  <br />{   <br />$this-&gt;halt("loadfile: While loading $varname, $filename does not exist or is empty.");  <br />return false;  <br />}  <br />if ($this-&gt;debug &amp; 4) {   <br />printf("&lt;b&gt;loadfile:&lt;/b&gt; loaded $filename into $varname&lt;br&gt;\n");  <br />}  <br />$this-&gt;set_var($varname, $str);//如果文件不为空,用$varname作为句柄,str为变量名  <br />//向键值对中添加新的键值  <br /><br />return true;  <br />}  <br /><br />//将分析结果保存到文件中去  <br />  function savetofile ($dir,$varname){   <br />   $data=$this-&gt;finish($this-&gt;get_var($varname));  <br />   $fp=fopen($dir,"w+");  <br />   fwrite($fp,$data);  <br />  }  <br /><br /><br />  //清除已赋值数组  <br />   function renew(){   <br />    $this-&gt;varkeys=array();  <br />    $this-&gt;varvals=array();  <br />    $this-&gt;file=array();  <br />    }  <br /><br /><br />//出错提示并终止程序运行  <br />function halt($msg) {   <br />$this-&gt;last_error = $msg;  <br /><br />if ($this-&gt;halt_on_error != "no") {   <br />$this-&gt;haltmsg($msg);  <br />}  <br /><br />if ($this-&gt;halt_on_error == "yes") {   <br />die("&lt;b&gt;终止.&lt;/b&gt;");  <br />}  <br /><br />return false;  <br />}  <br /><br /><br />//出错提示  <br />function haltmsg($msg) {   <br />printf("&lt;b&gt;模板错误:&lt;/b&gt; %s&lt;br&gt;\n", $msg);  <br />}  <br /><br />}  <br />?&gt;<br /><br /><br /><br /><br /><strong>SOLO</strong><div class="subtable altbg2 t_msg">PHPLIB Template类的使用的.诚然,网络上已经很多相关的话题了,但据我观察,中文的资料实在不多,且大多是讲的太笼统,没能全面阐述它的用法,即使看了还是一知半解.所以本文就期望通过对它的比较全面的介绍,让你能达到入门的水平. <br />何谓"模板"技术<br /><br />我们的最初观察是将界面和实现代码分离开来,这样做的目的是将美工和程序员的工作分离开来.PHP的一个优点是可以把PHP代码嵌入HTML里面,这样你就不必再把大段HTML代码用函数print()输出来.<br />print("&lt;table border=0 cellspacing=1 cellpadding=2 width=100%&gt;"); <br />print("&lt;tr&gt;"); <br />print("&lt;td&gt;"); <br />print("我爱你 kiki"); <br />print("&lt;/td&gt;"); <br />print("&lt;/tr&gt;"); <br />print("&lt;/table&gt;"); <br />这段代码对界面维护来说是相当困难的,除非程序员做这样事情且他对样式表,HTML非常精通.取而代之的我们用<br />&lt;table border=0 cellspacing=1 cellpadding=2 width=100%&gt; <br />    &lt;tr&gt; <br />        &lt;td&gt; <br />            &lt;?php print("我爱你 kiki ");?&gt; <br />        &lt;/td&gt; <br />    &lt;/tr&gt; <br />&lt;/table&gt; <br />这样,做美工设计的只要不碰PHP代码,就可以很方便地改变这个表格的样式,如果使用dreamweaver等所见即所的工具,将会更加方便.<br /><br />现在的一个问题是,如果美工正在修改的话,程序员仍需要把这个文件取回来,才能改变里面的PHP代码,修改完后再交给美工,这样循环往复,往往要花费大量的时间和精力,如果你所在公司是采取这种模式的话,恐怕老板为了节省时间,会把很多界面设计也交给程序员来做,毕竟他不会让你们任何一个闲座着等待.作为程序员的你此时可能会梦想:如果程序员只要负责写程序代码,不理会令人烦躁的界面,那就太好了.<br /><br />或许Fast Template诞生那刻起(我不敢确定它是最早的PHP模板处理类,但用起来确实很方便),你的梦想就几近实现.策划们把东西交给你,当然里面的元素都写好了的,形如以下tpl.html<br />&lt;table border=0 cellspacing=1 cellpadding=2 width=100%&gt; <br />    &lt;tr&gt; <br />        &lt;td&gt; <br />            我爱你{MY_LOVE} <br />        &lt;/td&gt; <br />    &lt;/tr&gt; <br />&lt;/table&gt; <br />你只需要在程序里给这些元素(MY_LOVE)赋值就行了tpl.php<br />    $tpl-&gt;assign("MY_LOVE", "kiki"); <br />你基本上不用管这些元素的样式(比如字体,宽度,高度等),所在位置,甚至这些元素将来可能不再使用了.与此同时,美工那边把元素放进一个HTML页面里(这个页面就是我们所说的"模板"),他也不用担心会不小心把你的程序给搞坏了.然后做完后交给一个专门负责程序和美工结合的人(当然在国内也是程序员做这样事情),他很可能只需要很小的几个修改就可以把两者结合的很好.这样对你,对美工,都大大提高了工作效率,老板自然也会很高兴啦.<br /><br />所以我这里所说的"模板"技术,就是可以将程序和美工分离的技术,注意不是逻辑抽象层与表现层的分离.一来,那样将会让人不知所云,因为"逻辑抽象"这四个字就已经太抽象了,且表现层并只是美工所做的模板.所以,很多人试图把Fast Template,PHPLIB Template两个与Smarty相比较,在我看来,这是明显不对的.<br /><br />PHPLIB Template类也是一个用PHP代码处理模板的一个类.也是本文要将要阐述的一个模板类.同上面讲的一样,它能把模板中的"元素"替换为你为它设定的值",且处理的很很好,也容易扩展,由于使用了preg_函数,所以速度也比较快.很多人都会提出一个意见:使用模板会让你的代码运行的更慢,确实是这样的,如果你使用嵌入式写法,会快一些,如果把PHP连同HTML全部写入PHP里(用 print("&lt;html标签&gt;"); ),可能会更快.但如果综合考虑整个项目的开发效率,以及后期维护性的话,这些代价是可以承受的,而且慢也不会慢哪里去,真正的问题所在可能是你的模板实在是太大了.当然,你也可以改进这个模板类,让它运行的更快.<br /><br />提起PHPLIB Template,很多人自然会联想起Fast Template来,我也不例外,因为两者很多地方都很相近.对此,很多人都做了比较,在这里我就不再详述了,或许王晨的这篇文章值得一看: 在PHP世界中选择最合适的模板<br /><br /><br />获取<br /><br />可以从这里下载 [url]http://www.sanisoft.com/phplib/download.phpPHPLIB[/url] ,然后从压缩包中php目录下取出template.inc,就可以供我们使用了.<br /><br />文档<br /><br />英文文档 [url]http://www.sanisoft.com/phplib/manual/template.php[/url] <br />我翻译的中文文档(仅做参考) [url]http://www.4kiki.net/php_lib_template/[/url] <br />还有网上的很多资源,可以通过google搜索得到.<br /><br />从类里面注释可以知道,最新版本是2002/07/11 22:29:51的1.12版,所以,你或许需要修改一些东西,在你懂的前提下.我们还可以下载它的PEAR集成版本([url]http://pear.php.net/package/HTML_Template_PHPLIB/download)[/url] , 不过你的PHP版本需要在4.3.0以上.<br /><br /><br /><br /><br /><div class="subtable altbg1"><span class="right">2005-11-8 23:19</span><b>SOLO</b></div><div class="subtable altbg2 t_msg">一个封装很好的类对使用者(可能不是开发者本人)来说,最大的好处就是,你无需知道类内部是怎么运作的,只需知道如何利用它提供的接口做你想做的事情即可.所以,本文不打算具体讲述PHPLIB Template(以下简称Template)是如何将"元素"转换成"值"的,你需要了解的是"它能这样做",而不是"它为什么能这样做". <br />好了,下面我们就开始它的第一个应用了.<br /><br />先在我们要测试的网站的目录下建两个文件夹inc和template.目录inc下放引用文件,比如类库,函数库等,这里我们就把template.inc放如该目录下.tempate下放模板文件,我们先建一个模板文件first.html,内容如下<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第一个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />真想对你说：我爱你 {lover} ，但我却不敢说，因为我知道你爱的人是 {man}. <br />&lt;P&gt; <br />&lt;font color="#0000FF"&gt;{author}&lt;/font&gt; 于 {date} <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br />用inc,template命名文件目录,都是我的个人习惯,你完全可以采取不同的方式.我用扩展名为.html的名称命名模板文件,是为了方便美工用frontpage或者dreamweaver修改,但这完全取决于你自己的习惯.<br /><br />first.html模板中的{lover},{man},{author}可以称为"模板变量",用花括号({})把变量名称括住即组成一个模板变量.模板变量就是模板元素的一种。你可能会担心它的命名问题,其实除了空格(" "),回车换行("\r", "\n"),tab(\t)外它都被视为是正确的.所以<br />{your-lover}<br />也是正确的.这点有时可能会令你很痛苦,因为模板里的有些javascript代码可能无意间变没有了,比如<br />if(a&gt;b){document.write("i love u");}<br />中的<br />{document.write("i love u");}<br />也被视为一个变量了.上面的代码在你选的模板处理方式下,可能会变成if(a&gt;b){},从而导致javascript错误.为什么会"变没"了呢?稍后将做解释.<br /><br />上面我们定义的三个变量{lover},{man},{author}的原因是,我们想随时改变它们的值.下面我们就来做这个工作.新建first.php文件,内容如下:<br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template", "keep"); //注1 <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "first.html"); //注2 <br /><br />//给文件中的模板变量赋值 <br />$tpl-&gt;set_var("lover", "kiki"); //注3 <br />$tpl-&gt;set_var("man", "ccterran"); //注4 <br />$tpl-&gt;set_var("author", "iwind"); //注5 <br /><br />//完成替换 <br />$tpl-&gt;parse("mains", "main"); //注6 <br /><br />//输出替换的结果 <br />$tpl-&gt;p("mains"); //注7 <br /><br />?&gt; <br />浏览器中浏览这个文件,你就会发现输出<br /><br /><br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br /><br />iwind 于 {date} <br /><br /><br />这一切正如我们所期望的(除了{date}).注1<br />$tpl = new Template("template", "keep"); <br />是创建一个Template类的实例对象.它有两个参数,都是可选的.<br /><br />第一个参数是模板所在目录,如果不设置则为"."(即当前目录),由于我们刚才把模板文件first.html放到template下了,所以这里为template.注意它一般使用相对路径,如果你用相对于根目录(比如 /phplib/test/template)的路径,就会出现<br />Template Error: set_root: /phplib/test/template is not a directory. <br />Halted. <br />的错误.<br /><br />第二个参数是指定模板类对"未完成处理"变量的处理方式,所谓"未完成处理"指的是模板变量未赋值,块未完成替换工作(下面一节将讲到它),它有三个值可选,分别为"keep","comment","remove":<br />如果设为"keep",这些变量将原封不动的保留下来.<br />如果设为"comment",那么会在报错的同时,将未完成处理的变量全部转换成HTML的注释.<br />如果设为"remove",未完成处理的变量便会被删除(这也是默认的情况).<br /><br />所以在上面的例子中,我指定的是"keep",于是{date}因为未赋值,所以还保留着.而缺省的情况下是"remove",所以,如果我这样创建实例对象<br />$tpl = new Template("template", "remove");<br />或者<br />$tpl = new Template("template");<br />的话,输出就变成了<br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br /><br />iwind 于<br /><br /><br /><br />可以看出{date}被删除了.如果是<br />$tpl = new Template("template", "comment");<br /><br />它的结果将是<br /><br /><br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br /><br />iwind 于<br /><br /><br />看起来和"remove"方式一样,但查看源文件,我们会发现<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第一个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br />&lt;P&gt; <br />&lt;font color="#0000FF"&gt;iwind&lt;/font&gt; 于 &lt;!-- Template variable date undefined --&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />其中有&lt;!-- Template variable date undefined --&gt;的错误信息,告诉我们date变量未定义(赋值).<br /><br />用"comment"或许对程序的调试很有帮助.<br /><br />我们再回头看看<br />if(a&gt;b){document.write("i love u");} <br />中<br />{document.write("i love u");} <br />会"变没"的问题,是因为模板类视之为模板变量,但你没有给它指定值(当然会没有),且你没有指定"keep"方式来处理未定义变量,所以它就被"remove"了.<br /><br />所以在模板使用过程中应该多多注意这些问题.<br /><br />注2是将一个模板文件加载进来,事实上你可以一次加载多个模板(在第四节将讲到这个问题).你可以想象<br />$tpl-&gt;set_file("main", "first.html"); <br />把"first.html"内容给变量"main"(尽管很多人称之为"句柄",但本文决定不谈"句柄"),所以"main"的值就变成模板的内容了,包含着那些模板变量.<br /><br />注3,注4,注5,是给模板变量赋值.值是什么,你自然可以随便定.比如你还可以<br />$tpl-&gt;set_var("lover", "kiki1"); <br />$tpl-&gt;set_var("man", "ccterran1"); <br />$tpl-&gt;set_var("author", "iwind_php"); <br />你也可以一次完成给一列的变量赋值.这样<br />$tpl-&gt;set_var( <br />array("lover"=&gt;"kiki", "man"=&gt;"ccterran", "author"=&gt;"iwind") <br />); <br />如果你想设置一个变量的值为空的话,可以<br />$tpl-&gt;set_var("man", ""); <br />或者<br />$tpl-&gt;set_var("man"); <br /><br />注6,是执行将上面$tpl-&gt;set_var给模板变量指定的值替换掉模板中的模板变量这个操作,第一个参数即为模板分析的结果,也可以视为一个变量.<br /><br />当然注7的 $tpl-&gt;p("mains"); 就将模板分析的结果如你所愿的输出啦.<br /><br />喏,恭喜你,你的第一个模板类应用就完成了.你可能不小心弄错了哪个地方,模板类默认情况下会自动打印出错误提示的,根据这些提示,你就很容易就可以找出问题所在,在第6节将会具体讲到.<br /><br /><br /><strong>SOLO</strong><div class="subtable altbg2 t_msg">PHPLIB Template入门系列 - 3 块的应用 <br />在上一节中,我们知道模板元素的一种:模板变量,并知道如何在程序中给它赋值,使之呈现我们想要的东西.这对一般的简单网页来说,或许就已经够用了.现在我们设想一稍微复杂的一种情况,在template目录下新建一个second.html模板文件,内容为:<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; &lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;li&gt;张三 的成绩是 82 <br />&lt;li&gt;李四 的成绩是 90 <br />&lt;li&gt;王儿 的成绩是 60 <br />&lt;li&gt;麻子 的成绩是 77 <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br />上面的列表中列出了"张三","李四","王二","麻子"四人的成绩.假设要用PHP代码嵌入HTML的方式输出的话,你可能是这样写的:<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;?php <br />$result = mysql_query("SELECT username,score FROM my_tbl"); <br />?&gt; <br />&lt;UL&gt; <br />&lt;?php <br />while ($row = mysql_fetch_array($result)) <br />{ <br />?&gt; <br />&lt;li&gt;&lt;?=$row["username"]?&gt; 的成绩是 &lt;?=$row["score"]?&gt; <br />&lt;?php <br />} <br />?&gt; <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />这样写很适合PHP新手,但你很快发现你或者美工改这个列表样式的时候需要多么的小心翼翼,特别是美工,如果他不懂你写得PHP代码,那么他会终日生在恐惧之中!因为稍微的不小心,可能就会带来程序的运行错误.而且如果他想把这个列表从一个地方移到另一个地方,也是相当不容易的.于是作为程序员的你不得不把美工（虽然你做的可能性更大）修饰过的页面重新审查一次，无形中就造成费时费力。<br /><br />现在好了,有了Template模板类,你可以把你的代码从模板中抽取出来了.你可能会这样修改second.html模板:<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;li&gt;{username1} 的成绩是 {score1} <br />&lt;li&gt;{username2} 的成绩是 {score2} <br />&lt;li&gt;{username3} 的成绩是 {score3} <br />&lt;li&gt;{username4} 的成绩是 {score4} <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />显然,你采取了一个良好的命名方式,用1,2,3..来表示每一行数据,然后你在你的程序里循环给这些变量赋值,也是不难的,比如:(second.php)<br /><br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "first.html"); <br /><br />//连接数据库，选择数据库略 <br />省略..... <br /><br />//查询结果 <br />$result = mysql_query("SELECT username,score FROM my_tbl"); <br /><br />//给文件中的模板变量赋值 <br />$i=0; <br />while ($row = $idb-&gt;fetch_array($result)) <br />{ <br />$i++; <br />$tpl-&gt;set_var("username" . $i, $row["username"]); <br />$tpl-&gt;set_var("score" . $i, $row["score"]); <br />} <br /><br />//完成替换 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;pparse("mains", "main"); <br /><br />?&gt; <br /><br />这样你也能得到正确结果.在特殊情况下你或许需要这样做.但Template提供了一个更方便的"大的模板变量",那就是块.我之所以称之为"大的模板变量",是因为它也可以视为可以包含其他模板变量的变量.形式如<br />&lt;UL&gt; <br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />&lt;/UL&gt; <br /><br />即用&lt;!-- BEGIN 块名称 --&gt;和&lt;!-- END 块名称 --&gt;定义了一个名为list的块,(注意:我在这里为了方便理解,只称之为块名称).这个块里面又包含一些HTML代码(&lt;li&gt;等等)以及模板变量({username},{score}).<br /><br />在讲述如何用块输出列表之前,我们先谈一下块的定义格式.<br /><br />首先&lt;!-- BEGIN list --&gt;和&lt;!-- END list --&gt; 都要各自为一行,亦即下面的块的定义是错误的<br />1,<br />同行的 &lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />2,<br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; 同行的 <br /><br />&lt;!--和--&gt;都是固定的,也就是说只能是两个中划线("-"),且它们与BEGIN list之间都至少有一个空(空格或tab),看下面的例子<br />&lt;!--BEGIN list --&gt; <br />&lt;!-- BEGIN list--&gt; <br />它们都是错误的块的定义方法,因为第一个&lt;!--与BEGIN之间至少应该有一个空,第二个--&gt;与list之间至少有一个空.<br /><br />BEGIN/END和list之间也应该有一个空格,注意是有且仅有一个空格,不能多也不能少.<br /><br />块的名称建议你只使用字符,数字,下划线以及它们的组合.<br /><br />BEGIN和END两个词语都应该是大写的。<br /><br />好了,下面开始探讨如何是这个块变成一个列表.我们可以这样<br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "second.html"); <br /><br />//加载块list <br />$tpl-&gt;set_block("main", "list", "lists"); <br /><br />//连接数据库，选择数据库略 <br />省略..... <br /><br />//查询结果 <br />$result = mysql_query("SELECT username,score FROM my_tbl"); <br /><br />//给文件中的模板变量赋值 <br />while ($row = $idb-&gt;fetch_array($result)) <br />{ <br />$tpl-&gt;set_var("username", $row["username"]); <br />$tpl-&gt;set_var("score", $row["score"]); <br />$tpl-&gt;parse("lists", "list", true); <br />} <br /><br />//完成替换 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;pparse("mains", "main"); <br /><br />?&gt; <br /><br />记住把你的数据库连接写在我省略的部分,就可以打印正确的结果,一如<br /><br />下面是一个列表 <br /><br />张三 的成绩是 82 <br />李四 的成绩是 90 <br />王儿 的成绩是 60 <br />麻子 的成绩是 77 <br /><br /><br /><br />可以看到在PHP代码里有两个东西 <br />$tpl-&gt;set_block("main", "list", "lists"); //代码1 <br />$tpl-&gt;parse("lists", "list", true); <br />就不可思议的将整个块循环输出了.代码1用来加载模板main中的块list,并给其一个名字lists,list就是模板中的一个大变量,它的内容就是&lt;li&gt;{username} 的成绩是 {score}即:<br />"list" = "&lt;li&gt;{username} 的成绩是 {score}" <br />之所以用lists命名,是为了程序的可读性,也就是说我很容易就知道XXXs是XXX块的名称.<br /><br />使用set_block后，模板中的块内容<br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />就被lists代替了.于是我们的模板就变成了<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />{lists} <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />块变成了一个变量(lists)!下面只要将lists变量替换成我们想要的就行了.<br /><br />代码二所处的循环<br />while ($row = $idb-&gt;fetch_array($result)) <br />{ <br />$tpl-&gt;set_var("username", $row["username"]); <br />$tpl-&gt;set_var("score", $row["score"]); <br />$tpl-&gt;parse("lists", "list", true); //代码2 <br />} <br />每一次循环,两个set_var分别给username,score赋值,然后"list"就变成了<br />"list" = "&lt;li&gt;具体的名字 的成绩是 具体的分数"<br />代码2就是将list分析后的内容赋给lists,这样就完成了整个块的分析.<br /><br />parse第三个参数可以设置list中的值是直接存在lists里面,还是附加在原有值之后.我们这里设置为true,说明是附加在原有值之后,才得以每个list的值都会显示出来.反之设为false的话,后面的值会覆盖掉以前的值.最终的结果会是<br /><br /><br />下面是一个列表 <br /><br />麻子 的成绩是 77 <br /><br /><br />综上所述,Template模板类的替换方式是:<br />1,用set_block将模板中的list块(或者你命名的其他块)替换成变量lists.<br />2,用set_var给list块中的变量赋值<br />3,把赋值并执行替换后的list内容依次给lists<br />4,完成分析<br /><br /><div class="subtable altbg1"><span class="right">2005-11-8 23:20</span><b>SOLO</b></div><div class="subtable altbg2 t_msg">在PHP程序里,我们常常会把"公用代码"或"公用部分"写进一个文件里,前者象我们的系统配置文件,比如config.php,或者公共函数都写入一个functions.php文件里;后者象一个站点都需要用到的页面头部,尾部.这样做的好处是可以很方便的维护站点,而如果这个公用部分要有所改动,无需再去改每一个页面,大大减少了我们的工作量. <br />以前你或许用require,include(require_once,include_once)引进一个公用的页面头部,确实方便而有效,现在我们用Template模板类也可以实现了,并且可以很方便的把一个页面随意插入另一个模板的任意地方.如果你想也把要插进的页面做成含有变量的模板的话,那么你会发现模板类会把这个工作处理的很好.<br /><br />在template目录下新建三个文件third.html,header.html,footer.html.内容分为如下<br />third.html <br />&lt;!-- 这是页面头部 --&gt; <br />{header} <br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />&lt;/UL&gt; <br />&lt;!-- 这是页面脚部 --&gt; <br />{footer} <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />header.html<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; {title} &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />footer.html<br />&lt;P&gt;author &amp;copy; iwind <br /><br />你也看到了，我们前几节的例子中都是用<br />$tpl-&gt;set_file("main", "模板文件名"); <br />来加载模板文件的。只所以命名为"main",是因为我们想给它一个意义：主模板。这里的third.html就可以称之为“主模板”，而欲嵌入主模板third.html的{header}变量所在位置的模板文件header.html,则可以称为"子模板".同样footer.html也是一个"子模板",我们想把它放到主模板里的{footer}位置.一个主模板内可以随意嵌入不限内容,尺寸大小,格式等的任何多个子模板. <br /><br />下面我们开始我们的PHP程序.<br /><br />先是创建一个类的实例对象<br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//读进三个模板文件的内容,分别给变量"main", "my_header", "my_footer" <br />$tpl-&gt;set_file("main", "third.html"); <br />$tpl-&gt;set_file("my_header", "header.html"); <br />$tpl-&gt;set_file("my_footer", "footer.html"); <br /><br />//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer <br />$tpl-&gt;parse("header", "my_header"); <br />$tpl-&gt;parse("footer", "my_footer"); <br /><br />//然后完成主模板内变量的替换,并输出主模板分析后的内容 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;p("mains"); <br /><br />于是,我们便可以通过查看源文件确信header.html,footer.html两个子模板文件的内容已经被加进主模板里了.<br /><br />&lt;!-- 这是页面头部 --&gt; <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt; 的成绩是 <br />&lt;!-- END list --&gt; <br />&lt;/UL&gt; <br />&lt;!-- 这是页面脚部 --&gt; <br />&lt;P&gt;author &amp;copy; iwind <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />你会发现,所有的变量都没了,包括我们未赋值的{title},{username},{score}.这是因为我们在创建对象时,第二个参数未设置,而自动采用了"remove"<br />$tpl = new Template("template"); <br />和<br />$tpl = new Template("template", "remove"); <br />的效果是一样的.<br /><br />如果我们想给这些变量也赋值,那么方法和单个模板里变量的分析方法是一样的.<br />//读模板内容进变量 <br />$tpl-&gt;set_file("main", "third.html"); <br />$tpl-&gt;set_file("my_header", "header.html"); <br />$tpl-&gt;set_file("my_footer", "footer.html"); <br /><br />//设置子模板header.html里的变量title的值 <br />$tpl-&gt;set_var("title", "这个是网页标题"); <br /><br />//以下分析主模板里的块的内容 <br />//设置块 <br />$tpl-&gt;set_block("main", "list", "lists"); <br />$array = array("张三" =&gt; 82, "李四" =&gt; 90, "王二" =&gt; 60, "麻子" =&gt; 77); <br />foreach ($array as $username=&gt;$score) <br />{ <br />    $tpl-&gt;set_var("username", $username); <br />    $tpl-&gt;set_var("score", $score); <br />    $tpl-&gt;parse("lists", "list", true); <br />} <br /><br />所有程序为<br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "third.html"); <br />$tpl-&gt;set_file("my_header", "header.html"); <br />$tpl-&gt;set_file("my_footer", "footer.html"); <br /><br />//设置header.html里的变量title的值 <br />$tpl-&gt;set_var("title", "这个是网页标题"); <br /><br />//设置块 <br />$tpl-&gt;set_block("main", "list", "lists"); <br />$array = array("张三" =&gt; 82, "李四" =&gt; 90, "王二" =&gt; 60, "麻子" =&gt; 77); <br />foreach ($array as $username=&gt;$score) <br />{ <br />$tpl-&gt;set_var("username", $username); <br />$tpl-&gt;set_var("score", $score); <br />$tpl-&gt;parse("lists", "list", true); <br />} <br /><br />//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer <br />$tpl-&gt;parse("header", "my_header"); <br />$tpl-&gt;parse("footer", "my_footer"); <br /><br />//完成主模板内变量的替换 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;p("mains"); <br /><br />?&gt; <br /><br />输出的结果为<br />&lt;!-- 这是页面头部 --&gt; <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 这个是网页标题 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br /><br />&lt;li&gt;张三 的成绩是 82 <br />&lt;li&gt;李四 的成绩是 90 <br />&lt;li&gt;王二 的成绩是 60 <br />&lt;li&gt;麻子 的成绩是 77 <br />&lt;/UL&gt; <br />&lt;!-- 这是页面脚部 --&gt; <br />&lt;P&gt;author &amp;copy; iwind <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />一切都是我们所期望的.<br /><br />在这个程序里,我们用<br />$tpl-&gt;set_block("main", "list", "lists"); <br />加载一个块.其实它的第一个参数为该块所在父变量,如果这个块在header.html里,那么恐怕要这样写了<br />$tpl-&gt;set_block("my_header", "list", "lists"); <br />但分析方法还是一样的.<br /><br />从以往和这节中的例子,我们可以看出来,定义一个模板变量{var}值的方法是用<br />$tpl-&gt;set_var("var_name", "var_value"); <br />但把一个变量的值给另一个变量就需要用parse.<br />$tpl-&gt;parse("target_name", "from_name", true); <br />或者<br />$tpl-&gt;parse("target_name", "from_name", false); <br />使用parse就先执行from_name大变量的模板变量的替换,然后再把所得结果赋给target_name.<br /><br />一个变量{varname}无论在模板的何处(块里面,子模板里),定义的方法都是一样的.<br /><br />子模板里还可以嵌入新的子模板,称之为"多重嵌套",分析的方法都是一样的,只是一般用不到.块也可以多重嵌套,而且非常有用,使得模板可以设计的可以很清晰,这就是我们下一节的内容了.</div></div></div></div><img src ="http://www.blogjava.net/jackstudio/aggbug/62765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-08-10 12:17 <a href="http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>