<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>zwws's 资料库</title>
		<link>http://www.zvv.cn/blog/</link>
		<description>努力思考 + 实践, 眼高手低是不行的.</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Wed, 08 Sep 2010 00:15:45 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://www.zvv.cn/blog/show-111-1.html</guid>
			<title>SVN trunk, branches and tags</title>
			<author>zwws</author>
			<description><![CDATA[<p><strong>翻译者：zwws<br />
原　文：</strong><a target="_blank" href="http://www.jmfeurprier.com/blog/2010/02/08/svn-trunk-branches-and-tags/"><strong>SVN trunk, branches and tags</strong></a><br />
<strong>译　言：<a href="http://article.yeeyan.org/view/132319/81358">http://article.yeeyan.org/view/132319/81358</a></strong><br />
<strong>转载请注明<a href="http://www.zvv.cn/blog/show-111-1.html">原链接</a>，谢谢。</strong></p>
<p><em>因水平所限，如果翻译得和原文有差，敬请评论指正。</em></p>
<p>　　在本篇文章中, 我将会详细说明我是如何应用SVN trunk(树干)、branches(分支)和tags(标记)。这种方法同样被称为&ldquo;branch always&rdquo;，两者非常接近。可能我所介绍的并不是最好的方法，但是它会给新手一些解释说明，告诉他们trunk、branches和tags是什么，并且该如何去应用它们。</p>
<p>　　当然，如果本文有些要点需要澄清/确认，亦或者有一些错误的观点，还请你评论，自由发表自己的观点。</p>
<p><strong>&mdash;&mdash;简单的对比</strong></p>
<p>　　SVN的工作机制在某种程度上就像一颗正在生长的树：</p>
<ul>
    <li>一颗有树干和许多分支的树</li>
    <li>分支从树干生长出来，并且细的分支从相对较粗的树干中长出</li>
    <li>一棵树可以只有树干没有分支（但是这种情况不会持续很久，随着树的成长，肯定会有分支啦，^^）</li>
    <li>一颗没有树干但是有很多分支的树看起来更像是地板上的一捆树枝</li>
    <li>如果树干患病了，最终分支也会受到影响，然后整棵树就会死亡</li>
    <li>如果分支患病了，你可以剪掉它，然后其他分支还会生长出来的哦！</li>
    <li>如果分支生长太快了，对于树干它可能会非常沉重，最后整棵树会垮塌掉</li>
    <li>当你感觉你的树、树干或者是分支看起来很漂亮的时候，你可以给它照张相，这样就就可以记得它在那时是多么的赞。</li>
</ul>
<p><strong>&mdash;&mdash;Trunk</strong></p>
<p>　　Trunk是放置稳定代码的主要环境，就好像一个汽车工厂，负责将成品的汽车零件组装在一起。</p>
<p>　　以下内容将告诉你如何使用SVN trunk：</p>
<ul>
    <li>
    <div>除非你必须处理一些容易且能迅速解决的BUG，或者你必须添加一些无关逻辑的文件（比如媒体文件：图像，视频，CSS等等），否则永远不要在trunk直接做开发</div>
    </li>
    <li>
    <div>不要因为特殊的需求而去对先前的版本做太大的改变，如何相关的情况都意味着需要建立一个branch（如下所述）</div>
    </li>
    <li>
    <div>不要提交一些可能破坏trunk的内容，例如从branch合并</div>
    </li>
    <li>
    <div>如果你在某些时候偶然间破坏了trunk，bring some cake the next day (&rdquo;with great responsibilities come&hellip; huge cakes&rdquo;)</div>
    </li>
</ul>
<p><strong>&mdash;&mdash;Branches</strong></p>
<p>　　一个branch就是从一个SVN仓库中的子树所作的一份普通拷贝。通常情况它的工作类似与UNIX系统上的符号链接，但是你一旦在一个SVN branch里修改了一些文件，并且这些被修改的文件从拷贝过来的源文件独立发展，就不能这么认为了。当一个branch完成了，并且认为它足够稳定的时候，它必须合并回它原来的拷贝的地方，也就是说：如果原来是从trunk中拷贝的，就应该回到trunk去，或者合并回它原来拷贝的父级branch。</p>
<p>　　以下内容将告诉你如何使用SVN branches：</p>
<ul>
    <li>
    <div>如果你需要修改你的应用程序，或者为它开发一个新的特性，请从trunk中创建一个新的branch，然后基于这个新的分支进行开发</div>
    </li>
    <li>
    <div>除非是因为必须从一个branch中创建一个新的子branch，否则新的branch必须从trunk创建</div>
    </li>
    <li>
    <div>当你创建了一个新branch，你应当立即切换过去。如果你没有这么做，那你为什么要在最初的地方创建这个分支呢？</div>
    </li>
</ul>
<p><strong>&mdash;&mdash;Tags</strong></p>
<p>　　从表面上看，SVN branches和SVN tags没有什么差别，但是从概念上来说，它们有许多差别。其实一个SVN tags就是上文所述的&ldquo;为这棵树照张相&rdquo;：一个trunk或者一个branch修订版的命名快照。</p>
<p>　　以下内容将告诉你如何使用SVN tags：</p>
<ul>
    <li>
    <div>作为一个开发者，永远不要切换至、取出，或者向一个SVN tag提交任何内容：一个tag好比某种&ldquo;照片&rdquo;，并不是实实在在的东西，tags只可读，不可写。</div>
    </li>
    <li>
    <div>在特殊或者需要特别注意的环境中，如：生产环境（production）、？（staging）、测试环境（testing）等等，只能从一个修复过的（fixed）tag中checkout和update，永远不要commit至一个tag。</div>
    </li>
    <li>
    <div>对于上述提及到的环境，可以创建如下的tags：&ldquo;production&rdquo;，&ldquo;staging&rdquo;，&ldquo;testing&rdquo;等等。你也可以根据软件版本、项目的成熟程度来命名tag：&ldquo;1.0.3&rdquo;，&ldquo;stable&rdquo;，&ldquo;latest&rdquo;等等。</div>
    </li>
    <li>
    <div>当trunk已经稳定，并且可以对外发布，也要相应地重新创建tags，然后再更新相关的环境（production, staging, etc）</div>
    </li>
</ul>
<p><strong>&mdash;&mdash;工作流样例</strong></p>
<p>　　假设你必须添加了一个特性至一个项目，且这个项目是受版本控制的，你差不多需要完成如下几个步骤：</p>
<ol>
    <li>
    <div>使用SVN checkout或者SVN switch从这个项目的trunk获得一个新的工作拷贝（branch）</div>
    </li>
    <li>
    <div>使用SVN切换至新的branch</div>
    </li>
    <li>
    <div>完成新特性的开发（当然，要做足够的测试，包括在开始编码前）</div>
    </li>
    <li>
    <div>一旦这个特性完成并且稳定（已提交），并经过你的同事们确认，切换至trunk</div>
    </li>
    <li>
    <div>合并你的分支至你的工作拷贝（trunk），并且解决一系列的冲突</div>
    </li>
    <li>
    <div>重新检查合并后的代码</div>
    </li>
    <li>
    <div>如果可能的话，麻烦你的同事对你所编写、更改的代码进行一次复查（review）</div>
    </li>
    <li>
    <div>提交合并后的工作拷贝至trunk</div>
    </li>
    <li>
    <div>如果某些部署需要特殊的环境（生成环境等等），请更新相关的tag至你刚刚提交到trunk的修订版本</div>
    </li>
    <li>
    <div>使用SVN update部署至相关环境</div>
    </li>
</ol>]]></description>
			<link>http://www.zvv.cn/blog/show-111-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2010-02-11 12:04</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-110-1.html</guid>
			<title>Nginx(PHP/FastCGI)的PATH_INFO问题补充</title>
			<author>zwws</author>
			<description><![CDATA[<p>注: 本文是 <a href="http://www.laruence.com/2009/11/13/1138.html">http://www.laruence.com/2009/11/13/1138.html</a> 的补充.&nbsp;&nbsp; <br />
仅为解决使用上文配置PATH_INFO后, 当请求的URI为&quot;&lt;script&gt;/&quot;的情况下PATH_INFO为&quot;/index.php&quot;的问题, 使nginx下的PAHT_INFO表现与Apache一致.<br />
&nbsp; <br />
如: 访问 &quot;<a href="http://localhost/p.php/">http://localhost/<strong>p.php/</strong></a>&quot; 输出的PATH_INFO为&quot;/index.php&quot;&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; location ~ \.php<font color="#ff0000">($|/)</font> {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D:/WWW/Localhost;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_pass&nbsp;&nbsp; 127.0.0.1:9000;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_index&nbsp; index.php;&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set $script&nbsp;&nbsp;&nbsp; $uri;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set $path_info &quot;&quot;;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($uri ~ &quot;^(.+\.php)(/.<font color="#ff0000">*</font>)&quot;) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&nbsp; $script&nbsp;&nbsp;&nbsp;&nbsp; $1;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&nbsp; $path_info&nbsp; $2;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param SCRIPT_FILENAME $document_root$script;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param SCRIPT_NAME $script;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param PATH_INFO $path_info;&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_params;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
参考文档: <a href="http://wiki.nginx.org/NginxSymfony">http://wiki.nginx.org/NginxSymfony</a>, 有细微修改</p>]]></description>
			<link>http://www.zvv.cn/blog/show-110-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2009-11-15 13:44</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-109-1.html</guid>
			<title>守护进程删除smarty的缓存文件(注释版)</title>
			<author>zwws</author>
			<description><![CDATA[<p>原文: <a href="http://jackywdx.cn/2009/07/del_smarty_cache_with_php_daemon/">鸭嘴的Blog</a></p>
<p>偶参阅了网上资料加了注释.</p>
<p><em>详见全文</em></p><br /><br /><a href="http://www.zvv.cn/blog/show-109-1.html" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.zvv.cn/blog/show-109-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2009-07-30 14:09</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-107-1.html</guid>
			<title>PHP 输出缓存一二</title>
			<author>zwws</author>
			<description><![CDATA[<p>PHP中的output_buffering可以堆砌, 即可以多次调用ob_start()以开启缓冲区,具体参照手册中ob_start()的介绍,相关摘录如下:</p>
<p>Output buffers are stackable, that is, you may call ob_start() while another ob_start() is active. Just make sure that you call ob_end_flush() the appropriate number of times. If multiple output callback functions are active, output is being filtered sequentially through each of them in nesting order.</p>
<p>php.ini中的output_buffering不为Off时, 会自动开启一个缓冲区(等同于调用一次ob_start()), 如果为数值, 即为缓冲区的缺省大小.</p>
<p>ob_get_contents()在未开启缓冲区的情况下调用不报错, 返回false.而ob_end_clean()以及相类似操作会报告Notice级别错误, 告知未开启缓冲区.&nbsp;</p>]]></description>
			<link>http://www.zvv.cn/blog/show-107-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2009-07-20 15:19</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-106-1.html</guid>
			<title>使用位运算来实现PHP权限控制</title>
			<author>zwws</author>
			<description><![CDATA[<p><span style="font-family: Courier New">原理: 将每个二进制位为一个权限标识位</span></p>
<ul>
    <li><span style="font-family: Courier New">增加权限使用 <font color="#0000ff"><strong>| </strong></font><font color="#000000">(无论存在与否, 将对应的权限位置1)</font></span></li>
    <li><span style="font-family: Courier New">删除权限使用 <font color="#0000ff"><strong>^</strong></font> 或 <font color="#0000ff"><strong>&amp; ~</strong> </font><font color="#000000">(无论存在与否, 将对应的权限位置0)</font></span></li>
    <li><span style="font-family: Courier New">判断权限使用 <font color="#0000ff"><strong>&amp;</strong>&nbsp;</font><font color="#000000">(使用与判断对应的权限位是否为1, 是, 返回非0; 不是, 返回0)</font></span></li>
</ul>
<div><span style="font-family: Courier New"><a href="http://xiaobin.net/archives/8/">http://xiaobin.net/archives/8/</a><br />
<a href="http://www.lizhijin.com/view.php/PHP/140.html">http://www.lizhijin.com/view.php/PHP/140.html</a></span></div>
<div><span style="font-family: Courier New"><a href="http://topic.csdn.net/u/20090421/23/25ff3c5c-8bd1-4899-a05e-ecac2bad36e6.html">http://topic.csdn.net/u/20090421/23/25ff3c5c-8bd1-4899-a05e-ecac2bad36e6.html</a>&nbsp;(算法与前两则不同)</span></div>]]></description>
			<link>http://www.zvv.cn/blog/show-106-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2009-07-20 15:18</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-102-1.html</guid>
			<title>设计模式原则笔记</title>
			<author>zwws</author>
			<description><![CDATA[<p><strong>单一职责原则 SRP (Single Reponsibility Principle) </strong></p>
<p>就一个类而言，应该仅有一个引起它变化的原因。 软件设计真正要做的许多内容，就是发现原则并把那些原则相互分离。如果多余一个动机去改变一个类，那么这个类就具有多余的一个职责，这时候就应该考虑类的职责分离。</p>
<p><strong>开放封闭原则 OCP (Open-Colosed Principle) </strong></p>
<p>软件实体(类、模块、函数)应该是可以扩展的，但是不可修改。就是对扩展开放，对修改关闭。通过构建抽象来隔离变化（譬如策略模式）。</p>
<p><strong>依赖倒转原则 DIP (Dependence Inversion Principle) </strong></p>
<p>抽象不应该依赖于细节，细节应该依赖于抽象；高层不应该依赖于低层，低层应该依赖于高层。即针对接口编程，不要针对实现编程。抽象的东西是最稳定 的，我们依赖的就是它的稳定。 编写的过程中应该考虑如何针对抽象编程，而不是针对细节编程，即程序中所有的依赖关系都终止于抽象类或者接口，那就是面向对象设计，反正就是过程化设计 了。 （终止指的是具体实现类的形态已经依赖于抽象类）</p>
<p><strong>里氏代换原则 LSP (Liskov Substitution Principle) 	</strong></p>
<p>子类型必须能够替代其父类型。即，在软件里面，把父类都替换成他的子类，程序行为没有发生变化。 有了里氏代换原则，才能使继承复用成为可能，只有当子类可以替换掉父类时，软件的功能不受影响，父类才能真正被复用，而子类也能在父类的基础上增加新的行 为。 有了里氏代换原则，才能使开放-封闭成为可能，正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下扩展。</p>
<p><strong>接口隔离原则 ISP (Interface Segregation Principle) </strong></p>
<p>不应该强迫客户依赖于他们不用的方法。接口属于客户，不属于它所在的类层次结构。 	通俗的说法：不要强迫用户使用他们不使用的方法，否则这些客户就会面临由于不使用的这些方法的改变所带来的改变。</p>
<p>参考下图的设计，在这个设计里，取款、存款、转帐都使用一个通用界面接口，也就是说，每一个类都被强迫依赖了另两个类的接口方法，那么每个类有可能因为另外两个类的方法(跟自己无关)而被影响。拿取款来说，它根本不关心&ldquo;存款操作&rdquo;和&ldquo;转帐操作&rdquo;，可是它却要受到这两个方法的变化的影响。</p>
<p><a href="http://www.zvv.cn/blog/attachment.php?id=29" target="_blank"><img src="http://www.zvv.cn/blog/attachments/date_200904/thumb_4eac671ccaeac71f3de0002d3d1342f5.jpg" border="0" alt="大小: 24.6 K&#13;尺寸: 365 x 500&#13;浏览: 37 次&#13;点击打开新窗口浏览全图" width="365" height="500" /></a><br />
<br />
那么我们该如何解决这个问题呢？参考下图的设计，为每个类都单独设计专门的操作接口，使得它们只依赖于它们关系的方法，这样就不会互相影了！</p>
<p><a href="http://www.zvv.cn/blog/attachment.php?id=30" target="_blank"><img src="http://www.zvv.cn/blog/attachments/date_200904/thumb_bf9260a9b50bf4f2a8836590915a6c3c.jpg" border="0" alt="大小: 37.24 K&#13;尺寸: 314 x 500&#13;浏览: 29 次&#13;点击打开新窗口浏览全图" width="314" height="500" /></a><br />
<br />
实现方法：1、使用委托分离接口；2、使用多重继承分离接口</p>
<p><strong>迪米特原则 LoD(Law of Demeter)、LKP(Least Knowledge Principle) </strong></p>
<p>如果两个类彼此间不直接通信，那么这两个类就不应当发生直接的相互作用。如果其中一个类要调用另一个类的某个方法的话，可以通过第三方转发这个调用。 强调：在类的结构设计上，每一个类都应该尽量降低成员的访问权限；类之间的耦合越弱，越利于复用，一个处于弱耦合的类被修改，不会对有关系的类造成波及。</p>
<p><strong>合成/聚合复用原则 CARP (Composite/Aggregate Reuse Principle) </strong></p>
<p>在一个新的对象里面使用一些已有的对象，使之成为新对象的一部分。新对象通过向这些对象的委派达到复用已有功能的目的。</p>
<p><u>参考资料：<br />
http://www.blogjava.net/totobacoo/articles/138227.html<br />
http://www.cnblogs.com/feipeng/archive/2007/03/02/661840.html</u></p>]]></description>
			<link>http://www.zvv.cn/blog/show-102-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2009-03-30 14:06</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-101-1.html</guid>
			<title>使用NetBeans + Xdebug调试PHP程序[总结]</title>
			<author>zwws</author>
			<description><![CDATA[<p><strong>转载请注明出处: http://www.zvv.cn/blog/show-101-1.html</strong></p>
<p>　　前些天发现通过Notepad++的DBGP插件结合PHP的xdebug扩展可以实现PHP文件调试，同时，介绍说包含了单步调试、监视变量还有跨 文件调试。按照网络上的资料配置好调试环境后实际试用了发现功能较为简陋，单文件调试还可，如果是跨文件调试项目就不那么舒服了，试用过程中因为DBGP 插件也存在许多缺陷，烦恼不断，经常性地stack overflow，很是遗憾。后来想想Np++只是Editor，不要对它强求过多，插件的版本也比较低，存在许多BUG也是可以理解的，等它慢慢完善再 说吧，开源社区的力量可是很强大的，^^。<br />
昨晚在坛里某位同志的博文里再次见到了NetBeans这个熟悉的字眼（之前选开发环境的时候因为NB 非常强大，功能设置很人性化，界面非常友好，又有非常强的自动完成功能，都差不多就要定它了，可是因为当时不懂有xdebug，所以没搞懂怎么调试，就继 续用着EP Ctrl+B&ldquo;调试&rdquo;程序了），就用加上&ldquo;xdebug&rdquo;google了一下发现NB调试功能就是通过其实现的，而且功能齐全，评价不错，哈哈，大大的惊 喜，因为太晚了怕影响舍友休息，就决定次日来搞掂它。<br />
&hellip;&hellip;</p>
<p>　　今天和MM溜达回来后，折腾一番，现将配置过程整理如下：</p>
<p><em>详见全文</em></p><br /><br /><a href="http://www.zvv.cn/blog/show-101-1.html" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.zvv.cn/blog/show-101-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2009-03-29 00:23</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-96-1.html</guid>
			<title>资料备忘，保持更新。</title>
			<author>zwws</author>
			<description><![CDATA[<p>MySQL服务器错误号参考<br />
<a href="http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html">http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html</a></p>
<p>简明 XHTML 1.0 参考手册<br />
<a href="http://lamp.linux.gov.cn/WebStandard/short_xhtml_10_ref.html">http://lamp.linux.gov.cn/WebStandard/short_xhtml_10_ref.html</a></p>
<p>CGI1.1参考<br />
<a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a></p>
<p>Apache手册<br />
<a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/">http://lamp.linux.gov.cn/Apache/ApacheMenu/</a></p>]]></description>
			<link>http://www.zvv.cn/blog/show-96-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-08-13 22:08</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-95-1.html</guid>
			<title>安全编程法则</title>
			<author>zwws</author>
			<description><![CDATA[<p><strong>版权声明</strong>：可以任意转载，但转载时必须标明原作者charlee。<br />
<strong>原始链接：</strong><a href="http://tech.idv2.com/2008/04/19/secure-website-checklist/">http://tech.idv2.com/2008/04/19/secure-website-checklist/</a></p>
<p>标有 (*) 的检查项目表示该项是针对相关问题的根本解决方法，应当尽最大努力去完成这些内容。 未标 (*) 的项目，表示该项并不能完全消除安全隐患，只是说通过这种方法可以避免发生安全问题。</p>
<ol>
    <li>SQL注射
    <ol>
        <li>(*) 在组合SQL语句时要使用SQL变量绑定功能</li>
        <li>(*) 如果数据库不提供变量绑定，那么需要对构成SQL的所有变量进行转义</li>
        <li>不要将错误信息原封不动地显示在浏览器中。</li>
        <li>为访问数据库的用户设置适当的权限。</li>
    </ol>
    </li>
    <li>操作系统命令行注射
    <ol>
        <li>(*) 避免使用能启动shell命令的语言</li>
        <li>使用的语言如果允许启动shell命令，则需要对该功能的参数种的所有变量进行检查，确保只包含合法的操作</li>
    </ol>
    </li>
    <li>不检查路径名参数/目录遍历
    <ol>
        <li>(*) 不要将外部传进来的参数直接作为文件名来使用</li>
        <li>(*) 将打开文件的操作限制在固定的目录中，并禁止文件名中包含路径</li>
        <li>为Web服务器上的文件设置正确的访问权限</li>
        <li>检查文件名</li>
    </ol>
    </li>
    <li>会话管理的问题
    <ol>
        <li>(*) 用难以推测的内容作为会话ID</li>
        <li>(*) 不要在URL中保存会话ID</li>
        <li>(*) 为https协议中使用的cookie设置secure属性</li>
        <li>(*) 登录成功后生成新的会话</li>
        <li>(*) 登录成功后，在会话ID之外再生成一个秘密信息，每次访问页面时都检查之</li>
        <li>不使用固定值作为会话ID</li>
        <li>将会话ID保存到Cookie中时，要设置有效期限</li>
    </ol>
    </li>
    <li>跨站脚本攻击(XSS)
    <ul>
        <li>不允许输入HTML内容时的解决方法
        <ol>
            <li>(*) 输出到页面上的所有内容都要转义</li>
            <li>(*) 输出URL时仅允许以&ldquo;http://&rdquo;或&ldquo;https://&rdquo;开头的URL</li>
            <li>(*) 不要动态生成&lt;script&gt;&hellip;&lt;/script&gt;的内容</li>
            <li>(*) 不要从外部网站读入样式表</li>
            <li>检查输入内容</li>
        </ol>
        </li>
        <li>允许输入HTML内容时的解决方法
        <ol>
            <li>(*) 解析输入的HTML内容，生成解析树，然后提取其中的非脚本部分</li>
            <li>使用脚本删除输入的HTML内容中的相关字符串</li>
        </ol>
        </li>
        <li>通用解决方法
        <ol>
            <li>(*) 应答的HTTP头重指定Content-Type的charset属性</li>
            <li>为避免Cookie情报泄漏，应禁止Trace方法，并对所有Cookie设置HttpOnly属性</li>
        </ol>
        </li>
    </ul>
    </li>
    <li>跨站请求伪造(CSRF)
    <ol>
        <li>(*) 所有页面都通过POST来访问，在前一页面的hidden中随机生成一个信息，提交后的页面检查该信息，正确时才予以执行</li>
        <li>(*) 执行业务之前再次要求输入密码</li>
        <li>(*) 确认Referer是否正确，只有正确时才执行</li>
        <li>执行重要操作时，向预先设置的邮件地址中发送邮件</li>
    </ol>
    </li>
    <li>HTTP头注射
    <ol>
        <li>(*) 不直接输出HTTP头，而使用运行环境提供的头信息输出API</li>
        <li>(*) 无法使用API时，要禁止输入的头信息中的换行</li>
        <li>删除所有外部输入中的换行</li>
    </ol>
    </li>
    <li>邮件盗用(通过某种手段使邮件发送到攻击者指定的地址)
    <ol>
        <li>(*) 不使用外部参数作为邮件头信息</li>
        <li>必须用外部参数设置头信息时，要删除其中的危险字符。</li>
    </ol>
    </li>
</ol>]]></description>
			<link>http://www.zvv.cn/blog/show-95-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-08-01 00:30</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-92-1.html</guid>
			<title>[图文]zend studio 6.0.1安装中文语言包的方法。</title>
			<author>zwws</author>
			<description><![CDATA[<p>之前没用过Eclipse，下面的步骤是俺瞎折腾出来的，如有错误请指正哈。<br />
<br />
说明下，我本机直接解压覆盖安装没有效果，so&hellip;&hellip;<br />
<br />
1. 下载语言包，61M<br />
http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudio6.0-Language-Pack-it.zip<br />
2.解压到一个目录，如I:\Downloads\ZendStudio6.0-Language-Pack-it<br />
3.打开eclipse，Help-&gt;Software Updates-&gt;Find and Install<br />
<br />
<em>详见全文</em></p><br /><br /><a href="http://www.zvv.cn/blog/show-92-1.html" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.zvv.cn/blog/show-92-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-06-19 12:08</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-81-1.html</guid>
			<title>注意$_SERVER['PHP_SELF']可能引起的跨站攻击.</title>
			<author>zwws</author>
			<description><![CDATA[<p>通常我们使用</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="vars">$PHP_SELF</span><span>&nbsp;=&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'PHP_SELF'</span><span>]&nbsp;?&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'PHP_SELF'</span><span>]&nbsp;:&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'SCRIPT_NAME'</span><span>];&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>来获得当前运行脚本的路径。但是在做一些URL拼合的过程中可能引发XSS跨站攻击。</p>
<p><u>示例：</u></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$PHP_SELF</span><span>&nbsp;=&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'PHP_SELF'</span><span>]&nbsp;?&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">&quot;PHP_SELF&quot;</span><span>]&nbsp;:&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">&quot;SCRIPT_NAME&quot;</span><span>]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="func">echo</span><span>&nbsp;</span><span class="string">'&lt;a&nbsp;href=&quot;'</span><span>&nbsp;.&nbsp;</span><span class="vars">$PHP_SELF</span><span>&nbsp;.&nbsp;</span><span class="string">'&quot;&gt;aaa&lt;/a&gt;'</span><span>;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>触发方式：<a href="http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E">http://localhost/script.php<font color="#ff0000">/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E</font></a></p>
<p>解决方法：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="vars">$_SERVER</span><span>[</span><span class="string">'SCRIPT_NAME'</span><span>]&nbsp;?&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">&quot;SCRIPT_NAME&quot;</span><span>]&nbsp;:&nbsp;htmlspecialchars(</span><span class="vars">$_SERVER</span><span>[</span><span class="string">&quot;PHP_SELF&quot;</span><span>]);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>注解：使用<a href="http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E">http://localhost/script.php<font color="#ff0000">/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E</font></a>执行脚本时，$_SERVER['SCRIPT_NAME']值为/script.php，未包含恶意的脚本。另外，即使最终使用的是$_SERVER['PHP_SELF']的值，也会被htmlspecialchars转义。<img alt="" border="0" src="http://www.zvv.cn/blog/images/smiles/smile.gif" /></p>
<p><em>资料来源：</em><a href="http://www.sebug.net/vulndb/2748"><em>http://www.sebug.net/vulndb/2748</em></a></p>]]></description>
			<link>http://www.zvv.cn/blog/show-81-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-04-12 17:00</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-79-1.html</guid>
			<title>PHP检测客户端是否通过代理上网[备忘]</title>
			<author>zwws</author>
			<description><![CDATA[<p>1. 要想透过代理服务器取得客户端的真实 IP 地址，就要使用 $_SERVER[&quot;HTTP_X_FORWARDED_FOR&quot;] 来读取。不过要注意的事，并不是每个代理服务器都能用 $_SERVER[&quot;HTTP_X_FORWARDED_FOR&quot;] 来读取客户端的真实 IP，有些用此方法读取到的仍然是代理服务器的 IP。&nbsp;如果客户端没有通过代理服务器来访问，那么用$_SERVER[&quot;HTTP_X_FORWARDED_FOR&quot;] 取到的值将是空的。</p>
<p>2. $_SERVER['HTTP_VIA'] 代理服务器IP</p>
<p>3. Anonymity types <br />
Anonymous - HTTP Proxy server does not send HTTP_X_FORWARDED_FOR variable to host, this improves privacy since your IP address can not be logged. <br />
High-anonymous (elite proxy) - HTTP Servers of this type do not send HTTP_X_FORWARDED_FOR, HTTP_VIA and HTTP_PROXY_CONNECTION variables. Host doesn't even know you are using proxy server an of course it doesn't know your IP address.</p>
<p>4. 参考代码 Sablog-x 1.6下的 ./include/fense.php</p>
<p>=====</p>
<p>REMOTE_ADDR 是你的客户端跟你的服务器&ldquo;握手&rdquo;时候的IP。如果使用了&ldquo;匿名代理&rdquo;，REMOTE_ADDR将显示代理服务器的IP。<br />
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是&ldquo;超级匿名代理&rdquo;，则返回none值。同样，REMOTE_ADDR也会被替换为这个代理服务器的IP。<br />
$_SERVER['REMOTE_ADDR']; //访问端（有可能是用户，有可能是代理的）IP<br />
$_SERVER['HTTP_CLIENT_IP'];   //代理端的（有可能存在，可伪造）<br />
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理（有可能存在，也可以伪造）</p>]]></description>
			<link>http://www.zvv.cn/blog/show-79-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-03-12 16:34</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-73-1.html</guid>
			<title>&lt;附件下载&gt; 详解^^(02.24更新)</title>
			<author>zwws</author>
			<description><![CDATA[<p>今天从落伍弄到一个空间, 速度不错, 准备拿来放一些影音文件外链用, 因为每月流量限制10G, 所以不得不考虑百度和网友盗链的问题, 最后决定用PHP来读取文件, 易于控制. <br />
<br />
写的过程中也让自己温习了些许知识. 突然想起当初入门的艰难, 觉得很有必要应该和大家分享下, 故有了下文, 希望对大家有帮助哈! <br />
<br />
以上说的算是这篇文章的由头吧.</p>
<p><em>详见全文</em></p><br /><br /><a href="http://www.zvv.cn/blog/show-73-1.html" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.zvv.cn/blog/show-73-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-02-22 12:02</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-69-1.html</guid>
			<title>Zend Studio For Eclipse 6.0.0 (Neon) KeyMaker</title>
			<author>zwws</author>
			<description><![CDATA[<p>0Day在2月7日发布的, 由于没有TLF的帐号, 昨晚找了3个小时, 才从国外的某个Blog折腾回来, Linux版本的KeyMaker没弄到...</p>
<p><strong>BTW: 6.0里若有中文, 在格式化代码后整个代码会变得惨不忍睹,请问路过的各位,有解决的办法么?</strong></p><br /><br /><b>附件: </b><a href="http://www.zvv.cn/blog/attachment.php?id=21" target="_blank">zend.studio.for.eclipse.professional.edition.v6.0.incl.keymaker-core.zip</a> (78.73 K, 下载次数:3191)]]></description>
			<link>http://www.zvv.cn/blog/show-69-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-02-11 15:20</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-66-1.html</guid>
			<title>字符截取中文防乱码 .chr(0) 解决一切</title>
			<author>zwws</author>
			<description><![CDATA[<p><u><strong>倘若服务器没有开启mbstring扩展, 我们该怎么办?</strong></u></p>
<p><em>详见全文</em></p><br /><br /><a href="http://www.zvv.cn/blog/show-66-1.html" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.zvv.cn/blog/show-66-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2008-02-10 12:10</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-58-1.html</guid>
			<title>magic_quotes_runtime 的作用</title>
			<author>zwws</author>
			<description><![CDATA[<p>在php.ini的配置文件中，有个布尔值的设置，就是magic_quotes_runtime,当它打开时，php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。 <br />
<br />
当然如果重复给溢出字符加反斜线，那么字符串中就会有多个反斜线，所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。 <br />
<br />
为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测设置状态秋决定是否要手工处理，或者在开始（或不需要自动转义的时候）用set_magic_quotes_runtime(0)关掉。 <br />
<br />
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的'&quot;\加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置，可以使用addslashes()函数添加，它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号（'）、双引号（&quot;）、反斜线（\）与 NUL（NULL 字符）。</p>]]></description>
			<link>http://www.zvv.cn/blog/show-58-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2007-12-12 18:38</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-37-1.html</guid>
			<title>SQLyog Enterprise v6.05 英文正式版</title>
			<author>zwws</author>
			<description><![CDATA[<p>本人懒得打字, 就不介绍了哈!</p>
<p>总之个人感觉很灵活, 比官方的好用多了.</p>
<p>偶提供的版本绝非试用版.</p>
<p><img alt="" border="0" src="http://www.zvv.cn/blog/images/smiles/laugh.gif" />&nbsp; &nbsp;<a target="_blank" href="http://www.enfull.com/china/Programming/{28FAEED8-3A06-44B0-9B73-7ED7DE770827}.htm">下载地址(with keygen)</a></p>]]></description>
			<link>http://www.zvv.cn/blog/show-37-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2007-08-23 22:22</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-34-1.html</guid>
			<title>推荐新手细读的一篇文章</title>
			<author>zwws</author>
			<description><![CDATA[<p>http://dev.phpcms.cn/2007/0719/article_5.html <br />
<br />
初学的编码遵守规范很重要, 但是我发此贴的用意是让大家多注意到文章的小知识点. <br />
<br />
如:&nbsp;</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>数组中，如果下标不是整型，而是字符串类型，请务必用单引号将下标括起，正确的写法为</span><span class="vars">$array</span><span>[&lsquo;key&rsquo;]，而不是</span><span class="vars">$array</span><span>[key]，因为不正确的写法会使PHP解析器认为key是一个常量，进而先判断常量是否存在，不存在时才以&ldquo;key&rdquo;作为下标带入表达式中，同时出发错误事件，产生一条Notice级错误。&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>对于此文提及的编码规范, 虽说是phpcms开发组的编码习惯, 但是既然人家使用了,总有其一定的<strong>参考价值</strong></p>
<p>既然坚定学php了就不要三心二意, 这是大忌.相信<strong>存在即价值</strong>.<br />
<br />
<em>btw: 本人3月份动手以来,一直懒懒散散,没啥进步,偶尔来精神,偶尔很萎靡不振 = =b, 借发此文希望和大家一同进步.</em></p>]]></description>
			<link>http://www.zvv.cn/blog/show-34-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2007-08-20 02:23</pubDate>
		</item>
		<item>
			<guid>http://www.zvv.cn/blog/show-2-1.html</guid>
			<title>[2007.08.16]我的分页类, 附压缩包.</title>
			<author>zwws</author>
			<description><![CDATA[<p>&nbsp;打包(可直接运行查看效果):&nbsp; <a href="http://www.zvv.cn/blog/attachment.php?id=15" title="93.13 K, 下载次数:130" target="_blank">pagebar.rar</a></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">/* </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;Author:&nbsp;zwws </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;Date:&nbsp;2007.08.16 </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">class</span><span>&nbsp;pagebar &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;数据总数 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="vars">$mRsCount</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;分页总数 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="vars">$mPgCount</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;页码显示数 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="vars">$mItemNum</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;当前页 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="vars">$mCurrent</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;构造函数(数据集,&nbsp;每页显示记录数,&nbsp;页码显示数,&nbsp;当前页) </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;__construct(</span><span class="vars">$queryid</span><span>,&nbsp;</span><span class="vars">$unitnum</span><span>,&nbsp;</span><span class="vars">$itemnum</span><span>,&nbsp;</span><span class="vars">$current</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;数据总数(实际使用) </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;$this-&gt;mRsCount&nbsp;=&nbsp;mysql_num_rows($queryid); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;数据总数(测试使用) </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;mRsCount&nbsp;=&nbsp;500; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount&nbsp;=&nbsp;</span><span class="func">ceil</span><span>(</span><span class="vars">$this</span><span>-&gt;mRsCount&nbsp;/&nbsp;</span><span class="vars">$unitnum</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;mItemNum&nbsp;=&nbsp;</span><span class="vars">$itemnum</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;=&nbsp;</span><span class="vars">$current</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;分页页码 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;itemlist()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;此变量只为以下流程方便调用而设,并无实际含义 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$compare</span><span>&nbsp;=&nbsp;</span><span class="func">floor</span><span>(</span><span class="vars">$this</span><span>-&gt;mItemNum&nbsp;/&nbsp;2); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;计算页码 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mPgCount&nbsp;&lt;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mItemNum)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$start</span><span>&nbsp;=&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$end</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;&lt;=&nbsp;</span><span class="vars">$compare</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$start</span><span>&nbsp;=&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$end</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mItemNum; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">elseif</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;+&nbsp;</span><span class="vars">$compare</span><span>&nbsp;&gt;&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$start</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount&nbsp;-&nbsp;</span><span class="vars">$this</span><span>-&gt;mItemNum&nbsp;+&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$end</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$start</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;-&nbsp;</span><span class="func">ceil</span><span>(</span><span class="vars">$this</span><span>-&gt;mItemNum&nbsp;/&nbsp;2)&nbsp;+&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$end</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;+&nbsp;</span><span class="vars">$compare</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;生成页码 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;range(</span><span class="vars">$start</span><span>,&nbsp;</span><span class="vars">$end</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;分页信息 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;iteminfo()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;==&nbsp;1)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$prev</span><span>&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$prev</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;-&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;==&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$next</span><span>&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$next</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;+&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;&gt;&nbsp;</span><span class="func">ceil</span><span>(</span><span class="vars">$this</span><span>-&gt;mItemNum&nbsp;/&nbsp;2))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$first</span><span>&nbsp;=&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$first</span><span>&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$this</span><span>-&gt;mPgCount&nbsp;-&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent&nbsp;&gt;&nbsp;</span><span class="func">floor</span><span>(</span><span class="vars">$this</span><span>-&gt;mItemNum&nbsp;/&nbsp;2))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$last</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$last</span><span>&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$iteminfo</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'first'</span><span>&nbsp;&nbsp;&nbsp;=&gt;&nbsp;</span><span class="vars">$first</span><span>,&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'last'</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;</span><span class="vars">$last</span><span>, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'prev'</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;</span><span class="vars">$prev</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'next'</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;</span><span class="vars">$next</span><span>, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'current'</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$this</span><span>-&gt;mCurrent, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'rscount'</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$this</span><span>-&gt;mRsCount, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'pgcount'</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$this</span><span>-&gt;mPgCount); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$iteminfo</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.zvv.cn/blog/show-2-1.html</link>
			<category domain="http://www.zvv.cn/blog/category-1-1.html">原创丨PHP笔记</category>
			<pubDate>2007-06-05 17:13</pubDate>
		</item>
	</channel>
</rss>
