<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>某人的栖息地 &#187; pear</title>
	<atom:link href="http://www.ooso.net/category/pear/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ooso.net</link>
	<description>Linux + Apache + Mysql + Php + Flash</description>
	<lastBuildDate>Thu, 19 Jan 2012 01:21:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>php文档更新</title>
		<link>http://www.ooso.net/archives/548</link>
		<comments>http://www.ooso.net/archives/548#comments</comments>
		<pubDate>Sun, 26 Jun 2011 09:18:31 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.ooso.net/?p=548</guid>
		<description><![CDATA[php.net最近更新了php文档，比较有用的是新增的pman工具。pman是一个命令行小工具，方便查看php函数的本地帮助文档，但是不包含php.net的评论数据。简单的试用心得如下:
安装pman
使用传说中的pear来安装pman
sudo pear install doc.php.net/pman

				<span class="readmore"><a href="http://www.ooso.net/archives/548" title="php文档更新">阅读全文（1075字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>php.net最近更新了<a href="/tag/php">php</a>文档，比较有用的是新增的pman工具。pman是一个命令行小工具，方便查看php函数的本地帮助文档，但是不包含php.net的评论数据。简单的试用心得如下:</p>
<h2>安装pman</h2>
<p>使用传说中的pear来安装pman</p>
<pre><code>sudo pear install doc.php.net/pman</code></pre>
<p>如果pear版本比较老，需要先升级pear才可以继续</p>
<pre><code>sudo pear upgrade pear</code></pre>
<h2>pman使用方法</h2>
<p>pman的使用方法很傻瓜，比如我们想查看strlen的帮助信息:</p>
<pre><code>pman strlen</code></pre>
<p>帮助文本的内容是彩色的，能和chm版本的php帮助文档媲美。pman的详细使用帮助如下</p>
<pre><code>#pman --help
man, version 1.6c

usage: man [-adfhktwW] [section] [-M path] [-P pager] [-S list]
	[-m system] [-p string] name ...

  a : find all matching entries
  c : do not use cat file
  d : print gobs of debugging information
  D : as for -d, but also display the pages
  f : same as whatis(1)
  h : print this help message
  k : same as apropos(1)
  K : search for a string in all pages
  t : use troff to format pages for printing
  w : print location of man page(s) that would be displayed
      (if no name given: print directories that would be searched)
  W : as for -w, but display filenames only

  C file   : use `file' as configuration file
  M path   : set search path for manual pages to `path'
  P pager  : use program `pager' to display pages
  S list   : colon separated section list
  m system : search for alternate system's man pages
  p string : string tells which preprocessors to run
               e - [n]eqn(1)   p - pic(1)    t - tbl(1)
               g - grap(1)     r - refer(1)  v - vgrind(1)</code></pre>
<p>还有一个好处是在vim里查看php帮助信息更方便了，结合完美</p>
<pre><code>:!pman strlen</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/548/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Namespaces FAQ</title>
		<link>http://www.ooso.net/archives/418</link>
		<comments>http://www.ooso.net/archives/418#comments</comments>
		<pubDate>Tue, 10 Jun 2008 22:18:34 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://www.ooso.net/?p=418</guid>
		<description><![CDATA[PHP Namespaces FAQ，适合没耐心仔细阅读完整README.namespaces的人来看.
Q. Why PHP needs namespaces?
A. Because long names like PEAR_Form_Loader_Validate_Table_Element_Validator_Exception are really tiresome.
Q. What is the main goal of the namespace implementation?

				<span class="readmore"><a href="http://www.ooso.net/archives/418" title="PHP Namespaces FAQ">阅读全文（1299字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>PHP Namespaces FAQ，适合没耐心仔细阅读<a href="http://cvs.php.net/viewvc.cgi/php-src/README.namespaces?view=markup">完整README.namespaces</a>的人来看.</p>
<blockquote><p>Q. Why PHP needs namespaces?<br />
A. Because long names like PEAR_Form_Loader_Validate_Table_Element_Validator_Exception are really tiresome.</p>
<p>Q. What is the main goal of the namespace implementation?<br />
A. To solve the problem above.</p>
<p>Q. What “namespace X::Y::Z” means?<br />
A: 1. All class/function/method names are prefixed with X::Y::Z.<br />
2. All class/function/method names are resolved first against X::Y::Z.</p>
<p>Q. What “import X::Y::Z as Foo” means?<br />
A. Every time there’s Foo as a class/function name or prefix to the name, it really means X::Y::Z</p>
<p>Q. What “import X::Y::Z” means?<br />
A. “import X::Y::Z as Z”, then see above.</p>
<p>Q. What “import Foo” means?<br />
A. Nothing.</p>
<p>Q. What is the scope of namespace and import?<br />
A. Current file.</p>
<p>Q. Can same namespace be used in multiple files?<br />
A. Yes.</p>
<p>Q. Is there any relation between namespaces X::Y::Z and X::Y?<br />
A. Only in programmer’s mind.</p>
<p>Q. How do I import all classes from namespace X::Y::Z into global space?<br />
A. You don’t, since it brings back the global space pollution problem.<br />
Instead, you import X::Y::Z and then prefix your classes with Z::.</p>
<p>Q. But doesn’t it mean I will still have long names?<br />
A. Not longer then three elements: Namespace::Class::Element.</p>
<p>Q. Why it is not implemented like in &lt;insert your favorite language here&gt;?<br />
A. Because PHP is not &lt;insert your favorite language here&gt;</p></blockquote>
<p>php是否需要namespace，我想第一条理由已经显得很充分了。用过<a href="/?tag=pear">PEAR</a>的可能会对其中超长的class命名印象深刻，所以在PEAR2的Code standing中，也隐约提到可能会利用namespaces以及__autoload来缩短class名。</p>
<p>原文:<a href="http://php100.wordpress.com/2007/08/17/namespaces-faq/">Namespaces FAQ</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/418/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于PEAR的DB和MDB2方法对比</title>
		<link>http://www.ooso.net/archives/396</link>
		<comments>http://www.ooso.net/archives/396#comments</comments>
		<pubDate>Thu, 08 May 2008 14:49:03 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[db]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/396</guid>
		<description><![CDATA[在从前的php4时代，我很喜欢使用pear的DB库，使用非常方便。但是现在pear官方站已经建议我们采用MDB2来代替它，虽然MDB2的前身可能有一些DB的影子，但是使用方法还是有一些不同，这些天一边使用，一边做些笔记。


MDB2

				<span class="readmore"><a href="http://www.ooso.net/archives/396" title="关于PEAR的DB和MDB2方法对比">阅读全文（265字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在从前的php4时代，我很喜欢使用<a href="/?tag=pear">pear</a>的DB库，使用非常方便。但是现在pear官方站已经建议我们采用MDB2来代替它，虽然MDB2的前身可能有一些DB的影子，但是使用方法还是有一些不同，这些天一边使用，一边做些笔记。</p>
<table border="1" cellpadding="3">
<tr bgcolor="#eee">
<td>MDB2</td>
<td>DB</td>
</tr>
<tr>
<td>queryAll</td>
<td>getAll</td>
</tr>
<tr>
<td>queryRow</td>
<td>getRow</td>
</tr>
<tr>
<td>queryCol</td>
<td>getCol</td>
</tr>
<tr>
<td>queryOne</td>
<td>getOne</td>
</tr>
<tr>
<td>autoExecute</td>
<td>autoExecute(需要载入extended module)</td>
</tr>
<tr>
<td>autoPrepare</td>
<td>autoPrepare(需要载入extended module)</td>
</tr>
</table>
<p>其它方法貌似一致。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/396/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>创建本地的pear</title>
		<link>http://www.ooso.net/archives/327</link>
		<comments>http://www.ooso.net/archives/327#comments</comments>
		<pubDate>Fri, 15 Jun 2007 23:46:37 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/327</guid>
		<description><![CDATA[在某些主机上，你可能没有修改系统缺省安装pear的权限，但是又希望安装自己的pear包。这种情况下也有简单的办法实现：
首先在自己的home下创建一份pear的配置文件.pearrc:
$ pear config-create $HOME .pearrc
如果一切顺利的话，直接进行下一步，否则运行一下下列命令：

				<span class="readmore"><a href="http://www.ooso.net/archives/327" title="创建本地的pear">阅读全文（686字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在某些主机上，你可能没有修改系统缺省安装pear的权限，但是又希望安装自己的<a href="index.php?tag=pear">pear</a>包。这种情况下也有简单的办法实现：</p>
<p>首先在自己的home下创建一份pear的配置文件.pearrc:</p>
<pre><code>$ pear config-create $HOME .pearrc</code></pre>
<p>如果一切顺利的话，直接进行下一步，否则运行一下下列命令：</p>
<pre><code>$ pear config-set download_dir /home/(username)/tmp/pear/cache
$ pear config-set cache_dir /home/(username)/tmp/pear/cache
$ pear config-set temp_dir /home/(username)/tmp/pear/temp</code></pre>
<p>接着就可以开始安装pear了，这会连着pear的依赖文件一块安装：</p>
<pre><code>$ pear install -o PEAR</code></pre>
<p>经过这一步,pear已经安装完成，如果你还希望安装其它的package，那么：</p>
<pre><code>$ pear install pear/PackageName</code></pre>
<p>这样你就有了一份自己定制的pear包，为了在程序中调用到这些pear，你需要多谢写一些额外的代码，毕竟这些代码还不在你的include_path中。</p>
<p>php4</p>
<pre><code>ini_set(
  'include_path',
  ini_get( 'include_path' ) . PATH_SEPARATOR . "/home/(youruser)/pear/php"
);</code></pre>
<p>php5</p>
<pre><code>set_include_path(
	get_include_path() .
	PATH_SEPARATOR . '/home/(youruser)/pear/php'
);</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/327/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Pear的PHP_Compat包</title>
		<link>http://www.ooso.net/archives/267</link>
		<comments>http://www.ooso.net/archives/267#comments</comments>
		<pubDate>Wed, 22 Nov 2006 23:42:14 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/267</guid>
		<description><![CDATA[Pear的PHP_Compat是个比较有趣的包,它提供了一些php4下也能使用的php5专有函数,比如file_put_contents,array_combine,str_split&#8230;&#8230;&#8230;.这样即使是在php4的主机上,也能提前享受一点php5函数的便利.
用法
&#60;?php
require_once 'PHP/Compat.php';

				<span class="readmore"><a href="http://www.ooso.net/archives/267" title="Pear的PHP_Compat包">阅读全文（459字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ooso.net/index.php/archives/category/pear/">Pear</a>的PHP_Compat是个比较有趣的包,它提供了一些php4下也能使用的<a href="http://www.ooso.net/?tag=php5">php5</a>专有函数,比如file_put_contents,array_combine,str_split&#8230;&#8230;&#8230;.这样即使是在php4的主机上,也能提前享受一点php5函数的便利.</p>
<h3>用法</h3>
<pre><code>&lt;?php
require_once 'PHP/Compat.php';

// load file_put_contents
PHP_Compat::loadFunction('file_put_contents');

// load str_split, array_chunk and file_get_contents
PHP_Compat::loadFunction(array('str_split', 'array_chunk', 'file_get_contents'));
?&gt;</code></pre>
<p>上面的例子说明,可以一次载入n个php5特有函数</p>
<h3>Package Information: PHP_Compat</h3>
<p><a href="http://pear.php.net/package/PHP_Compat">http://pear.php.net/package/PHP_Compat</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/267/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pear::Pager和AJAX的整合应用</title>
		<link>http://www.ooso.net/archives/260</link>
		<comments>http://www.ooso.net/archives/260#comments</comments>
		<pubDate>Sun, 22 Oct 2006 23:53:07 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/260</guid>
		<description><![CDATA[作为一个PHP开发人员来说，大概很让人受用的一个东东就是Pear的类库了。我们知道，Pear::Pager是专门处理分页的，而Pear::HTML_AJAX则是Ajax应用的一些类库。但是Pager也不仅仅是只能用于html的分页链接，它已经为比超女还红的Ajax做好了准备，下面看看这两个包如何整合应用。
Pager and Javascript
现在走出第一步，Pager已经能够构建出javascript的链接了，和Ajax整合，理论上应该也是能够实现的，下面是Pager和javascript分页的一个例子：

				<span class="readmore"><a href="http://www.ooso.net/archives/260" title="Pear::Pager和AJAX的整合应用">阅读全文（2178字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>作为一个PHP开发人员来说，大概很让人受用的一个东东就是<a href="http://www.ooso.net/index.php/archives/category/pear/">Pear</a>的类库了。我们知道，Pear::<a href="http://www.ooso.net/index.php/archives/250">Pager</a>是专门处理分页的，而Pear::<a href="http://www.ooso.net/index.php/archives/184">HTML_AJAX</a>则是Ajax应用的一些类库。但是Pager也不仅仅是只能用于html的分页链接，它已经为比超女还红的Ajax做好了准备，下面看看这两个包如何整合应用。</p>
<h3>Pager and Javascript</h3>
<p>现在走出第一步，Pager已经能够构建出<a href="http://www.ooso.net/index.php/archives/category/javascript/">javascript</a>的链接了，和Ajax整合，理论上应该也是能够实现的，下面是Pager和javascript分页的一个例子：</p>
<pre><code>require_once 'Pager/Pager.php';
$data = range(1, 100); //an array of data to paginate
$pager_params = array(
    'mode'     =&gt; 'Sliding',
    'append'   =&gt; false,  //don't append the GET parameters to the url
    'path'     =&gt; '',
    'fileName' =&gt; 'javascript:revealDiv(%d)',  //Pager replaces "%d" with the page number...
    'perPage'  =&gt; 10, //show 10 items per page
    'delta'    =&gt; 5,
    'itemData' =&gt; $data,
);
$pager = &#038; Pager::factory($pager_params);
$n_pages = $pager-&gt;numPages();
$links = $pager-&gt;getLinks();
?&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;script type="text/javascript" language="javascript"&gt;
    var n_pages = &lt;?php echo $n_pages ?&gt;;
    function revealDiv(n)
    {
        for (var count = 1; count &lt;= n_pages; count++) {
          document.getElementById("page"+count).style.display = 'none';
        }
        document.getElementById("page"+n).style.display = 'block';
    }
    &lt;/script&gt;
    &lt;style type="text/css"&gt;
    div.page {
      background: #FFFF99;
      border-top: 1px solid #FFBF99;
      border-bottom: 1px solid #FFBF99;
    }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;PEAR::Pager example with JavaScript&lt;/h1&gt;
&lt;?php echo $links['pages']; ?&gt;
&lt;hr /&gt;
&lt;?php
for ($i=1; $i &lt;= $n_pages; ++$i) {
    echo '&lt;div class="page" id="page'.$i.'"&gt;';
    echo '&lt;h2&gt;Page '.$i.'&lt;/h2&gt;';
    foreach ($pager-&gt;getPageData($i) as $item) {
        echo 'Item '.$item.'&lt;br /&gt;';
    }
    echo '&lt;/div&gt;';
}
?&gt;
&lt;hr /&gt;
&lt;script type="text/javascript" language="javascript"&gt;
revealDiv(1);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>例子中把分页的所有数据放入一个div标签，定义了两个比较重要的参数就是path（为空）和fileName,fileName原本应该是链接的文件名，但是这里用javascript替换了。</p>
<h3>Ajax上阵</h3>
<p>这个例子包括三个文件page.html,server.php,testdata.php<br />
<span id="more-260"></span></p>
<li>page.html</li>
<p>用动态javascript&#8211;server.php来处理数据，调用HTML_AJAX.replace(&#8216;target&#8217;, &#8216;testdata.php&#8217;)来替换id为target这个div的内容。</p>
<pre><code>&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;PEAR::Pager example with AJAX&lt;/h1&gt;

&lt;script type="text/javascript" src="server.php?client=all"&gt;&lt;/script&gt;

&lt;div id="target"&gt;I'm the target&lt;/div&gt;

&lt;script type="text/javascript"&gt;
    HTML_AJAX.replace('target', 'testdata.php');
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<li>testdata.php</li>
<p>这是个很简单的php程序，取到分页数据并输出html</p>
<pre><code>&lt;?php
require_once 'Pager/Pager.php';
$data = range(1, 100); //an array of data to paginate
$pager_params = array(
    'mode'     =&gt; 'Sliding',
    'append'   =&gt; false,  //don't append the GET parameters to the url
    'path'     =&gt; '',
    'fileName' =&gt; 'javascript:HTML_AJAX.replace('target','testdata.php?pageID=%d');',  //Pager replaces "%d" with the page number...
    'perPage'  =&gt; 10, //show 10 items per page
    'delta'    =&gt; 1,
    'itemData' =&gt; $data,
);
$pager = &#038; Pager::factory($pager_params);
$n_pages = $pager-&gt;numPages();
$links = $pager-&gt;getLinks();
echo '&lt;p&gt;This container is loaded with an AJAX call&lt;/p&gt;';
echo '&lt;p&gt;&lt;span class="datetime"&gt;DateTime: '. date('Y-m-d H:i:s') .'&lt;/span&gt;&lt;/p&gt;';
echo '&lt;h3&gt;Page '. $pager-&gt;getCurrentPageId() .'&lt;/h3&gt;';
foreach ($pager-&gt;getPageData() as $item) {
    echo 'Item '. $item .'&lt;br /&gt;';
}
echo '&lt;hr /&gt;'.$pager-&gt;links;
?&gt;</code></pre>
<li>最后，贴上幕后工作者server.php的代码</li>
<p>用HTML_AJAX_Server来处理ajax这些烦心事吧</p>
<pre><code>&lt;?php
include 'HTML/AJAX/Server.php';

$server = new HTML_AJAX_Server();
$server-&gt;handleRequest();
?&gt;</code></pre>
<h3>web 2.0, Ajax的趋势图</h3>
<p>时下的web 2.0和Ajax概念正是如火如荼，且不论Ajax这东东到底是不是炒作的产物，就实际应用来说，Ajax在某些场合的确是顶好用而且看上去挺酷.</p>
<p><strong>蓝的是web 2.0,红的是Ajax</strong><br />
<img src="http://www.google.com/trends/viz?q=web+2.0,ajax&#038;date=all&#038;geo=all&#038;graph=weekly_img&#038;sa=N" alt="web 2.0,ajax" /></p>
<h3>参考文档</h3>
<p>http://www.alberton.info/pear_pager_tutorial_javascript_navigation.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/260/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pear::Pager分页类简介</title>
		<link>http://www.ooso.net/archives/250</link>
		<comments>http://www.ooso.net/archives/250#comments</comments>
		<pubDate>Thu, 21 Sep 2006 23:16:45 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/250</guid>
		<description><![CDATA[Pear的Pager分页类是一个很好用的php分页类,扩展性很强,能够适应各种分页情况的需求,至少我在几年间大大小小的项目里,基本上没有为分页额外写过代码,全部都是用的Pager,足见Pager的可用性之强.下面用代码来看看它的使用范例:
例子1
&#60;?php
require_once 'Pager/Pager.php';

				<span class="readmore"><a href="http://www.ooso.net/archives/250" title="Pear::Pager分页类简介">阅读全文（2129字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ooso.net/index.php/archives/category/pear/">Pear</a>的<a href="http://pear.php.net/package/Pager">Pager</a>分页类是一个很好用的<a href="http://www.ooso.net/index.php/archives/category/php/">php</a>分页类,扩展性很强,能够适应各种分页情况的需求,至少我在几年间大大小小的项目里,基本上没有为分页额外写过代码,全部都是用的Pager,足见Pager的可用性之强.下面用代码来看看它的使用范例:</p>
<h3>例子1</h3>
<pre><code>&lt;?php
require_once 'Pager/Pager.php';
$params = array(
    'mode'       =&gt; 'Jumping',
    'perPage'    =&gt; 3,
    'delta'      =&gt; 2,
    'itemData'   =&gt; array('a','b','c','d','e',[...omissis...],'z')
);
$pager = &#038; Pager::factory($params);
$data  = $pager-&gt;getPageData();
$links = $pager-&gt;getLinks();
//$links is an ordered+associative array with 'back'/'pages'/'next'/'first'/'last'/'all' links
//NB: $links['all'] is the same as $pager-&gt;links;

//echo links to other pages:
echo $links['all'];

//Pager can also generate &lt;link rel="first|prev|next|last"&gt; tags
echo $pager-&gt;linkTags;

//Show data for current page:
echo 'PAGED DATA: ' ; print_r($data);

//Results from methods:
echo 'getCurrentPageID()...: '; var_dump($pager-&gt;getCurrentPageID());
echo 'getNextPageID()......: '; var_dump($pager-&gt;getNextPageID());
echo 'getPreviousPageID()..: '; var_dump($pager-&gt;getPreviousPageID());
echo 'numItems()...........: '; var_dump($pager-&gt;numItems());
echo 'numPages()...........: '; var_dump($pager-&gt;numPages());
echo 'isFirstPage()........: '; var_dump($pager-&gt;isFirstPage());
echo 'isLastPage().........: '; var_dump($pager-&gt;isLastPage());
echo 'isLastPageComplete().: '; var_dump($pager-&gt;isLastPageComplete());
echo '$pager-&gt;range........: '; var_dump($pager-&gt;range);
?&gt;</code></pre>
<p>Pager的使用,只要调整$param数组的参数,就可以应付很多种分页情况了.代码中的$links数组包含了一些链接,如上一页/页码/下一页/第一页/末页/全部.</p>
<h3>例2</h3>
<p>如今许多网站为了<a href="http://www.ooso.net/?tag=seo">SEO</a>,把动态页使用rewrite规则伪造成静态页的形式,例如下面这个.htaccess配置:</p>
<pre><code>RewriteEngine on
#Options FollowSymlinks

RewriteBase /
RewriteRule ^articles/([a-z]{1,12})/art([0-9]{1,4})\.html$ /article.php?num=$2&amp;month=$1 [L]</code></pre>
<p>即使在这种情况下,Pager分页仍然有办法工作,见下面的code</p>
<pre><code>&lt;?php
require_once 'Pager/Pager.php';

//first pager
$params1 = array(
    'perPage'    =&gt; 3,
    'urlVar'     =&gt; pageID_articles,  //1st identifier
    'itemData'   =&gt; $someArray
);
$pager1 = &#038; Pager::factory($params1);
$data1  = $pager1-&gt;getPageData();
$links1 = $pager1-&gt;getLinks();

//second pager
$params2 = array(
    'perPage'    =&gt; 8,
    'urlVar'     =&gt; pageID_news,      //2nd identifier
    'itemData'   =&gt; $someOtherArray
);
$pager2 = &#038; Pager::factory($params2);
$data2  = $pager2-&gt;getPageData();
$links2 = $pager2-&gt;getLinks();
?&gt;</code></pre>
<p>通过配置$param,就能够把链接 &#8220;/articles/march/art15.html&#8221;对应到链接&#8221;/article.php?num=15&#038;month=march&#8221; ,比较灵活的表现</p>
<h3>扩展性</h3>
<p>Pager类的扩展性,平心而论,也是不错的.比如以前写的<a href="http://www.ooso.net/index.php/archives/144">path方式的分页类 &#8211; Pager::Pathing()</a>,这个方法就是从Pager上扩展而来,满足了当时的需求.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/250/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>在虚拟主机上复制安装本机Pear</title>
		<link>http://www.ooso.net/archives/241</link>
		<comments>http://www.ooso.net/archives/241#comments</comments>
		<pubDate>Fri, 15 Sep 2006 00:40:11 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/241</guid>
		<description><![CDATA[在国内租来的虚拟主机上,有部分主机本身就提供了pear类库,但是不用指望它们会给你升级或安装需要的pear包.在这种情况下,可以尝试在自己的虚拟主机下安装一份pear.
通过ssh安装pear
国内绝大部分虚拟主机都不提供ssh,但若是朋友的服务器,可能会比较放宽一点给你权限.下面看看通过ssh在虚拟主机上安装pear的步骤:


				<span class="readmore"><a href="http://www.ooso.net/archives/241" title="在虚拟主机上复制安装本机Pear">阅读全文（1107字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在国内租来的虚拟主机上,有部分主机本身就提供了pear类库,但是不用指望它们会给你升级或安装需要的pear包.在这种情况下,可以尝试在自己的虚拟主机下安装一份pear.</p>
<h3>通过ssh安装pear</h3>
<p>国内绝大部分虚拟主机都不提供ssh,但若是朋友的服务器,可能会比较放宽一点给你权限.下面看看通过ssh在虚拟主机上安装pear的步骤:</p>
<ul>
<li>PEAR 1.3.5或以下:
<pre><code>$ pear -s -c ~/.pearrc -d doc_dir=~/pear/docs \
    -d ext_dir=~/pear/ext -d php_dir=~/pear/lib \
    -d data_dir=~/pear/data -d test_dir=~/pear/tests \
    -d cache_dir=~/pear/cache -d bin_dir=~/pear/bin</code></pre>
<p>PEAR 1.4以上:</p>
<pre><code>$ pear config-create /home/user/pear .pearrc</code></pre>
<p>这样就在用户的home下建立了一个.pearrc文件
</li>
<li>在.bashrc文件中加入<br />
PEAR 1.3.2 或以下:</p>
<pre><code>$ pear -c ~/.pearrc install Archive_Tar PEAR Console_Getopt XML_RPC</code></pre>
<p>PEAR 1.3.3以上 </p>
<pre><code>$ pear install -o PEAR</code></pre>
<p>这样就在用户的home目录下新增了一个pear目录,这份pear是完全复制主机上的pear的.</li>
<li>为了使用刚装上的这份pear包,需要在php代码中指定include_path
<pre><code>&lt;?php
ini_set('include_path', '~/pear/lib' . PATH_SEPARATOR
        . ini_get('include_path'));

// From PHP 4.3.0 onward, you can use the following,
// which especially useful on shared hosts:
set_include_path('~/pear/lib' . PATH_SEPARATOR
                 . get_include_path());
?&gt;</code></pre>
</li>
</ul>
<h3>通过ftp/ftps/sftp安装pear</h3>
<p>通过ftp之类的向远程虚拟主机上安装pear,这无疑是个好主意.主要通过pear的程序包PEAR_RemoteInstaller来完成这功能.有几点要确定:</p>
<ul>
<li>本机是php 5.0以上</li>
<li>如果需要用ftps安装,那么本机的php需要增加openssl extension</li>
<li>如果需要用ssh安装,那么本机的php需要增加ssh2 extension</li>
<li>php目录的pear命令行可执行</li>
<li>ftp有写权限</li>
</ul>
<p>因为时间关系,暂时不写具体步骤了,有需要的朋友可以参考下面的链接.</p>
<h3>参考文档:</h3>
<p><a href="http://pear.php.net/manual/en/installation.shared.php">pear manual</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No handlers for package.xml version 2.0</title>
		<link>http://www.ooso.net/archives/243</link>
		<comments>http://www.ooso.net/archives/243#comments</comments>
		<pubDate>Tue, 12 Sep 2006 23:44:43 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/243</guid>
		<description><![CDATA[尝试在某主机安装Pear的DB_Table
pear install -o DB_Table
下载&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;等了半晌,在下载完之后,本应安装成功的时候,丢出来一句:
No handlers for package.xml version 2.0

				<span class="readmore"><a href="http://www.ooso.net/archives/243" title="No handlers for package.xml version 2.0">阅读全文（516字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>尝试在某主机安装<a href="http://www.ooso.net/index.php/archives/category/pear/">Pear</a>的<a href="http://www.ooso.net/index.php/archives/237">DB_Table</a></p>
<pre><code>pear install -o DB_Table</code></pre>
<p>下载&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;等了半晌,在下载完之后,本应安装成功的时候,丢出来一句:</p>
<blockquote><p>No handlers for package.xml version 2.0</p></blockquote>
<p>这实在是很奇怪的事情,<a href="http://www.ooso.net/index.php/archives/category/php/">php</a>的xml extension没少装,依赖包也不曾短缺了它的,它怎么就能这样呢?搜索了一把,在<a href="http://www.go-pear.org/manual/en/faq.no-handlers.php">Pear的Faq</a>上面找到了答案.</p>
<h3>Why do I get &#8220;No handlers for package.xml version 2.0&#8243; when I try to install a package?</h3>
<blockquote><p>You are using a PEAR version lower than 1.4.0. </p>
<p>To install the package, you have to update PEAR via: </p>
<p>$ pear upgrade PEAR </p>
<p>This will install the latest available version of PEAR which is capable of installing packages that have only a package.xml version 2.0. </p></blockquote>
<p>在升级Pear为1.4.11之后,问题解决.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/243/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pear::HTTP_Upload简介</title>
		<link>http://www.ooso.net/archives/240</link>
		<comments>http://www.ooso.net/archives/240#comments</comments>
		<pubDate>Wed, 30 Aug 2006 01:58:30 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/240</guid>
		<description><![CDATA[Pear的HTTP_Upload类库提供了一个封装好的html表单文件上传处理程序，使用Pear的error系统。
特点

能一次处理多个文件的上传

				<span class="readmore"><a href="http://www.ooso.net/archives/240" title="Pear::HTTP_Upload简介">阅读全文（825字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>Pear的HTTP_Upload类库提供了一个封装好的html表单文件上传处理程序，使用<a href="http://www.ooso.net/index.php/archives/category/pear/">Pear</a>的error系统。</p>
<h3>特点</h3>
<ul>
<li>能一次处理多个文件的上传</li>
<li>容易校验文件的上传状态，限制不期望的文件上传</li>
<li>多语种的报错提示信息（还没有中文，不过可以扩展)</li>
</ul>
<h3>单个文件上传的例子</h3>
<p>index.htm</p>
<pre><code>&lt;form action="./files.php" enctype="multipart/form-data"&gt;
File 1: &lt;input type="file" name="userfile"&gt;&lt;br&gt;
&lt;input type="submit" name="submit" value="Upload!"&gt;
&lt;/form&gt;</code></pre>
<p>files.php</p>
<pre><code>&lt;?php
require 'HTTP/Upload.php';
$upload = new HTTP_Upload('es');
// Language for error messages
$file = $upload-&gt;getFiles('userfile');
// return a file object or error
if (PEAR::isError($file)) {
	die ($file-&gt;getMessage());
}
// Check if the file is a valid upload
if ($file-&gt;isValid()) {    // this method will return the name of the file you moved,
	// useful for example to save the name in a database
	$file_name = $file-&gt;moveTo('./uploads_dir/');
	if (PEAR::isError($file_name)) {
		die ($file_name-&gt;getMessage());
	}
}
?&gt;</code></pre>
<h3>多文件上传的例子</h3>
<p><span id="more-240"></span></p>
<pre><code>&lt;form action="files.php" enctype="multipart/form-data"&gt;
Image 1: &lt;input type="file" name="userfile[]"&gt;
&lt;br&gt;Image 2: &lt;input type="file" name="userfile[]"&gt;
&lt;br&gt;Image 3: &lt;input type="file" name="userfile[]"&gt;
&lt;br&gt;&lt;input type="submit" name="sub" value="Upload!"&gt;&lt;/form&gt;</code></pre>
<pre><code>&lt;?php
$files = $upload-&gt;getFiles(); // returns an array of file objects or error
foreach ($files as $file) {
   if ($file-&gt;isValid()) {
      ...
   }
}?&gt;</code></pre>
<h3>下载</h3>
<p><a href="http://pear.php.net/package/HTTP_Upload">http://pear.php.net/package/HTTP_Upload</a></p>
<p><strong>版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/240/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pear的命令行</title>
		<link>http://www.ooso.net/archives/239</link>
		<comments>http://www.ooso.net/archives/239#comments</comments>
		<pubDate>Mon, 28 Aug 2006 23:19:56 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/239</guid>
		<description><![CDATA[Pear是PHP扩展和应用库(&#8220;PHP Extension and Application Repository&#8221;)的缩写,注意它不是鸭梨,尽管和该水果的发音相同。在安装好php之后，缺省情况下会自动安装pear的部分程序库，我们看看这种情况下如何自行安装更多的应用库。
全自动安装
很简单，只用一行。
pear install &#60;package&#62;

				<span class="readmore"><a href="http://www.ooso.net/archives/239" title="Pear的命令行">阅读全文（2250字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>Pear是<a href="http://www.ooso.net/index.php/archives/category/php/">PHP</a>扩展和应用库(&#8220;PHP Extension and Application Repository&#8221;)的缩写,注意它不是鸭梨,尽管和该水果的发音相同。在安装好php之后，缺省情况下会自动安装<a href="http://www.ooso.net/index.php/archives/category/pear/">pear</a>的部分程序库，我们看看这种情况下如何自行安装更多的应用库。</p>
<h3>全自动安装</h3>
<p>很简单，只用一行。</p>
<pre><code>pear install &lt;package&gt;</code></pre>
<p>&lt;package&gt;应当是你要安装的库名，可以到<a href="http://pear.php.net/packages.php">Pear的站上</a>浏览，相当丰富。也可以用命令行直接查看：</p>
<pre><code>pear remote-list</code></pre>
<p>提示：使用&#8221;-o&#8221;参数能够自动安装必需的依赖应用库。</p>
<h3>手动安装</h3>
<p>如果你直接在pear站上下载了gzip的安装包，可以采用这种安装形式。pear会自动安装这个应用库，不再链接到网上去下载。</p>
<pre><code>pear install &lt;file&gt;.tgz</code></pre>
<h3>命令清单</h3>
<p><span id="more-239"></span></p>
<table border="1">
<thead>
<tr>
<th align="left" valign="middle">Command</th>
<th align="left" valign="middle">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="middle">build</td>
<td align="left" valign="middle">Build the extension<br />
              from source</td>
</tr>
<tr>
<td align="left" valign="middle">bundle</td>
<td align="left" valign="middle">Download and unpack<br />
              a <a href="http://pecl.php.net/">PECL</a> extension</td>
</tr>
<tr>
<td align="left" valign="middle">channel-add</td>
<td align="left" valign="middle">Add a Channel (PEAR<br />
              1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">channel-alias</td>
<td align="left" valign="middle">Specify an alias to<br />
              a channel name (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">channel-delete</td>
<td align="left" valign="middle">Remove a channel<br />
              from the list (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">
              channel-discover</td>
<td align="left" valign="middle">Initialize a channel<br />
              from its server name (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">channel-info</td>
<td align="left" valign="middle">Retrieve information<br />
              on a channel (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">channel-update</td>
<td align="left" valign="middle">Update an existing<br />
              channel (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">clear-cache</td>
<td align="left" valign="middle">Clear the XML-RPC<br />
              cache</td>
</tr>
<tr>
<td align="left" valign="middle">config-create</td>
<td align="left" valign="middle">Create a default<br />
              configuration file (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">config-get</td>
<td align="left" valign="middle">Echo a specific<br />
              configuration setting</td>
</tr>
<tr>
<td align="left" valign="middle">config-help</td>
<td align="left" valign="middle">Show information<br />
              about a setting</td>
</tr>
<tr>
<td align="left" valign="middle">config-set</td>
<td align="left" valign="middle">Set a specific<br />
              configuration setting value</td>
</tr>
<tr>
<td align="left" valign="middle">config-show</td>
<td align="left" valign="middle">Show all<br />
              configuration setting values</td>
</tr>
<tr>
<td align="left" valign="middle">convert</td>
<td align="left" valign="middle">Convert a<br />
              package.xml 1.0 format to package.xml 2.0 format<br />
              (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">cvsdiff</td>
<td align="left" valign="middle">Execute and display<br />
              a &#8220;<tt class="literal">cvs diff -u</tt>&#8221; on all files<br />
              within the package</td>
</tr>
<tr>
<td align="left" valign="middle">cvstag</td>
<td align="left" valign="middle">Set a CVS release<br />
              tag</td>
</tr>
<tr>
<td align="left" valign="middle">download</td>
<td align="left" valign="middle">Download a package<br />
              but not install it</td>
</tr>
<tr>
<td align="left" valign="middle">download-all</td>
<td align="left" valign="middle">Downloads every<br />
              available package</td>
</tr>
<tr>
<td align="left" valign="middle">info</td>
<td align="left" valign="middle">Display information<br />
              about a package</td>
</tr>
<tr>
<td align="left" valign="middle">install</td>
<td align="left" valign="middle">Install a package,<br />
              will report with success or failure</td>
</tr>
<tr>
<td align="left" valign="middle">list</td>
<td align="left" valign="middle">List installed<br />
              packages</td>
</tr>
<tr>
<td align="left" valign="middle">list-all</td>
<td align="left" valign="middle">List all packages,<br />
              packaged and/or available</td>
</tr>
<tr>
<td align="left" valign="middle">list-channels</td>
<td align="left" valign="middle">List available<br />
              channels (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">list-files</td>
<td align="left" valign="middle">List files in an<br />
              installed package (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">list-upgrades</td>
<td align="left" valign="middle">List available<br />
              upgrades for the installed packages</td>
</tr>
<tr>
<td align="left" valign="middle">login</td>
<td align="left" valign="middle">Connects and<br />
              authenticates to the remote PEAR server</td>
</tr>
<tr>
<td align="left" valign="middle">logout</td>
<td align="left" valign="middle">Logs out from the<br />
              remote PEAR server</td>
</tr>
<tr>
<td align="left" valign="middle">makerpm</td>
<td align="left" valign="middle">Builds a RPM spec<br />
              file from a PEAR package</td>
</tr>
<tr>
<td align="left" valign="middle">package</td>
<td align="left" valign="middle">Build a package</td>
</tr>
<tr>
<td align="left" valign="middle">
              package-dependencies</td>
<td align="left" valign="middle">Show package<br />
              dependencies</td>
</tr>
<tr>
<td align="left" valign="middle">
              package-validate</td>
<td align="left" valign="middle">Validate package<br />
              consistency</td>
</tr>
<tr>
<td align="left" valign="middle">remote-info</td>
<td align="left" valign="middle">Information about<br />
              remote packages</td>
</tr>
<tr>
<td align="left" valign="middle">remote-list</td>
<td align="left" valign="middle">List remote<br />
              packages</td>
</tr>
<tr>
<td align="left" valign="middle">run-scripts</td>
<td align="left" valign="middle">Run post-install<br />
              scripts bundled with a package (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">run-tests</td>
<td align="left" valign="middle">Run regression<br />
              tests</td>
</tr>
<tr>
<td align="left" valign="middle">search</td>
<td align="left" valign="middle">Search the remote<br />
              package database</td>
</tr>
<tr>
<td align="left" valign="middle">shell-test</td>
<td align="left" valign="middle">Do a shell script<br />
              test</td>
</tr>
<tr>
<td align="left" valign="middle">sign</td>
<td align="left" valign="middle">Sign a package<br />
              distribution file</td>
</tr>
<tr>
<td align="left" valign="middle">uninstall</td>
<td align="left" valign="middle">Uninstall and remove<br />
              a package</td>
</tr>
<tr>
<td align="left" valign="middle">update-channels</td>
<td align="left" valign="middle">Update the channel<br />
              list (PEAR 1.4+)</td>
</tr>
<tr>
<td align="left" valign="middle">upgrade</td>
<td align="left" valign="middle">Upgrade a package to<br />
              the current version (see also: preferred_state)</td>
</tr>
<tr>
<td align="left" valign="middle">upgrade-all</td>
<td align="left" valign="middle">Upgrade all packages<br />
              (see also: list-upgrades)</td>
</tr>
</tbody>
</table>
<h3>参考</h3>
<ul>
<li><a href="http://pear.php.net">pear.php.net</a></li>
</ul>
<p><strong>版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/239/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pear::DB_Table简介</title>
		<link>http://www.ooso.net/archives/237</link>
		<comments>http://www.ooso.net/archives/237#comments</comments>
		<pubDate>Sun, 27 Aug 2006 02:43:40 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/237</guid>
		<description><![CDATA[版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
DB_Table是什么？
DB_Table 是一个访问数据库Table的OO接口，它提供了一些自动创建、插入、更新和选择的方法。自动构建往往意味着要丧失一些灵活性，DB_Table也不能例外。
安装

				<span class="readmore"><a href="http://www.ooso.net/archives/237" title="Pear::DB_Table简介">阅读全文（3424字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><strong>版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</strong></p>
<h3>DB_Table是什么？</h3>
<p>DB_Table 是一个访问数据库Table的OO接口，它提供了一些自动创建、插入、更新和选择的方法。自动构建往往意味着要丧失一些灵活性，DB_Table也不能例外。</p>
<h3>安装</h3>
<p><a href="http://www.ooso.net/index.php/archives/category/pear/">pear</a>的程序库的安装没什么悬念</p>
<pre><code>pear install DB_Table</code></pre>
<h3>DB_Table上手</h3>
<p>官方介绍上推荐不要直接使用DB_Table Class，而是对它进行扩展，在这之上再定义字段，索引，视图等等其它自定义内容。下面来看看如何对DB_Table扩展。</p>
<p><span id="more-237"></span></p>
<h4>基本的例子：</h4>
<pre><code>&lt;?php
class Guestbook extends DB_Table {
    // 稍后补充 We'll add more here later in the tutorial,
    // 注意，没有构造函数 but for now this is all we need.
}
?&gt;</code></pre>
<p>接着，实例化一个Guestbook</p>
<pre><code>&lt;?php
// 必须的class
require_once 'DB.php';
require_once 'DB/Table.php';
require_once 'Guestbook.php';

// create a PEAR DB object
$dsn = "phptype://username:password@localhost/database";
$db = DB::connect($dsn);

// set up for the Guestbook and create it, connecting
// to a table called 'guestbook' (which does not exist
// yet, we'll get to that in the next section)
$book =&#038; new Guestbook($db, 'guestbook'); // note the "=&#038;" (very important!)
?&gt;</code></pre>
<p>可以用PEAR_Error来查看是否有错</p>
<pre><code>&lt;?php
if ($book-&gt;error) {
    // error handling code goes here; for example ...

    print_r($book-&gt;error);

    // ... although that's probably a bad idea as it will print
    // your database username and password.
}
?&gt;</code></pre>
<p>下面看看如何详细定义Guestbook类,这个例子里定义了guestbook表的各个字段类型：</p>
<pre><code>&lt;?php
class Guestbook extends DB_Table {
    var $col = array(

        // unique row ID
        'id' =&gt; array(
            'type'    =&gt; 'integer',
            'require' =&gt; true
        ),

        // first name
        'fname' =&gt; array(
            'type'    =&gt; 'varchar',
            'size'    =&gt; 32
        ),

        // last name
        'lname' =&gt; array(
            'type'    =&gt; 'varchar',
            'size'    =&gt; 64
        ),

        // email address
        'email' =&gt; array(
            'type'    =&gt; 'varchar',
            'size'    =&gt; 128,
            'require' =&gt; true
        ),

        // date-time signed
        'signdate' =&gt; array(
            'type'    =&gt; 'date',
            'require' =&gt; true
        )
    );
?&gt;</code></pre>
<p>如果要进一步定义guestbook表的索引，可以这样进行：</p>
<pre><code>&lt;?php
class Guestbook extends DB_Table {

    // snip: var $col = array(...);  这部分内容和上面那段一样，省略

    var $idx = array(
        'id' =&gt; array(
            'type' =&gt; 'unique',
            'cols' =&gt; 'id'
        ),
        'signdate' =&gt; array(
            'type' =&gt; 'normal',
            'cols' =&gt; 'signdate'
        )
    );
}
?&gt;</code></pre>
<p>如果索引和字段名是一样的，而且不是多字段索引，上面的定义可以简化为：</p>
<pre><code>&lt;?php
    var $idx = array(
        // unique index called 'id' based on the 'id' column
        'id' =&gt; 'unique',

        // normal index called 'signdate' based on the 'signdate' column
        'signdate' =&gt; 'normal'
    );
?&gt;</code></pre>
<p>定义好表结构之后，我们看看如何进行查询，看上去非常简单，没有sql语句的痕迹：</p>
<pre><code>&lt;?php
// [snip] create the $book Guestbook object

// get the 'list' view as an array
$rows = $book-&gt;select('list');
print_r($rows);

// get the 'emails' view as a DB_Result object
$result = $book-&gt;selectResult('emails');
print_r($result);

?&gt;</code></pre>
<h4>按条件查询：</h4>
<pre><code>&lt;?php

// [snip] create the $book Guestbook object

// get 'list' view rows signed on August 14, 2003, ordered ascending by
// last name and first name, starting at row 7 and getting 12 rows total.

$view = 'list';
$filter = "signdate = '2003-08-14'";
$order = 'lname, fname';
$start = 7;
$count = 12;

// as an array
$rows = $book-&gt;select($view, $filter, $order, $start, $count);
print_r($rows);

// as a DB_Result object
$rows = $book-&gt;selectResult($view, $filter, $order, $start, $count);
print_r($result);

?&gt;</code></pre>
<h4>数据插入</h4>
<pre><code>&lt;?php

// [snip] create the Guestbook object ($book)

// assign the fields and values
$cols_vals = array(
    'id'       =&gt; 1,
    'fname'    =&gt; 'Thomas',
    'lname'    =&gt; 'Anderson',
    'signdate' =&gt; '2003-10-12',
    'email'    =&gt; 'neo@matrix.net'
);

// insert into the table and print results
$result = $book-&gt;insert($cols_vals);
print_r($result);

?&gt;</code></pre>
<h4>数据更新</h4>
<pre><code>&lt;?php

// [snip] create the Guestbook object ($book)

// assign the updated fields and values
$cols_vals = array(
    'lname' =&gt; 'Jones'
);

// assign the WHERE clause
$where = "lname = 'Smith'";

// attempt the update and print the results
$result = $book-&gt;update($cols_vals, $where);
print_r($result);

?&gt;</code></pre>
<h3>数据删除</h3>
<pre><code>&lt;?php

// [snip] create the Guestbook object ($book)

// a where clause
$today = date('Y-m-d'); // formatted as yyyy-mm-dd
$where = "signdate &lt; '$today'";

// attempt the delete and print the results
$result = $book-&gt;delete($where);
print_r($result);

?&gt;</code></pre>
<p>在上面的例子中已经没有太多sql语句的痕迹了，这可以在一定程度上简化开发过程中sql语句的编写，但是还是那句话，自动化的同时降低了灵活性，在使用DB_Table之前需要权衡。</p>
<h3>参考</h3>
<p><a href="http://wiki.ciaweb.net/yawiki/index.php?area=DB_Table&#038;page=HomePage">http://wiki.ciaweb.net/yawiki/index.php?area=DB_Table&#038;page=HomePage</a></p>
<h3>下载源码</h3>
<p><a href="http://pear.php.net/package/DB_Table">http://pear.php.net/package/DB_Table</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/237/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 5.2.0 RC1发布</title>
		<link>http://www.ooso.net/archives/202</link>
		<comments>http://www.ooso.net/archives/202#comments</comments>
		<pubDate>Wed, 26 Jul 2006 22:51:56 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/202</guid>
		<description><![CDATA[PHP 5.2.0 RC1发布，目前应该只是个样品，适合下载回来测试新功能。主要更新是新增了三个extensions:

filter
json 

				<span class="readmore"><a href="http://www.ooso.net/archives/202" title="PHP 5.2.0 RC1发布">阅读全文（726字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://ilia.ws/archives/119-PHP-5.2.0-RC1-Released!.html">PHP 5.2.0 RC1</a>发布，目前应该只是个样品，适合下载回来测试新功能。主要更新是新增了三个extensions:</p>
<ul>
<li><a href="http://cn.php.net/manual/en/ref.filter.php">filter</a></li>
<li><a href="http://www.ooso.net/?tag=json">json </a></li>
<li>zip</li>
</ul>
<p>其中filter extension由Rasmus Lerdorf提供，帮助php开发者过滤用户提交的内容。原来是在<a href="http://pecl.php.net">pecl.php.net</a>，更详细的内容可以看这里：<a href="http://oss.backendmedia.com/PeclFilter">http://oss.backendmedia.com/PeclFilter</a>，如能广泛使用，目前php开发的安全性将提升一个台阶！之前还听说对pdo extension有些调整，比如新增了<a href="http://cn.php.net/manual/en/function.pdostatement-setfetchmode.php">setFetchMode</a>方法，经常使用<a href="http://www.ooso.net/index.php/archives/category/pear/">Pear</a>:DB的同学一定不会陌生。</p>
<blockquote><p>Given that it took a few months to reach this point and addition of new features was allowed the changelog already looks extremely impressive. Some of the key changes include things like 3 new extensions (filter, json and zip), the date extension had the rest of its functionality enabled, much work was done in terms of getting PHP 5.2 to run faster and more efficiently (in terms on memory usage). There have also been nearly 80 bug fixes made to existing functionality, which hopefully translates to a more stable release.</p></blockquote>
<h3>下载</h3>
<ul>
<li><a href="http://downloads.php.net/ilia/php-5.2.0RC1.tar.bz2">bz包</a></li>
<li><a href="http://downloads.php.net/ilia/php-5.2.0RC1.tar.gz">gzip包</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/202/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用http_request上传文件</title>
		<link>http://www.ooso.net/archives/187</link>
		<comments>http://www.ooso.net/archives/187#comments</comments>
		<pubDate>Sun, 11 Jun 2006 15:15:11 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/187</guid>
		<description><![CDATA[有时候我们希望用脚本来自动往远端某个表单中自动添加文件上传,利用curl模块可能是个办法,但是直接使用pear的http_request可能是个更便捷的办法,简单的例子:
require_once "HTTP/Request.php";

$req =&#038; new HTTP_Request("http://upload.example.com/upload.php");

				<span class="readmore"><a href="http://www.ooso.net/archives/187" title="利用http_request上传文件">阅读全文（491字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>有时候我们希望用脚本来自动往远端某个表单中自动添加文件上传,利用curl模块可能是个办法,但是直接使用<a href="http://pear.php.net">pear</a>的http_request可能是个更便捷的办法,简单的例子:</p>
<pre><code>require_once "HTTP/Request.php";

$req =&#038; new HTTP_Request("http://upload.example.com/upload.php");
$req-&gt;setBasicAuth("johndoe", "foo");
$req-&gt;setMethod(HTTP_REQUEST_METHOD_POST);

$result = $req-&gt;addFile("foo.jpg", "/home/foo/foo.jpg");
if (PEAR::isError($result)) {
    echo $result-&gt;getMessage();
} else {

    $response = $req-&gt;sendRequest();

    if (PEAR::isError($response)) {
        echo $response-&gt;getMessage();
    } else {
        echo $req-&gt;getResponseBody();
    }
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/187/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>用php将rss转化为json格式</title>
		<link>http://www.ooso.net/archives/184</link>
		<comments>http://www.ooso.net/archives/184#comments</comments>
		<pubDate>Mon, 29 May 2006 06:41:38 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/184</guid>
		<description><![CDATA[要用php将rss转换成json,简单的转换思路是:
rss -> php array -> json
我们不必从头进行这些工作,pear已经提供了一些可用的类库,到命令行下面利用pear安装这些包
pear install channel://pear.php.net/XML_RSS-0.9.9

				<span class="readmore"><a href="http://www.ooso.net/archives/184" title="用php将rss转化为json格式">阅读全文（442字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>要用php将rss转换成json,简单的转换思路是:<br />
rss -> php array -> json</p>
<p>我们不必从头进行这些工作,pear已经提供了一些可用的类库,到命令行下面利用pear安装这些包<br />
pear install channel://pear.php.net/XML_RSS-0.9.9<br />
pear install channel://pear.php.net/HTML_AJAX-0.4.0</p>
<p>下面是一个简单的测试代码:</p>
<pre><code>&lt; ?php
require_once 'XML/RSS.php';
require 'HTML/AJAX/JSON.PHP';

$rss = new XML_RSS('http://www.ooso.net/index.php/feed/');
$rss-&gt;parse();
//var_dump($rss-&gt;getItems());

$json = new HTML_AJAX_JSON();
$js = $json-&gt;encode($rss-&gt;getItems());

echo $js;
?&gt;</code></pre>
<ul>
<li><a href="http://www.yahoo.com.cn/search?p=json">什么是json?</a></li>
<li><a href="http://www.google.com/search?q=site%3Awww.ooso.net+json">相关文章</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/184/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>php+ajax文件上传进度条</title>
		<link>http://www.ooso.net/archives/169</link>
		<comments>http://www.ooso.net/archives/169#comments</comments>
		<pubDate>Wed, 15 Mar 2006 02:39:50 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/169</guid>
		<description><![CDATA[找到一篇文章PHP AJAX File Upload Progress Meter Updates,介绍如何用php Pear:HTML_AJAX制作带有进度条的文件上传,下面是我测试上传时的示意图
 

代码分为以下部分:

				<span class="readmore"><a href="http://www.ooso.net/archives/169" title="php+ajax文件上传进度条">阅读全文（979字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>找到一篇文章<a href="http://blog.joshuaeichorn.com/archives/2006/03/14/php-ajax-file-upload-progress-meter-updates/" target="_blank">PHP AJAX File Upload Progress Meter Updates</a>,介绍如何用<a href="http://www.php.net" target="_blank">php</a> <a href="http://pear.php.net/package/HTML_AJAX" target="_blank">Pear:HTML_AJAX</a>制作带有进度条的文件上传,下面是我测试上传时的示意图</p>
<p><img title="ajax带进度条上传" alt="ajax带进度条上传" src="http://image.blog.myrice.com/vvvv/imgs/0/8/08c345da.gif" /> </p>
<p><span id="more-169"></span><br />
代码分为以下部分:</p>
<p>demo.php &#8211; 上传过程处理</p>
<pre><code>&lt; ?php

include 'UploadProgressMeter.class.php';

$fileWidget = new UploadProgressMeter();

if ($fileWidget-&gt;uploadComplete()) {
        // 上传完毕的时候,从iframe发送一个js到主窗口表示一切ok
        echo $fileWidget-&gt;finalStatus();

        // 处理上传后的文件...

        exit;
}
?&gt;</code></pre>
<p>demoserver.php &#8211; ajax的服务端js,使用Pear:HTML_AJAX,直接调用UploadProgressMeterStatus类<br />
[html]<script src="http://www.ooso.net/demoserver.php?client=main,request,httpclient,dispatcher,json,util" type="text/javascript"></script><br />
<script src="http://www.ooso.net/demoserver.php?stub=UploadProgressMeterStatus" type="text/javascript"></script><br />
< ?php echo $fileWidget->renderIncludeJs(); ?>[/html]</p>
<p>进度条的样式表<br />
[css].progressBar {<br />
  position: relative;<br />
  padding: 2px;<br />
  width: 300px;<br />
  height: 40px;<br />
  font-size: 14px;<br />
}<br />
.progressBar .background {<br />
  border: solid 1px black;<br />
  width: 270px;<br />
  height: 20px;<br />
}<br />
.progressBar .bar {<br />
  position: relative;<br />
  background-color: blue;<br />
  width: 0px;<br />
  height: 20px;<br />
}[/css]</p>
<p>表单部分<br />
[html]</p>
<form action="demo.php" method="post" enctype="multipart/form-data">renderFormExtra(); ?>><br />
< ?php echo $fileWidget->renderHidden(); ?></form>
<form action="demo.php" method="post" enctype="multipart/form-data"><label>Select File: </label></p>
<div>< ?php echo $fileWidget->render(); ?><br />
< ?php echo $fileWidget->renderProgressBar(); ?></div>
</form>
<p>[/html]</p>
<p><a href="http://www.ooso.net/temp/demo/upload.rar" target="_blank">demo下载</a> &#8211; 密码是<a href="http://www.ooso.net/">www.ooso.net</a><br />
作者的<a href="http://svn.bluga.net/HTML_AJAX/UploadProgressMeter/trunk/" target="_blank">svn浏览</a></p>
<p>其它类似项目:<br />
<a href="http://pdoru.from.ro/">http://pdoru.from.ro/</a> &#8211; 要以patch的形式和php一起编译<br />
<a href="http://www.ugia.cn/?p=54">http://www.ugia.cn/?p=54</a> &#8211; 以socket上传文件并显示进度条</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/169/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>俺的按比例裁切缩略图函数</title>
		<link>http://www.ooso.net/archives/166</link>
		<comments>http://www.ooso.net/archives/166#comments</comments>
		<pubDate>Mon, 13 Mar 2006 07:04:52 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/166</guid>
		<description><![CDATA[为了减少代码量,这里直接使用了Pear::Image_Transform图片处理类,功能是按比例生成缩略图，缩小后图片效果不变形，如果超高则纵向截取，如果超长则横向截取。
/**
* 生成缩略图
*

				<span class="readmore"><a href="http://www.ooso.net/archives/166" title="俺的按比例裁切缩略图函数">阅读全文（937字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>为了减少代码量,这里直接使用了<a href="http://pear.php.net" target="_blank">Pear</a>::<a href="http://pear.php.net/package/Image_Transform" target="_blank">Image_Transform</a>图片处理类,功能是按比例生成缩略图，缩小后图片效果不变形，如果超高则纵向截取，如果超长则横向截取。<span id="more-166"></span></p>
<pre><code>/**
* 生成缩略图
*
* @param string $src 源图片路径
* @param string $dst 目标图片路径
* @param int $width 缩略图宽
* @param int $height 缩略图高
* @return bool
*/
function cropImg($src, $dst, $width, $height) {
 //Pear::Image_Transform
 include_once('Image/Transform.php');
 $img = Image_Transform::factory('GD');
 $img-&gt;load($src);

 $size = $img-&gt;getImageSize();
 if(empty($size[0]))
  return false;
 if($size[0] / $size[1] &gt; $width / $height) {
  $w = round($size[0] * $height / $size[1]);
  $h = $height;
  $over = 'width';
 } else {
  $w = $width;
  $h = round($size[1] * $width / $size[0]);
  $over = 'height';
 }
 $img-&gt;resize($w, $h);
 $img-&gt;save($dst, 'jpeg', 100);
 $img-&gt;free();

 $img-&gt;load($dst);
 $size = $img-&gt;getImageSize();
 if($over == 'width') {
  $x = round(($size[0] - $width) / 2);
  $y = 0;
 } else {
  $x = 0;
  $y = round(($size[1] - $height) / 2);
 }
 $img-&gt;crop($width, $height, $x, $y);
 //die($img-&gt;display());
 $img-&gt;save($dst, 'jpeg');
 $img-&gt;free();

 return true;
}</code></pre>
<p>这里有个相似的例子:<br />
<a href="http://www.phpx.com/happy/thread-111786-1-3.html">http://www.phpx.com/happy/thread-111786-1-3.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/166/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pear命令行参数的一些小变化</title>
		<link>http://www.ooso.net/archives/157</link>
		<comments>http://www.ooso.net/archives/157#comments</comments>
		<pubDate>Tue, 07 Mar 2006 01:50:52 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/157</guid>
		<description><![CDATA[今天在prado的开发站点上看到prado 2.1.0rc1以pear channel形式安装的办法,由此也了解到pear命令行一些新参数的用法,看下面例子:
shell> pear channel-discover http://pear.mooexpress.com
shell> pear config-set preferred_state beta
shell> pear upgrade mooexpress/prado

				<span class="readmore"><a href="http://www.ooso.net/archives/157" title="pear命令行参数的一些小变化">阅读全文（458字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>今天在<a href="http://www.xisc.com" target="_blank">prado</a>的开发站点上看到prado 2.1.0rc1以pear channel形式安装的办法,由此也了解到<a href="http://pear.php.net" target="_blank">pear</a>命令行一些新参数的用法,看下面例子:</p>
<blockquote><p>shell> pear channel-discover <a href="http://pear.mooexpress.com/">http://pear.mooexpress.com</a><br />
shell> pear config-set preferred_state beta<br />
shell> pear upgrade mooexpress/prado<br />
upgrade ok: channel://pear.mooexpress.com/prado-2.1 </p></blockquote>
<ul>
<li>首先用discover频道搜索: pear channel-discover <a href="http://pear.mooexpress.com/">http://pear.mooexpress.com</a></li>
<li>接着修改config允许安装beta版的pear包: pear config-set preferred_state beta</li>
<li>最后安装或升级指定的包: pear install mooexpress/prado</li>
</ul>
<p>channel参数是pear命令行最近的新增参数,估计主要为第三方的兼容pear的lib而设定.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/157/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>path方式的分页类 &#8211; Pager::Pathing()</title>
		<link>http://www.ooso.net/archives/144</link>
		<comments>http://www.ooso.net/archives/144#comments</comments>
		<pubDate>Sat, 31 Dec 2005 05:33:24 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://www.ooso.net/index.php/archives/144</guid>
		<description><![CDATA[最近的一个项目,用path方式表现页面的url:
http://www.foo.com/index.php/p/user:photo
http://www.foo.com/index.php/p/user:photo/page/1
http://www.foo.com/index.php/p/user:photo/page/2

				<span class="readmore"><a href="http://www.ooso.net/archives/144" title="path方式的分页类 &#8211; Pager::Pathing()">阅读全文（3237字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近的一个项目,用path方式表现页面的url:</p>
<p><a href="http://www.foo.com/index.php/p/user:photo"><strong>http://www.foo.com/index.php/p/user:photo</strong></a><br />
<a href="http://www.foo.com/index.php/p/user:photo/page/1"><strong>http://www.foo.com/index.php/p/user:photo/page/1</strong></a><br />
<strong><a href="http://www.foo.com/index.php/p/user:photo/page/2">http://www.foo.com/index.php/p/user:photo/page/2</a></strong></p>
<p>正常的页面url:</p>
<p><strong><a href="http://www.foo.com/index.php?p=user:photo">http://www.foo.com/index.php?p=user:photo</a><br />
<a href="http://www.foo.com/index.php?p=user:photo&#038;page=1">http://www.foo.com/index.php?p=user:photo&#038;page=1</a><br />
<a href="http://www.foo.com/index.php?p=user:photo&#038;page=2">http://www.foo.com/index.php?p=user:photo&#038;page=2</a></strong></p>
<p>之前使用的分页类是<a href="http://pear.php.net/package/pager/redirected" target="_blank">Pear:Pager</a>,在这时候就玩不转了,不管如何调整参数分页链接总是错误,于是写了个Pathing.php,专门用于path方式的分页,调用方法:</p>
<pre><code>$pager = Pager::factory(array('mode' =&gt; 'Pathing'));</code></pre>
<p><span id="more-144"></span></p>
<p>Pager/Pathing.php</p>
<pre><code>require_once('Pager/Jumping.php');

class Pager_Pathing extends Pager_Jumping {

    /**
     * @see Pager_Common::_setOptions()
     */
    function _setOptions($options) {
        $allowed_options = array(
            'totalItems',
            'perPage',
            'delta',
            'linkClass',
            'path',
            'fileName',
            'append',
            'httpMethod',
            'importQuery',
            'urlVar',
            'altPrev',
            'altNext',
            'altPage',
            'prevImg',
            'nextImg',
            'expanded',
            'separator',
            'spacesBeforeSeparator',
            'spacesAfterSeparator',
            'curPageLinkClassName',
            'curPageSpanPre',
            'curPageSpanPost',
            'firstPagePre',
            'firstPageText',
            'firstPagePost',
            'lastPagePre',
            'lastPageText',
            'lastPagePost',
            'firstLinkTitle',
            'nextLinkTitle',
            'prevLinkTitle',
            'lastLinkTitle',
            'showAllText',
            'itemData',
            'clearIfVoid',
            'useSessions',
            'closeSession',
            'sessionVar',
            'pearErrorMode',
            'extraVars',
            'excludeVars',
            'currentPage',
        );

        foreach ($options as $key =&gt; $value) {
            if (in_array($key, $allowed_options) &#038;&#038; (!is_null($value))) {
                $this-&gt;{'_' . $key} = $value;
            }
        }

        $this-&gt;_fileName = ltrim($this-&gt;_fileName, '/');  //strip leading slash
        $this-&gt;_path     = rtrim($this-&gt;_path, '/');      //strip trailing slash

        if ($this-&gt;_append) {
            $this-&gt;_fileName = CURRENT_FILENAME; //avoid possible user error;
            $this-&gt;_url = $this-&gt;_path.'/'.$this-&gt;_fileName;
        } else { //hacked for pathing pager
   $this-&gt;_url = $this-&gt;_path;
            if (strncasecmp($this-&gt;_fileName, 'javascript', 10) != 0)
                $this-&gt;_url .= '/';

   $len = strlen($this-&gt;_urlVar);
   if((substr($this-&gt;_path, -$len, $len) == $this-&gt;_urlVar) and
    is_numeric(CURRENT_FILENAME))
    $this-&gt;_url = substr($this-&gt;_path, 0, -$len);
   else
    $this-&gt;_url.= CURRENT_FILENAME . '/';

            if (!strstr($this-&gt;_fileName, '%d'))
                trigger_error($this-&gt;errorMessage(ERROR_PAGER_INVALID_USAGE), E_USER_WARNING);
        }

        $this-&gt;_classString = '';
        if (strlen($this-&gt;_linkClass)) {
            $this-&gt;_classString = 'class="'.$this-&gt;_linkClass.'"';
        }

        if (strlen($this-&gt;_curPageLinkClassName)) {
            $this-&gt;_curPageSpanPre  = '&lt;span class="'.$this-&gt;_curPageLinkClassName.'"&gt;';
            $this-&gt;_curPageSpanPost = '&lt;/span&gt;';
        }

        $this-&gt;_perPage = max($this-&gt;_perPage, 1); //avoid possible user errors

        if ($this-&gt;_useSessions &#038;&#038; !isset($_SESSION)) {
            session_start();
        }
        if (!empty($_REQUEST[$this-&gt;_sessionVar])) {
            $this-&gt;_perPage = max(1, (int)$_REQUEST[$this-&gt;_sessionVar]);
            if ($this-&gt;_useSessions) {
                $_SESSION[$this-&gt;_sessionVar] = $this-&gt;_perPage;
            }
        }

        if (!empty($_SESSION[$this-&gt;_sessionVar])) {
             $this-&gt;_perPage = $_SESSION[$this-&gt;_sessionVar];
        }

        if ($this-&gt;_closeSession) {
            session_write_close();
        }

        $this-&gt;_spacesBefore = str_repeat(' ', $this-&gt;_spacesBeforeSeparator);
        $this-&gt;_spacesAfter  = str_repeat(' ', $this-&gt;_spacesAfterSeparator);

        $request = ($this-&gt;_httpMethod == 'POST') ? $_POST : $_GET;
        if (isset($request[$this-&gt;_urlVar]) &#038;&#038; empty($options['currentPage'])) {
            $this-&gt;_currentPage = (int)$request[$this-&gt;_urlVar];
        }
        $this-&gt;_currentPage = max($this-&gt;_currentPage, 1);
        $this-&gt;_linkData = $this-&gt;_getLinksData();

  return PAGER_OK;
 }

}</code></pre>
<p>调用例子:</p>
<pre><code>require 'Pager/Pager.php';
	$opt = array(
		'mode' 			=&gt; 'Pathing',
		'totalItems'	=&gt; $totalItems,
		'perPage'		=&gt; $perPage,
		'append'		=&gt; false,
		'fileName'		=&gt; 'page/%d',
		'urlVar'		=&gt; 'page',
	);

	$pager = Pager::factory($opt);
	$links = $pager-&gt;getLinks();</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/144/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>轻巧的php模板类——SmartTemplate</title>
		<link>http://www.ooso.net/archives/7</link>
		<comments>http://www.ooso.net/archives/7#comments</comments>
		<pubDate>Sat, 03 Aug 2002 08:33:48 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">/?p=7</guid>
		<description><![CDATA[SmartTemplate:
一个比较轻巧的php模板，执行速度上很有优势,据说执行速度是smatry的8x倍，当然实际使用中不会那么夸张，据本人测试，运行速度至少是pear的IT模板的4倍以上(2000个循环替换)。 
下载地址：
http://www.smartphp.net/content/app/download.php

				<span class="readmore"><a href="http://www.ooso.net/archives/7" title="轻巧的php模板类——SmartTemplate">阅读全文（242字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>SmartTemplate:<br />
<br />一个比较轻巧的php模板，执行速度上很有优势,据说执行速度是smatry的8x倍，当然实际使用中不会那么夸张，据本人测试，运行速度至少是pear的IT模板的4倍以上(2000个循环替换)。 </p>
<p>下载地址：<br />
<br />http://www.smartphp.net/content/app/download.php<br />
<br />使用注意事项:<br />
<br />为了在同一个脚本中使用多个模板可以这样修改(php4):<br />
<br />281 line </p>
<pre><code>unset($_top);</code></pre>
<p>to<br />
</p>
<pre><code>unset($GLOBALS['_top']);</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>更好的将editplus与phpCodeBeautifier结合使用</title>
		<link>http://www.ooso.net/archives/26</link>
		<comments>http://www.ooso.net/archives/26#comments</comments>
		<pubDate>Sat, 03 Aug 2002 08:33:48 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[editplus]]></category>

		<guid isPermaLink="false">/?p=26</guid>
		<description><![CDATA[phpCodeBeautifier这款php代码美化工具已经很久不见更新，它的命令行版本似乎有些bug,不能正确的将php代码弄的很整齐。但是phpCodeBeautifier的GUI版本还是能够执行正确无误的，可惜无法直接在命令行模式下打开某个文件，想与editplus结合使用比较困难。
但是注意到phpCodeBeautifier总是会打开上一次使用过的文件，打开phpCodeBeautifier.ini一看，LastFile=&#8217;******&#8217;不正是我们需要的东东么？

				<span class="readmore"><a href="http://www.ooso.net/archives/26" title="更好的将editplus与phpCodeBeautifier结合使用">阅读全文（796字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>phpCodeBeautifier这款php代码美化工具已经很久不见更新，它的命令行版本似乎有些bug,不能正确的将php代码弄的很整齐。但是phpCodeBeautifier的GUI版本还是能够执行正确无误的，可惜无法直接在命令行模式下打开某个文件，想与editplus结合使用比较困难。<br />
<br />但是注意到phpCodeBeautifier总是会打开上一次使用过的文件，打开phpCodeBeautifier.ini一看，LastFile=&#8217;******&#8217;不正是我们需要的东东么？<br />
<br />于是俺写了如下批处理文件搞定这个问题：<br />
<table border=1 cellpadding="3" cellspacing="3" style="border-collapse: collapse" bordercolor="#055AA0" width=95%>
<tr>
<td>
<pre><code>代码片段:</code></pre>
<p>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="100%" class="code">
<pre><code>&lt;font color="#000000"&gt;
set phpcb_path="F:Program FilesphpCB&lt;br /&gt;set phpcb_ini=%phpcb_path%phpCodeBeautifier.ini"&lt;br /&gt;echo [Settings]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;%phpcb_ini%&lt;br /&gt;echo LastFile=%1&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo [MainForm]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo Left=-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo Width=1032&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo Top=-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo Height=748&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo [Options]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo FileFormat=0&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;echo Settings=PEAR&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;%phpcb_ini%&lt;br /&gt;&lt;br /&gt;%phpcb_path%phpCodeBeautifier.exe&lt;/font&gt;</code></pre>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>在editplus的工具配置中调用以上批处理文件，参数为$(FilePath),一切搞定，可以用phpCodeBeautifier自动打开editplus当前编辑的文件:P</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/26/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>等待pear投票的模板程序HTML_Template_Savant</title>
		<link>http://www.ooso.net/archives/35</link>
		<comments>http://www.ooso.net/archives/35#comments</comments>
		<pubDate>Sat, 03 Aug 2002 08:33:48 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">/?p=35</guid>
		<description><![CDATA[在zend.com上看到这个模板程序,咋一看结构代码都很像smarttemplate,但是细看处理方法却是截然不同,模板程序中都是直接使用的php代码,如下面这段常见的循环显示代码:
&#60; ?php foreach ($book as $key =&#62; $val): ?&#62;
    &#60;tr&#62;
       &#60;td&#62;&#60; ?php echo $val[‘author’] ?&#62;&#60;/td&#62;

				<span class="readmore"><a href="http://www.ooso.net/archives/35" title="等待pear投票的模板程序HTML_Template_Savant">阅读全文（338字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在zend.com上看到这个模板程序,咋一看结构代码都很像smarttemplate,但是细看处理方法却是截然不同,模板程序中都是直接使用的php代码,如下面这段常见的循环显示代码:</p>
<pre><code>&lt; ?php foreach ($book as $key =&gt; $val): ?&gt;
    &lt;tr&gt;
       &lt;td&gt;&lt; ?php echo $val[‘author’] ?&gt;&lt;/td&gt;
       &lt;td&gt;&lt; ?php echo $val[‘title’] ?&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt; ?php endforeach; ?&gt;</code></pre>
<p>我觉得用这种方式处理比较灵活,也还方便,而且并不需要生成cache之类的把戏,因为它本身已经是php程序了.加上方便的plugin和filter扩展,值得考虑,下面是这个模板的详细信息:<br />
<br />http://pear.php.net/pepr/pepr-proposal-show.php?id=83</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/35/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>升级到php5的日记 一</title>
		<link>http://www.ooso.net/archives/90</link>
		<comments>http://www.ooso.net/archives/90#comments</comments>
		<pubDate>Sat, 03 Aug 2002 08:33:48 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">/?p=90</guid>
		<description><![CDATA[终于要从php4升级到php5了,是的,俺费尽了口舌,说服了boss使用php5和mysqli开发新项目.
首先俺细细的阅读了官方站点上介绍php5的有关章节,以及网络上的一些关于php5的文章.基本开发环境定为linux+apache2+php5+mysql4.1,很经典的搭配.为了提高开发效率,俺决定继续使用pear的类库和prado,因此现状是php4,php5的代码将并存.第一周俺们就遇到了麻烦:
1.mysqli和zend1的兼容性php.ini里面有一个选项,可以开启对zend1的兼容性,如果你在打开这个开关的同时还想使用mysqli的话,很快就会失望.它会无情的告诉你:unable clone a uncloneable object&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;

				<span class="readmore"><a href="http://www.ooso.net/archives/90" title="升级到php5的日记 一">阅读全文（504字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>终于要从php4升级到php5了,是的,俺费尽了口舌,说服了boss使用php5和mysqli开发新项目.</p>
<p>首先俺细细的阅读了官方站点上介绍php5的有关章节,以及网络上的一些关于php5的文章.基本开发环境定为linux+apache2+php5+mysql4.1,很经典的搭配.为了提高开发效率,俺决定继续使用<a href="http://pear.php.net/">pear</a>的类库和<a href="http://www.xisc.com/">prado</a>,因此现状是php4,php5的代码将并存.第一周俺们就遇到了麻烦:</p>
<p>1.mysqli和zend1的兼容性<br />php.ini里面有一个选项,可以开启对zend1的兼容性,如果你在打开这个开关的同时还想使用mysqli的话,很快就会失望.它会无情的告诉你:<br />unable clone a uncloneable object&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</p>
<p>2.使用prado和php5的一些问题<br />prado程序包prado.php的有段代码如下:<br />set_error_handler( &#8230;&#8230;.. );<br />php5的配置默认是不提示E_STRICT级别的错误,要命的是,这行代码对任何错误都会die(&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..),pear的代码完全没办法工作,只好咔嚓之</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/90/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pear帮助手册的chm版</title>
		<link>http://www.ooso.net/archives/36</link>
		<comments>http://www.ooso.net/archives/36#comments</comments>
		<pubDate>Sat, 03 Aug 2002 08:33:48 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">/?p=36</guid>
		<description><![CDATA[在pear的站点上看到有chm版本的手册下载了,我想这东东以后会和php手册,mysql手册,js手册一起,常备俺的案头,时时不忘拿出来翻阅一番:
下载地址
]]></description>
			<content:encoded><![CDATA[<p>在pear的站点上看到有chm版本的手册下载了,我想这东东以后会和php手册,mysql手册,js手册一起,常备俺的案头,时时不忘拿出来翻阅一番:<br />
<br /><a href="http://pear.php.net/manual/index.php" target="_blank"><img src="/images/url.gif" border="0" alt="超链接地址" align="bottom"/>下载地址</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/36/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpCodeBeautiful与editplus结合改进</title>
		<link>http://www.ooso.net/archives/29</link>
		<comments>http://www.ooso.net/archives/29#comments</comments>
		<pubDate>Sat, 03 Aug 2002 08:33:48 +0000</pubDate>
		<dc:creator>Volcano</dc:creator>
				<category><![CDATA[pear]]></category>
		<category><![CDATA[editplus]]></category>

		<guid isPermaLink="false">/?p=29</guid>
		<description><![CDATA[有人提议使用phpCodeBeautiful的命令行，看这里：http://club.phpe.net/index.php?act=ST&#038;f=2&#038;t=3701 
在此基础上俺进行了修改,适合自己使用：
pcb.bat


				<span class="readmore"><a href="http://www.ooso.net/archives/29" title="phpCodeBeautiful与editplus结合改进">阅读全文（596字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>有人提议使用phpCodeBeautiful的命令行，看这里：<a href="http://club.phpe.net/index.php?act=ST&#038;f=2&#038;t=3701" target="_blank"><img src="/images/url.gif" border="0" alt="超链接地址" align="bottom"/>http://club.phpe.net/index.php?act=ST&#038;f=2&#038;t=3701</a> </p>
<p>在此基础上俺进行了修改,适合自己使用：<br />
<br />pcb.bat<br />
<table border=1 cellpadding="3" cellspacing="3" style="border-collapse: collapse" bordercolor="#055AA0" width=95%>
<tr>
<td>
<pre><code>代码片段:</code></pre>
<p>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="100%" class="code">
<pre><code>&lt;font color="#000000"&gt;
set phpcb_path="F:Program FilesphpCB"&lt;br /&gt;%phpcb_path%phpCB.exe -space-after-if -space-after-switch -space-after-while -space-before-start-angle-bracket -space-after-end-angle-bracket -glue-amperscore -change-shell-comment-to-double-slashes-comment -force-large-php-code-tag -force-true-false-null-contant-lowercase --comment-rendering-style PEAR -align-equal-statements-to-fixed-pos -indent-with-tab -optimize-eol -align-equal-statements --padding-char-count 1 %1 &gt; %TEMP%phpcbTemp.php&lt;br /&gt;move /Y %TEMP%phpcbTemp.php %1&lt;/font&gt;</code></pre>
</td>
</tr>
</table>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.ooso.net/archives/29/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

