<?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>PHP Stone &#187; PHP</title>
	<atom:link href="http://phpstone.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://phpstone.com</link>
	<description>——从石头向宝石进化</description>
	<lastBuildDate>Thu, 05 Aug 2010 14:04:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP 导航提示（面包屑型轨迹）</title>
		<link>http://phpstone.com/php-navigation-tips/</link>
		<comments>http://phpstone.com/php-navigation-tips/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 07:43:55 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=474</guid>
		<description><![CDATA[导航提示（面包屑型轨迹）为Web用户提供了方便、直观的导航帮助，将用户的当前位置分解为一个超链接路径提供当前文档中网站中相对位置的总揽。总体来说，更加优于浏览器本身提供的导航工具，而且能够补充甚至替代一般网站的本地化菜单系统。
这里演示两种不同的方法，第一种使用数组将难于处理的URL树转换为更加友好的用户命名约定。这种实现对于创建对应基本静态页面的导航树比较实用。第二种使用MySQL数据库，为数据库驱动的网站创建用户友好的导航映射。最后将面包屑轨迹简单地应用到 WordPress 模板的编写中。
一、基于静态数据创建面包屑型轨迹
实现思路：

 使用$_SERVER['PHP_SELF'] 读取文件的目录树。
将目录树各级转换为数组。
创建一个关联数组，用来为导航提供用户友好的名字。
创建URL解析和映射函数create_crumbs()。将其存储在全局网站头文件中。
在需要导航提示的页面执行create_crumbs() 函数。



function create_crumbs($crumb_site, $home_label, $crumb_labels) {

$crumb_trail = &#34;&#60;a href = \&#34;$crumb_site\&#34;&#62;$home_label&#60;/a&#62;&#34;;
$crumb_tree = explode(&#039;/&#039;, $_SERVER[&#039;PHP_SELF&#039;]);
//explode()函数分割字符串到数组，这里以斜杠“/&#34;作为分割
$crumb_path = $crumb_site.&#039;/&#039;;

for ($x = 1; $x &#60; count($crumb_tree) - 1; $x++) {
$crumb_path .= $crumb_tree[$x].&#039;/&#039;;
$crumb_trail .= &#039; &#38;gt; &#60;a href=&#34;&#039;.$crumb_path.&#039;&#34;&#62;&#039; .$crumb_labels[$crumb_tree[$x]].&#039;&#60;/a&#62;&#039;;
}

return $crumb_trail;
}

保存为 “breadcrumbs.php”到相应目录，这里方便示例保存到和测试页面同一目录下，即 /php/form/pmnp/mysql/ 下。接着创建3个输入参数并执行函数：


include &#34;breadcrumbs.php&#34;;
$crumb_site = &#34;http://localhost&#34;;  //这里在本机测试，如果在另外服务器替换相应域名
$crumb_labels = array(
&#34;php&#34; =&#62; &#34;PHP&#34;,
&#34;form&#34; =&#62; &#34;Recent Articles&#34;,
&#34;pmnp&#34; =&#62; &#34;Beginning PHP [...]]]></description>
			<content:encoded><![CDATA[<p>导航提示（面包屑型轨迹）为Web用户提供了方便、直观的导航帮助，将用户的当前位置分解为一个超链接路径提供当前文档中网站中相对位置的总揽。总体来说，更加优于浏览器本身提供的导航工具，而且能够补充甚至替代一般网站的本地化菜单系统。</p>
<p>这里演示两种不同的方法，第一种使用数组将难于处理的URL树转换为更加友好的用户命名约定。这种实现对于创建对应基本静态页面的导航树比较实用。第二种使用MySQL数据库，为数据库驱动的网站创建用户友好的导航映射。最后将面包屑轨迹简单地应用到 WordPress 模板的编写中。<span id="more-474"></span></p>
<h3>一、基于静态数据创建面包屑型轨迹</h3>
<p>实现思路：</p>
<ol>
<li> 使用$_SERVER['PHP_SELF'] 读取文件的目录树。</li>
<li>将目录树各级转换为数组。</li>
<li>创建一个关联数组，用来为导航提供用户友好的名字。</li>
<li>创建URL解析和映射函数create_crumbs()。将其存储在全局网站头文件中。</li>
<li>在需要导航提示的页面执行create_crumbs() 函数。</li>
</ol>
<pre class="brush: php; ">

function create_crumbs($crumb_site, $home_label, $crumb_labels) {

$crumb_trail = &quot;&lt;a href = \&quot;$crumb_site\&quot;&gt;$home_label&lt;/a&gt;&quot;;
$crumb_tree = explode(&#039;/&#039;, $_SERVER[&#039;PHP_SELF&#039;]);
//explode()函数分割字符串到数组，这里以斜杠“/&quot;作为分割
$crumb_path = $crumb_site.&#039;/&#039;;

for ($x = 1; $x &lt; count($crumb_tree) - 1; $x++) {
$crumb_path .= $crumb_tree[$x].&#039;/&#039;;
$crumb_trail .= &#039; &amp;gt; &lt;a href=&quot;&#039;.$crumb_path.&#039;&quot;&gt;&#039; .$crumb_labels[$crumb_tree[$x]].&#039;&lt;/a&gt;&#039;;
}

return $crumb_trail;
}
</pre>
<p>保存为 “breadcrumbs.php”到相应目录，这里方便示例保存到和测试页面同一目录下，即 /php/form/pmnp/mysql/ 下。接着创建3个输入参数并执行函数：</p>
<pre class="brush: php; ">

include &quot;breadcrumbs.php&quot;;
$crumb_site = &quot;http://localhost&quot;;  //这里在本机测试，如果在另外服务器替换相应域名
$crumb_labels = array(
&quot;php&quot; =&gt; &quot;PHP&quot;,
&quot;form&quot; =&gt; &quot;Recent Articles&quot;,
&quot;pmnp&quot; =&gt; &quot;Beginning PHP and MySQL 5&quot;,
&quot;mysql&quot; =&gt; &quot;MYSQL&quot;
);

echo create_crumbs($crumb_site, &quot;Home&quot;, $crumb_labels);
</pre>
<p>将此代码保存执行即可得到如下面包屑型轨迹：</p>
<pre>Home &gt; PHP  &gt; Recent Articles &gt; Beginning PHP and MySQL 5 &gt; MYSQL</pre>
<h3>二、基于数据库表数据创建面包屑型轨迹</h3>
<p>考虑将 URL http://www.example.com/books/1590595521/ 转换为如下面包屑型轨迹：</p>
<pre>Home &gt; IT &gt; Beginning PHP and MySQL5</pre>
<p>对于数据库驱动的网站而言，用数组来处理存贮的动态信息虽然可行，但并不是最方便的方式。下面只是一个简单的实现，将指定的ISBN号码查询出匹配的书名和所属分类，输出到导航位置。</p>
<p>以下 categories 表提供了书类别到 books 表中存储的 书之间的一对多的映射。</p>
<pre class="brush: sql; ">

create table categories2 (
categoryID  TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(15) NOT NULL );
</pre>
<p>表 books 用于存贮出版商的图书信息：</p>
<pre class="brush: sql; ">

create table books (
bookID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
categoryID TINYINT NOT NULL,
isbn VARCHAR(9) NOT NULL,
author VARCHAR(50) NOT NULL,
title VARCHAR(45) NOT NULL,
description VARCHAR(300) NOT NULL );
</pre>
<p>在books表中插入数据:</p>
<pre class="brush: sql; ">

insert into books (categoryID,isbn,author,title,description)
values (&#039;2&#039;,&#039;159059552&#039;,&#039;Kevin&#039;,&#039;Beginning PHP and MySQL5&#039;,&#039;How to learn PHP and MySQ&#039;);
</pre>
<p>创建好数据库后，现在编写PHP代码部分，以上省略了创建数据库表时提供的数据库名和用户，需自行创建并调整PHP代码连接数据库部分。</p>
<pre class="brush: php; ">

function create_crumbs($siteURL, $categoryID, $categoryName, $title) {
$crumb = &quot;&lt;a href = \&quot;$siteURL\&quot;&gt;Home&lt;/a&gt; &amp;gt; &lt;a href = \&quot;$siteURL/category/$categoryID/\&quot;&gt;$categoryName&lt;/a&gt; &amp;gt; $title&quot;;
print $crumb;
}

$siteURL = &quot;Http://localhost&quot;;

mysql_pconnect(&quot;localhost&quot;,&quot;website&quot;,&quot;secret&quot;);
mysql_select_db(&quot;corporate&quot;);

$isbn =&quot;159059552&quot;;

$result = mysql_query(&quot;select b.categoryID,c.name,b.isbn,b.author,b.title,b.description from books b,categories c where b.isbn = $isbn and b.categoryID = c.categoryID&quot;);

$row = mysql_fetch_assoc($result);

$categoryID = $row[&quot;categoryID&quot;];
$categoryName = $row[&quot;name&quot;];
$isbn = $row[&quot;isbn&quot;];
$authorID = $row[&quot;author&quot;];
$title = $row[&quot;title&quot;];

create_crumbs($siteURL, $categoryID, $categoryName, $title);
</pre>
<p>直接在浏览器执行这个PHP文件即可得到效果。</p>
<h3>向 WordPress 模板添加面包屑型轨迹</h3>
<p>由于WordPress 有大量可用的函数，在其模板里实现面包屑型轨迹是一个很简单的事情。只需要在 “single.php” 需要展示导航提示的位置添加下面代码即可实现：</p>
<pre class="brush: php; ">

&lt;a title=&quot;Back to Homepage&quot; href=&quot;&lt;?php echo get_settings(&#039;home&#039;); ?&gt;/&quot;&gt;Home&lt;/a&gt;
&amp;gt; &lt;?php the_category(&#039;, &#039;); ?&gt;
&amp;gt; &lt;?php the_title(); ?&gt;
</pre>
<p>而达到如下的效果：</p>
<pre>Home &gt; 文章目录 &gt; 文章名称</pre>
<p>至于达到更好的样式，通过一些 CSS 代码的调整应该可以达到满意的效果。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-navigation-tips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>递归函数 &#8211; 还贷计算器</title>
		<link>http://phpstone.com/recursive-function/</link>
		<comments>http://phpstone.com/recursive-function/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 09:08:00 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=453</guid>
		<description><![CDATA[递归函数（recursive function)，即调用自身的函数，通常有很好的实用价值，用来将复杂的问题分解为简单的情况，反复调用自身处理直到问题解决。
这里以还贷计算器中的等额本息（每月以相等金额还贷款的本金加利息）还款为例子，输出一个表格，例举出每一期还款所需要的偿还的金额，所还的利息以及每月的贷款本金减少额。
先做一个HTML表接受用户输入，代码如下：


&#60;h2&#62;等额本息还款&#60;/h2&#62;
&#60;form action=&#34;&#60;?php $PHP_SELF; ?&#62;&#34; method=&#34;post&#34;&#62;
&#60;p&#62;
贷款本金:&#60;br /&#62;
&#60;input type=&#34;text&#34; id=&#34;balance&#34; name=&#34;balance&#34; size=&#34;20&#34; maxlength=&#34;40&#34; /&#62;
&#60;/p&#62;
&#60;p&#62;
贷款年限:&#60;br /&#62;
&#60;input type=&#34;text&#34; id=&#34;term&#34; name=&#34;term&#34; size=&#34;20&#34; maxlength=&#34;40&#34; /&#62;
&#60;/p&#62;
&#60;p&#62;
年利率(%):&#60;br /&#62;
&#60;input type=&#34;text&#34; id=&#34;rate&#34; name=&#34;rate&#34; size=&#34;20&#34; maxlength=&#34;40&#34; /&#62;
&#60;/p&#62;
&#60;input type=&#34;submit&#34; id=&#34;submit&#34; name=&#34;submit&#34; value=&#34;计算&#34; /&#62;
&#60;/form&#62;

现在编写实现主要功能的递归函数。需要了解到的是，每月本金减少额=每月还款额-每月的利息。当贷款本金不等于0时，重复执行函数到贷款本金为0时结束。
注：《PHP与MySQL 5程序设计》（第2版）上有这个例子，但书上 if 判断当本金为 0 时执行 exit，将导致不能输出 &#60;/table&#62; 结束标志和后面的 HTML代码，此处做了修改，本金为 0 时直接输出&#60;/table&#62;。


//Recursive Function(递归函数)

/*
$paymentNum--还款期数
$balance--贷款本金
$periodicPayment--每月还款额
$paymentInterest--每月的利息
$paymentPrincipal--每月本金减少额
$monthlyInterest--月利率
*/

function amortizationTable($paymentNum,$periodicPayment,$balance,$monthlyInterest) {
$paymentInterest = round($balance * $monthlyInterest,2);
$paymentPrincipal = round($periodicPayment - $paymentInterest,2);
$newBalance = [...]]]></description>
			<content:encoded><![CDATA[<p>递归函数（recursive function)，即调用自身的函数，通常有很好的实用价值，用来将复杂的问题分解为简单的情况，反复调用自身处理直到问题解决。</p>
<p>这里以还贷计算器中的等额本息（每月以相等金额还贷款的本金加利息）还款为例子，输出一个表格，例举出每一期还款所需要的偿还的金额，所还的利息以及每月的贷款本金减少额。</p>
<p>先做一个HTML表接受用户输入，代码如下：<span id="more-453"></span></p>
<pre class="brush: xml; ">

&lt;h2&gt;等额本息还款&lt;/h2&gt;
&lt;form action=&quot;&lt;?php $PHP_SELF; ?&gt;&quot; method=&quot;post&quot;&gt;
&lt;p&gt;
贷款本金:&lt;br /&gt;
&lt;input type=&quot;text&quot; id=&quot;balance&quot; name=&quot;balance&quot; size=&quot;20&quot; maxlength=&quot;40&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
贷款年限:&lt;br /&gt;
&lt;input type=&quot;text&quot; id=&quot;term&quot; name=&quot;term&quot; size=&quot;20&quot; maxlength=&quot;40&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
年利率(%):&lt;br /&gt;
&lt;input type=&quot;text&quot; id=&quot;rate&quot; name=&quot;rate&quot; size=&quot;20&quot; maxlength=&quot;40&quot; /&gt;
&lt;/p&gt;
&lt;input type=&quot;submit&quot; id=&quot;submit&quot; name=&quot;submit&quot; value=&quot;计算&quot; /&gt;
&lt;/form&gt;
</pre>
<p>现在编写实现主要功能的递归函数。需要了解到的是，每月本金减少额=每月还款额-每月的利息。当贷款本金不等于0时，重复执行函数到贷款本金为0时结束。</p>
<p>注：《PHP与MySQL 5程序设计》（第2版）上有这个例子，但书上 if 判断当本金为 0 时执行 exit，将导致不能输出 &lt;/table&gt; 结束标志和后面的 HTML代码，此处做了修改，本金为 0 时直接输出&lt;/table&gt;。</p>
<pre class="brush: php; ">

//Recursive Function(递归函数)

/*
$paymentNum--还款期数
$balance--贷款本金
$periodicPayment--每月还款额
$paymentInterest--每月的利息
$paymentPrincipal--每月本金减少额
$monthlyInterest--月利率
*/

function amortizationTable($paymentNum,$periodicPayment,$balance,$monthlyInterest) {
$paymentInterest = round($balance * $monthlyInterest,2);
$paymentPrincipal = round($periodicPayment - $paymentInterest,2);
$newBalance = round($balance - $paymentPrincipal,2);
echo &quot;&lt;tr&gt;
&lt;td&gt;$paymentNum&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($balance,2).&quot;&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($periodicPayment,2).&quot;&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($paymentInterest,2).&quot;&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($paymentPrincipal,2).&quot;&lt;/td&gt;
&lt;/tr&gt;&quot;;
//If balance not yet zero,recursively call amortizationTable()
if ($newBalance &gt; 0) {
$paymentNum++;
amortizationTable($paymentNum,$periodicPayment,$newBalance,$monthlyInterest);
}
else {
echo &quot;&lt;/table&gt;&quot;;
}
} //end amortizationTable()
</pre>
<p>接下来计算每月还款额以及执行递归函数。</p>
<p>Tips：每月还款额=贷款本金×月利率×(1＋月利率)^还款总期数／（(1＋月利率)^还款总期数-1 ）</p>
<p>x^y 表示x的y次方</p>
<p>因为将表单和函数执行写在一个文件上，因此再添加一个 if 判断，有表单数据递交时才执行后面的代码</p>
<pre class="brush: php; ">

if (isset($_POST[&#039;submit&#039;]))
{

# Loan balance (贷款余额)
$balance = $_POST[&#039;balance&#039;];

# Loan interest(利、息) rate
$interestRate = $_POST[&#039;rate&#039;] / 100;

# Mothly interest rate
$monthlyInterest = $interestRate / 12;

# Term length of the loan(固定贷款期限),in year.
$termLength = $_POST[&#039;term&#039;];

# Number of payments per year.
$paymentsPerYear = 12;

# Payment iteration(迭代)
$paymentNumber = 1;

# Perform preliminary calculations
$totalPayments = $termLength * $paymentsPerYear;
$intCalc = 1 + $interestRate / $paymentsPerYear;    # 1+月利率
$periodicPayment = $balance * pow($intCalc,$totalPayments) * ($intCalc -1 ) / (pow($intCalc,$totalPayments) - 1);
$periodicPayment = round($periodicPayment,2);
echo &quot;&lt;p&gt;您计算的每月还款额为: ￥&quot;.$periodicPayment.&quot;&lt;/p&gt;&quot;;
?&gt;
&lt;table width=&#039;50%&#039; align=&#039;center&#039; border=&#039;1&#039;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Payment Number&lt;/th&gt;&lt;th&gt;Balance&lt;/th&gt;
&lt;th&gt;Payment&lt;/th&gt;&lt;th&gt;Interest&lt;/th&gt;&lt;th&gt;Principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tfoot&gt;
&lt;tr&gt;
&lt;th colspan=&quot;5&quot;&gt;Now We are Finished!&lt;/th&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;?php
# Call recursive function
amortizationTable($paymentNumber,$periodicPayment,$balance,$monthlyInterest);
} //End if
?&gt;
</pre>
<p>使用递归策略通常能大幅减少代码量，提高重用性。虽然递归并不总是最好的解决办法，但是可以作为一个有益的补充。</p>
<p>PS：关于 HTML 表格的一些问题</p>
<p>&lt;thead&gt;, &lt;tbody&gt; 和 &lt;tfoot&gt;很少被用到，这是由于浏览器对它们的支持不太好。但是用这些标签定义表格可以在使用被支持的浏览器（如 Firefox)打印时产生一个效果，就是当表格过长超过一个打印页时将每页添加表格页眉和页脚，以方便查看数据。感兴趣的可以运行代码试试。</p>
<p>经过我的测试Windows 7下firefox和ie8，在只使用 &lt;thead&gt; 和 &lt;tbody&gt; 而不使用 &lt;tfoot&gt; 时打印页眉页脚正常。在 Mac 下仅 firefox 正常。至于为什么添加了 &lt;tfoot&gt; 反而出现问题我也不甚理解，请知晓的朋友在此留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/recursive-function/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>为PHP5安装PEAR</title>
		<link>http://phpstone.com/install-pear-for-php5/</link>
		<comments>http://phpstone.com/install-pear-for-php5/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 08:02:59 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[pear]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=401</guid>
		<description><![CDATA[最近在学习PHP的PEAR（PHP Extension and Application Repository PHP扩展与应用库），测试软件我都首先在FreeBSD上安装，因为早已习惯与其软件维护的简便。
#cd /usr/ports/devel/pear
#make install clean
执行安装后提示当前PHP没有运行在命令行模式下，无法安装
#cd /usr/ports/lang/php5
#make config
将PHP配置选项的CLI选择上，CLI是PHP的命令行模式，将此选项编译允许PHP使用此模式，才能安装PEAR。
此时可以执行重新安装命令 #make reinstall clean，不巧此时在服务器上的PHP版本需要升级，因此我直接执行了 #portupgrade php5，完成升级后重新进入pear的ports目录安装。
安装完成后，执行 #pear list 可查询默认安装的PEAR包，执行 #pear install pkgname 可以安装所需PEAR包。
Mac OS X 下我使用的是MAMP，里面默认安装了PEAR，但是需要使用 pear 命令的话需要定位到MAMP的安装目录，或者配置用户的bash环境。
Windows下则是默认没有安装PEAR，可在PHP目录下执行go-pear.bat进行安装配置，或者使用官方提供的go-pear.php 文件使用web管理方式（Webbased PEAR Package Manager）进行安装，安装完成后可以访问管理目录进行PEAR的包管理、安装等，较为直观。
]]></description>
			<content:encoded><![CDATA[<p>最近在学习PHP的PEAR（PHP Extension and Application Repository PHP扩展与应用库），测试软件我都首先在FreeBSD上安装，因为早已习惯与其软件维护的简便。</p>
<p>#cd /usr/ports/devel/pear<br />
#make install clean</p>
<p>执行安装后提示当前PHP没有运行在命令行模式下，无法安装</p>
<p>#cd /usr/ports/lang/php5<br />
#make config<span id="more-401"></span></p>
<p>将PHP配置选项的CLI选择上，CLI是PHP的命令行模式，将此选项编译允许PHP使用此模式，才能安装PEAR。<br />
此时可以执行重新安装命令 #make reinstall clean，不巧此时在服务器上的PHP版本需要升级，因此我直接执行了 #portupgrade php5，完成升级后重新进入pear的ports目录安装。</p>
<p>安装完成后，执行 #pear list 可查询默认安装的PEAR包，执行 #pear install pkgname 可以安装所需PEAR包。</p>
<p>Mac OS X 下我使用的是MAMP，里面默认安装了PEAR，但是需要使用 pear 命令的话需要定位到MAMP的安装目录，或者配置用户的bash环境。</p>
<p>Windows下则是默认没有安装PEAR，可在PHP目录下执行go-pear.bat进行安装配置，或者使用官方提供的go-pear.php 文件使用web管理方式（Webbased PEAR Package Manager）进行安装，安装完成后可以访问管理目录进行PEAR的包管理、安装等，较为直观。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/install-pear-for-php5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 遍历数组的方法</title>
		<link>http://phpstone.com/the-method-of-traverse-an-array-in-php/</link>
		<comments>http://phpstone.com/the-method-of-traverse-an-array-in-php/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 15:25:08 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=323</guid>
		<description><![CDATA[1. foreach()
foreach()是一个用来遍历数组中数据的最简单有效的方法。
#example1:


&#60;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);
foreach ($colors as $color) {
	echo &#34;Do you like $color? &#60;br /&#62;&#34;;
}
?&#62;

显示结果：
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow? 
2. while() 
while() 通常和 list()，each()配合使用。
#example2:


&#60;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);

while(list($key,$val) = each($colors)) {
	echo &#34;Other list of $val.&#60;br /&#62;&#34;;
}
?&#62;

显示结果：
Other list of red.
Other list of blue.
Other list of green.
Other list of yellow.
3. for() 
#example3:


&#60;?php
$arr [...]]]></description>
			<content:encoded><![CDATA[<h3>1. foreach()</h3>
<p>foreach()是一个用来遍历数组中数据的最简单有效的方法。</p>
<p>#example1:</p>
<pre class="brush: php; ">

&lt;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);
foreach ($colors as $color) {
	echo &quot;Do you like $color? &lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Do you like red?<br />
Do you like blue?<br />
Do you like green?<br />
Do you like yellow? <span id="more-323"></span></p>
<h3>2. while() </h3>
<p>while() 通常和 list()，each()配合使用。</p>
<p>#example2:</p>
<pre class="brush: php; ">

&lt;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);

while(list($key,$val) = each($colors)) {
	echo &quot;Other list of $val.&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Other list of red.<br />
Other list of blue.<br />
Other list of green.<br />
Other list of yellow.</p>
<h3>3. for() </h3>
<p>#example3:</p>
<pre class="brush: php; ">

&lt;?php
$arr = array (&quot;0&quot; =&gt; &quot;zero&quot;,&quot;1&quot; =&gt; &quot;one&quot;,&quot;2&quot; =&gt; &quot;two&quot;);

for ($i = 0;$i &lt; count($arr); $i++) {
	$str = $arr[$i];
	echo &quot;the number is $str.&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>the number is zero.<br />
the number is one.<br />
the number is two.</p>
<p>========= 以下是函数介绍 ==========</p>
<h3>key()</h3>
<p>mixed key(array input_array)</p>
<p>key()函数返回input_array中位于当前指针位置的键元素。</p>
<p>#example4</p>
<pre class="brush: php; ">

&lt;?php
$capitals = array(&quot;Ohio&quot; =&gt; &quot;Columbus&quot;,&quot;Towa&quot; =&gt; &quot;Des Moines&quot;,&quot;Arizona&quot; =&gt; &quot;Phoenix&quot;);
echo &quot;&lt;p&gt;Can you name the capitals of these states?&lt;/p&gt;&quot;;
while($key = key($capitals)) {
	echo $key.&quot;&lt;br /&gt;&quot;;
	next($capitals);
//每个key()调用不会推进指针。为此要使用next()函数
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Can you name the capitals of these states?<br />
Ohio<br />
Towa<br />
Arizona</p>
<h3>reset()</h3>
<p>mixed reset(array input_array)</p>
<p>reset()函数用来将input_array的指针设置回数组的开始位置。如果需要在一个脚本中多次查看或处理同一个数组，就经常使用这个函数，另外这个函数还常用于排序结束时。</p>
<p>#example5  －  在#example1上追加代码</p>
<pre class="brush: php; ">

&lt;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);
foreach ($colors as $color) {
	echo &quot;Do you like $color? &lt;br /&gt;&quot;;
}

reset($colors);

while(list($key,$val) = each($colors)) {
	echo &quot;$key =&gt; $val&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Do you like red?<br />
Do you like blue?<br />
Do you like green?<br />
Do you like yellow?<br />
0 => red<br />
1 => blue<br />
2 => green<br />
3 => yellow</p>
<p>注意：将一个数组赋值给另一个数组时会重置原来的数组指针，因此在上例中如果我们在循环内部将 $colors 赋给了另一个变量的话将会导致无限循环。<br />
例如将 $s1 = $colors; 添加到while循环内，再次执行代码，浏览器就会无休止地显示结果。</p>
<h3>each()</h3>
<p>array each(array input_array)</p>
<p>each()函数返回输入数组当前键/值对，并将指针推进一个位置。返回的数组包含四个键，键0和key包含键名，而键1和value包含相应的数据。如果执行each()前指针位于数组末尾，则返回FALSE。</p>
<p>#example6</p>
<pre class="brush: php; ">

&lt;?php
$capitals = array(&quot;Ohio&quot; =&gt; &quot;Columbus&quot;,&quot;Towa&quot; =&gt; &quot;Des Moines&quot;,&quot;Arizona&quot; =&gt; &quot;Phoenix&quot;);

$s1 = each($capitals);
print_r($s1);
?&gt;
</pre>
<p>显示结果：</p>
<p>Array ( [1] => Columbus [value] => Columbus [0] => Ohio [key] => Ohio ) </p>
<h3>current()，next()，prev()，end()</h3>
<p>mixed current(array target_array)</p>
<p>current()函数返回位于target_array数组当前指针位置的数组值。与next()、prev()、和end()函数不同，current()不移动指针。<br />
next()函数返回紧接着放在当前数组指针的下一个位置的数组值。<br />
prev()函数返回位于当前指针的前一个位置的数组值，如果指针本来就位于数组的第一个位置，则返回FALSE。<br />
end()函数将指针移向target_array的最后一个位置，并返回最后一个元素。</p>
<p>#example7</p>
<pre class="brush: php; ">

&lt;?php
$fruits = array(&quot;apple&quot;,&quot;orange&quot;,&quot;banana&quot;);

$fruit = current($fruits);	//return &quot;apple&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;

$fruit = next($fruits);		//return &quot;orange&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;

$fruit = prev($fruits);		//return &quot;apple&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;

$fruit = end($fruits);		//return &quot;banana&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;
?&gt;
</pre>
<p>显示结果：</p>
<p>apple<br />
orange<br />
apple<br />
banana</p>
<p>=========== 下面来测试三种遍历数组的速度 ===========</p>
<p>一般情况下，遍历一个数组有三种方法，for、while、foreach。其中最简单方便的是foreach。下面先让我们来测试一下共同遍历一个有50000个下标的一维数组所耗的时间。</p>
<p>测试环境：<br />
Intel Core Due2 2GHz<br />
2GB 1067MHz DDR3<br />
Mac OS X 10.5.7<br />
Apache 2.0.59<br />
MySQL 5.0.41<br />
PHP 5.2.6</p>
<p>#example8</p>
<pre class="brush: php; ">

&lt;?php
$arr = array();
for($i = 0; $i &lt; 50000; $i++){
$arr[] = $i*rand(1000,9999);
}

function GetRunTime()
{
list($usec,$sec)=explode(&quot; &quot;,microtime());
return ((float)$usec+(float)$sec);
}
######################################
$time_start = GetRunTime(); 

for($i = 0; $i &lt; count($arr); $i++){
$str = $arr[$i];
} 

$time_end = GetRunTime();
$time_used = $time_end - $time_start;

echo &#039;Used time of for:&#039;.round($time_used, 7).&#039;(s)&lt;br /&gt;&lt;br /&gt;&#039;;
unset($str, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();

while(list($key, $val) = each($arr)){
$str = $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#039;Used time of while:&#039;.round($time_used, 7).&#039;(s)&lt;br /&gt;&lt;br /&gt;&#039;;
unset($str, $key, $val, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
foreach($arr as $key =&gt; $val){
$str = $val;
}

$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#039;Used time of foreach:&#039;.round($time_used, 7).&#039;(s)&lt;br /&gt;&lt;br /&gt;&#039;;

?&gt;
</pre>
<p>测试结果：</p>
<p>Used time of for:0.0228429(s)</p>
<p>Used time of while:0.0544658(s)</p>
<p>Used time of foreach:0.0085628(s)</p>
<p>经过反复多次测试，结果表明，对于遍历同样一个数组，foreach速度最快，最慢的则是while。从原理上来看，foreach是对数组副本进行操作（通过拷贝数组），而while则通过移动数组内部指标进行操作，一般逻辑下认为，while应该比foreach快（因为foreach在开始执行的时候首先把数组复制进去，而while直接移动内部指标。），但结果刚刚相反。原因应该是，foreach是PHP内部实现，而while是通用的循环结构。所以，在通常应用中foreach简单，而且效率高。在PHP5下，foreach还可以遍历类的属性。</p>
<p>&#8211;&#8211; EOF &#8211;&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/the-method-of-traverse-an-array-in-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac OS X 上的PHP开发环境</title>
		<link>http://phpstone.com/php-development-on-mac-os-x/</link>
		<comments>http://phpstone.com/php-development-on-mac-os-x/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 02:43:51 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=304</guid>
		<description><![CDATA[终究还是抵挡不住Apple的诱惑，入手Macbook。在这个从未接触过的Mac OS X上，开始捣鼓我的个人开发环境设置。
一、配置终端
我一直都喜欢用终端的，FreeBSD下用Tcsh，Ubuntu和Mac OS X下也尝试下bash。先查看终端的配置信息：
$echo $SHELL
/bin/bash
$echo $PS1
\h:\W \u\$    &#8211;这个4个参数分别是hostname，工作目录，用户名和美元符$,管理员级的配置文件是/etc/bashrc。
现在先选择终端的偏好设置，我将主题改到Pro并将字体改为Monaco 14pt，这个主题基本上是黑色背景＋20％左右的透明度，视觉效果很不错。然后在shell设定标签中，选择当shell退出时关闭窗口。我选择编辑~/.bash_profile
#设定别名通常在~/.bashrc里设定，我这里只是懒得去两个文件设置了。
#让ls命令显示文件类型颜色
alias ls=&#8217;ls -G&#8217;
#让la命令显示所有文件，这个在FreeBSD的tcsh下是默认选项
alias la=&#8217;ls -a&#8217;
#默认的4个参数是很通用的，我的习惯仅是换了一下位置并且给运行目录加上方括号
PS1=&#8217;\h:\u[\w]\$&#8217;
为什么开发PHP要配置终端（console）呢？一个原因是我认为作为初学者来说，有必须多用命令行熟悉MySQL的操作，而配置好的终端能让你心情愉悦；另外一个原因是Mac OS X是在BSD的分支上发展而来，其原始的Unix血统注定了许多方面使用终端的便捷和强大。
二、 安装与配置MAPM（Apache、PHP、MySQL）
Mac OS X 上默认安装了Apache，既然大家都推荐MAMP，我也先试用一下这个集成的安装包。不考虑用MAMP Pro，3个主程序都是免费的却花钱去买一个集成包，不是很尴尬么？
默认的Mac系统偏好设置下，Web共享是没有开启的，如果已手工开启，得需要先取消。
Preferences&#8230;下为Apache设置Document Root，我这里改到~/Sites/。更改完毕后，MAMP会自动重启Apache使其生效，因此访问：http://localhost/ 就能访问到Mac设定给Web共享下默认的首页“您的网站”。因为MAMP默认的站点根目录是“/Applications/MAMP/htdocs/&#8221;更改后，任然可以用&#8221;http://localhost/MAMP/&#8221;访问其起始配置页面。

这个页面可以轻松地查看phpinfo，访问phpmyadmin和SQLitemanager。
现在要来修改MySQL的密码。MAMP默认设定的MySQL用户使用root，密码使用root。原本以为我可以直接在终端登陆，提示“command not found”。找到MySQL命令文件夹“/Applications/MAMP/Library/bin/”，修改~/.bash_profile添加环境变量：
PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
:/Applications/MAMP/Library/bin
执行：source .bash_profile使其及时生效
#更改root口令
$mysqladmin -u root -p root password newpassword
#更改phpMyAdmin配置文件的数据库用户口令
$cd /Applications/MAMP/bin/phpMyAdmin
$vi config.inc.php
#修改如下语句段
$cfg['Servers'][$i]['password']      = 
#MAMP的起始页能直接进入phpMyAdmin，说明php文件里也配置了数据库的账号密码，
#至于这个起始页文件的位置好像不太好找，我想到肯定在httpd.conf中定义了alias,于是
$cat /Applications/MAMP/conf/apache/httpd.conf &#124; grep MAMP
Alias /MAMP &#8220;/Applications/MAMP/bin/mamp&#8221;
$cd /Applications/MAMP/bin/mamp/
$ls
$vi index.php
#定位搜索“root”字符串，同样更改密码
$link = @mysql_connect(&#8216;:/Applications/MAMP/tmp/mysql/mysql.sock&#8217;, &#8216;root&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>终究还是抵挡不住Apple的诱惑，入手Macbook。在这个从未接触过的Mac OS X上，开始捣鼓我的个人开发环境设置。</p>
<h3>一、配置终端</h3>
<p>我一直都喜欢用终端的，FreeBSD下用Tcsh，Ubuntu和Mac OS X下也尝试下bash。先查看终端的配置信息：</p>
<blockquote><p>$echo $SHELL<br />
/bin/bash</p>
<p>$echo $PS1<br />
\h:\W \u\$    &#8211;这个4个参数分别是hostname，工作目录，用户名和美元符$,管理员级的配置文件是/etc/bashrc。</p></blockquote>
<p>现在先选择终端的偏好设置，我将主题改到Pro并将字体改为Monaco 14pt，这个主题基本上是黑色背景＋20％左右的透明度，视觉效果很不错。然后在shell设定标签中，选择当shell退出时关闭窗口。我选择编辑~/.bash_profile<span id="more-304"></span></p>
<blockquote><p>#设定别名通常在~/.bashrc里设定，我这里只是懒得去两个文件设置了。</p>
<p>#让ls命令显示文件类型颜色<br />
alias ls=&#8217;ls -G&#8217;<br />
#让la命令显示所有文件，这个在FreeBSD的tcsh下是默认选项<br />
alias la=&#8217;ls -a&#8217;</p>
<p>#默认的4个参数是很通用的，我的习惯仅是换了一下位置并且给运行目录加上方括号<br />
PS1=&#8217;\h:\u[\w]\$&#8217;</p></blockquote>
<p>为什么开发PHP要配置终端（console）呢？一个原因是我认为作为初学者来说，有必须多用命令行熟悉MySQL的操作，而配置好的终端能让你心情愉悦；另外一个原因是Mac OS X是在BSD的分支上发展而来，其原始的Unix血统注定了许多方面使用终端的便捷和强大。</p>
<h3>二、 安装与配置MAPM（Apache、PHP、MySQL）</h3>
<p>Mac OS X 上默认安装了Apache，既然大家都推荐<a href="http://www.mamp.info/en/index.html">MAMP</a>，我也先试用一下这个集成的安装包。不考虑用MAMP Pro，3个主程序都是免费的却花钱去买一个集成包，不是很尴尬么？</p>
<p>默认的Mac系统偏好设置下，Web共享是没有开启的，如果已手工开启，得需要先取消。<br />
Preferences&#8230;下为Apache设置Document Root，我这里改到~/Sites/。更改完毕后，MAMP会自动重启Apache使其生效，因此访问：http://localhost/ 就能访问到Mac设定给Web共享下默认的首页“您的网站”。因为MAMP默认的站点根目录是“/Applications/MAMP/htdocs/&#8221;更改后，任然可以用&#8221;http://localhost/MAMP/&#8221;访问其起始配置页面。</p>
<p><img src="http://phpstone.com/wp-content/uploads/2009/06/mamp.png" alt="mamp" title="mamp" width="600" height="398" class="alignnone size-full wp-image-314" /></p>
<p>这个页面可以轻松地查看phpinfo，访问phpmyadmin和SQLitemanager。</p>
<p>现在要来修改MySQL的密码。MAMP默认设定的MySQL用户使用root，密码使用root。原本以为我可以直接在终端登陆，提示“command not found”。找到MySQL命令文件夹“/Applications/MAMP/Library/bin/”，修改~/.bash_profile添加环境变量：</p>
<p>PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin<br />
:/Applications/MAMP/Library/bin</p>
<p>执行：source .bash_profile使其及时生效</p>
<blockquote><p>#更改root口令<br />
$mysqladmin -u root -p root password newpassword</p>
<p>#更改phpMyAdmin配置文件的数据库用户口令<br />
$cd /Applications/MAMP/bin/phpMyAdmin<br />
$vi config.inc.php<br />
#修改如下语句段<br />
$cfg['Servers'][$i]['password']      = </p>
<p>#MAMP的起始页能直接进入phpMyAdmin，说明php文件里也配置了数据库的账号密码，<br />
#至于这个起始页文件的位置好像不太好找，我想到肯定在httpd.conf中定义了alias,于是</p>
<p>$cat /Applications/MAMP/conf/apache/httpd.conf | grep MAMP<br />
Alias /MAMP &#8220;/Applications/MAMP/bin/mamp&#8221;</p>
<p>$cd /Applications/MAMP/bin/mamp/<br />
$ls<br />
$vi index.php<br />
#定位搜索“root”字符串，同样更改密码<br />
$link = @mysql_connect(&#8216;:/Applications/MAMP/tmp/mysql/mysql.sock&#8217;, &#8216;root&#8217;, &#8216;    root&#8217;);</p></blockquote>
<p>这样，就能以修改后的密码进入起始页和phpMyAdmin，不然做为对外开放的MAMP，弱口令就不安全了。至于SQLite的配置，我还一点都不熟悉，这里先不做描叙了。</p>
<h3>三、安装与配置Vim</h3>
<p>对于Linux用户来说，Vim再也熟悉不过了，因为这个开源软件本身的魅力，更有很多人在Windows下使用Gvim，在Mac下使用<a href="http://code.google.com/p/macvim/">Macvim</a>。这里有两位国内的Vim爱好者做了不少的研究，非常感谢他们的blog提供的技术分享：<br />
Dexter.Yy：<br />
<a href="http://www.limboy.com/2009/05/30/vim-setting/">面向前端开发者和TextMate粉丝的vim配置</a><br />
<a href="http://www.limboy.com/2009/06/07/vim-setting-more/">继续补充vim配置技巧——上次的vimrc还不够强力</a></p>
<p>gracecode.com：<br />
<a href="http://www.gracecode.com/category/496/">学习Vim编辑器</a></p>
<p>当然，还有在网上看了很多资料去了解，之前一直有在FreeBSD和Ubuntu的Console下使用Vi和Vim，到现在才清晰的知道Vim也可以是如此强大且华丽。由于针对PHP方面对Macvim的配置还不是那么熟悉，最近也在学习XHTML＋CSS方面的内容，因此配置直接采用Dexter.Yy提供的，只稍做了修改。就是在~/.vimrc中将原本的&#8221;set columns=171&#8243;,&#8221;set lines=58<br />
&#8220;,&#8221;winpos 52 42&#8243;（设置窗口宽、高和初始位置）加上仅使Macvim生效而不使Console下的Vi和Vim生效的条件语句：</p>
<blockquote><p>
if has(&#8220;gui_running&#8221;) || has (&#8220;gui_macvim&#8221;)<br />
&#8220;初始窗口宽度与高度<br />
	set columns=171<br />
	set lines=58<br />
&#8220;初值窗口位置：<br />
	winpos 52 42<br />
endif
</p></blockquote>
<p>不然在Console中使用vi和vim命令就会放大console窗口了。</p>
<p>Tips:在家目录建立.vim文件夹，在.vim下建立plugin文件夹存放插件如NERD_tree.vim，建立after下的syntax存放语法插件如css.vim，建立colors文件夹存放配色方案如yytextmate.vim</p>
<p>下面是我使用的效果：</p>
<p><a href="http://phpstone.com/wp-content/uploads/2009/06/Macvim.png"><img src="http://phpstone.com/wp-content/uploads/2009/06/Macvim-300x184.png" alt="Macvim" title="Macvim" width="300" height="184" class="alignnone size-medium wp-image-320" /></a></p>
<p>&#8211; To be continued</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-development-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Joomla安装注意事项</title>
		<link>http://phpstone.com/joomla-install/</link>
		<comments>http://phpstone.com/joomla-install/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 03:15:21 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Joomla]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=58</guid>
		<description><![CDATA[Joomla版本: Joomla_1.5.8-Stable-Full_Package
Joomla的安装与Wordpress相比还是有一些不同的，虽然目前已经非常简单，但是还是有要注意的地方。
1. 我发现configuration.php-dist不能预先复制为configuration.php,安装前一有configuration.php 这个文件存在，主页的访问链接就无法打开了。还是在安装完毕后进行操作比较合适。安装完成时会提供一段配置文件给你写入configuration.php并上传到joomla根目录
2.目前Joomla1.5已经支持安装界面的繁体中文了，注意这个只是安装时显示繁体中文，安装后的后台管理系统还是英语系的。
3. 安装第5步多一个FTP设定，这是针对Unix/Linux主机文件和文件夹权限的限制而做的，因为joomla的一些设定等要写一些目录或文件，但是多 数上次的文件和文件夹是没有写权限的，于是joomla就利用ftp的功能来实现。Joomla的建议是，最好有个单独的ftp账号供此项功能使用。相信 良好的主机空间有多个ftp账号可以提供的。
4.安装第6步的设定填入网站名称后先点安装范例资料再进行下一步。
5.安装完成后要移除整个installation目录才能继续访问。
]]></description>
			<content:encoded><![CDATA[<p>Joomla版本: Joomla_1.5.8-Stable-Full_Package</p>
<p>Joomla的安装与Wordpress相比还是有一些不同的，虽然目前已经非常简单，但是还是有要注意的地方。</p>
<p>1. 我发现configuration.php-dist不能预先复制为configuration.php,安装前一有configuration.php 这个文件存在，主页的访问链接就无法打开了。还是在安装完毕后进行操作比较合适。安装完成时会提供一段配置文件给你写入configuration.php并上传到joomla根目录<span id="more-58"></span></p>
<p>2.目前Joomla1.5已经支持安装界面的繁体中文了，注意这个只是安装时显示繁体中文，安装后的后台管理系统还是英语系的。</p>
<p>3. 安装第5步多一个FTP设定，这是针对Unix/Linux主机文件和文件夹权限的限制而做的，因为joomla的一些设定等要写一些目录或文件，但是多 数上次的文件和文件夹是没有写权限的，于是joomla就利用ftp的功能来实现。Joomla的建议是，最好有个单独的ftp账号供此项功能使用。相信 良好的主机空间有多个ftp账号可以提供的。</p>
<p>4.安装第6步的设定填入网站名称后先点安装范例资料再进行下一步。</p>
<p>5.安装完成后要移除整个installation目录才能继续访问。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/joomla-install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>时间函数问题-设置PHP5的时区</title>
		<link>http://phpstone.com/php-time-function-php5-timezone/</link>
		<comments>http://phpstone.com/php-time-function-php5-timezone/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 06:49:56 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=16</guid>
		<description><![CDATA[

&#60;?php
$currtime=time();
$currtimestr=strftime (&#34;%H:%M:%S &#34;,$currtime);
echo &#34;The time is : &#34;.$currtimestr;
print (strftime(&#34;%A&#34;));
?&#62;

在PHP5中，不能和PHP4一样使用date() , time() 等时间函数正确地取得本地时间, 不同的代码在不同的OS里会产生不同的结果。解决办法,为PHP5设置统一的时区：
编辑 &#8220;php.ini&#8221;，找到以下行修改:
date.timezone = PRC         //PRC代表中华人民共和国
]]></description>
			<content:encoded><![CDATA[<pre class="brush: php; ">

&lt;?php
$currtime=time();
$currtimestr=strftime (&quot;%H:%M:%S &quot;,$currtime);
echo &quot;The time is : &quot;.$currtimestr;
print (strftime(&quot;%A&quot;));
?&gt;
</pre>
<p>在PHP5中，不能和PHP4一样使用date() , time() 等时间函数正确地取得本地时间, 不同的代码在不同的OS里会产生不同的结果。解决办法,为PHP5设置统一的时区：</p>
<p>编辑 &#8220;php.ini&#8221;，找到以下行修改:</p>
<blockquote><p>date.timezone = PRC         //PRC代表中华人民共和国</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-time-function-php5-timezone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 扩展:mbstring</title>
		<link>http://phpstone.com/php-extension-mbstring/</link>
		<comments>http://phpstone.com/php-extension-mbstring/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 16:26:30 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpMyAdmin]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=8</guid>
		<description><![CDATA[因为最小化安装的PHP，很多扩展没有启用，在登陆phpMyAdmin时得到一个警告：
The mbstring PHP extension was not found and you seem to be using a multibyte charset. Without the mbstring extension phpMyAdmin is unable to split strings correctly and it may result in unexpected results.
我发现 http://www.php.net/mbstring 上有介绍说：
mbstring provides multibyte specific string functions that help you deal with multibyte encodings in PHP.
Note: If you are connecting to [...]]]></description>
			<content:encoded><![CDATA[<p>因为最小化安装的PHP，很多扩展没有启用，在登陆phpMyAdmin时得到一个警告：</p>
<p>The mbstring PHP extension was not found and you seem to be using a multibyte charset. Without the mbstring extension phpMyAdmin is unable to split strings correctly and it may result in unexpected results.</p>
<p>我发现 <a href="http://www.php.net/mbstring">http://www.php.net/mbstring</a> 上有介绍说：</p>
<blockquote><p>mbstring provides multibyte specific string functions that help you deal with multibyte encodings in PHP.</p>
<p><strong class="note">Note</strong>: If you are connecting to a database with PHP, it is recommended that you use the same character encoding for both the database and the internal encoding for ease of use and better performance.<br />
If you are using PostgreSQL, the character encoding used in the database and the one used in PHP may differ as it supports automatic character set conversion between the backend and the frontend.</p></blockquote>
<p><span id="more-8"></span></p>
<p>也就是说这个扩展是用来使得PHP可以处理多字节编码如汉字、日文、韩文等。因此如果phpMyAdmin连接的数据库等使用多字节编码，就必须使用此扩展。例如下面的字符编码和PHP的配合支持就不太好：</p>
<p>“JIS, SJIS, ISO-2022-JP, BIG-5”</p>
<p>Example#1 php.ini 设置的例子</p>
<blockquote><p>
; Set default language</p>
<p>mbstring.language = Neutral; Set default language to Neutral(UTF-8) (default)<br />
mbstring.language = English; Set default language to English</p>
<p>mbstring.language = Japanese; Set default language to Japanese</p>
<p>;; Set default internal encoding<br />
;; Note: Make sure to use character encoding works with PHP<br />
mbstring.internal_encoding = UTF-8  ; Set internal encoding to UTF-8</p>
<p>;; HTTP input encoding translation is enabled.<br />
mbstring.encoding_translation = On</p>
<p>;; Set default HTTP input character encoding<br />
;; Note: Script cannot change http_input setting.<br />
mbstring.http_input = pass   ;No conversion.</p>
<p>mbstring.http_input = auto   ;Set HTTP input to auto<br />
; &#8220;auto&#8221; is expanded to &#8220;ASCII,JIS,UTF-8,EUC-JP,SJIS&#8221;</p>
<p>mbstring.http_input  = SJIS    ;Set HTTP2 input to  SJIS<br />
mbstring.http_input  = UTF-8,SJIS,EUC-JP    ;Specify order</p>
<p>;; Set default HTTP output character encoding<br />
mbstring.http_output = pass    ;No conversion<br />
mbstring.http_output = UTF-8   ;Set HTTP output encoding to UTF-8</p>
<p>;; Set default character encoding detection order<br />
mbstring.detect_order = auto    ; Set detect order to auto<br />
mbstring.detect_order = ASCII,JIS,UTF-8,SJIS,EUC-JP ;Specify order</p>
<p>;; Set default substitute character<br />
mbstring.substitute_character = 12307   ; Specify Unicode value<br />
mbstring.substitute_character = none    ; Do not print character<br />
mbstring.substitute_character = long    ; Long Example: U+3000,JIS+7E7E
</p></blockquote>
<p>解决办法：<br />
安装PHP扩展：“Multi-Byte String”</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-extension-mbstring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows XP本地PHP开发环境</title>
		<link>http://phpstone.com/windows-xp-php-development/</link>
		<comments>http://phpstone.com/windows-xp-php-development/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 09:56:15 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=7</guid>
		<description><![CDATA[注：除了phpMyAdmin,以下均为二进制的安装文件。
安装 apache_2.2.6-win32-x86-openssl-0.98e

Server information: 填入域名，服务器名，管理员信箱。
默认：for All users,on Port 80,as a service,即可。


选择Custem定制安装。为方便起见，更改安装目录到 &#8220;C:\Apache2.2\&#8221;。（理由是：某些配置文件对含空格的目录名比较敏感，这样能减少出错。）

打开 firefox 输入 localhost,然后看到&#8221;It works!&#8221; 的话，说明安装正常。Win32平台上Apache的安装再简单不过了。最后在开始菜单的Aapache程序组，可以找到查看error log的地方，一般性如：
[error] [client 127.0.0.1] File does not exist: C:/Apache2.2/htdocs/favicon.ico
之类的错误提示在根目录添加个ico图标就可以了。配置Apache最重要的就是查看这个error log,这是解决各种问题的根本。这个日志文件在Apache安装目录的logs文件夹下
安装 php-5.2.5-win32

同理地更改安装目录为 &#8220;C:\PHP&#8221;
Web server setup：我安装的Apache 2.2.6自然选择了&#8221;Apache 2.2.x Module&#8221;。（测试用的服务器我们可以追求最近版本，值得注意的是，大的网站基本爱用Apache1.3.x。) ps:从服务器的诸多选择来看，能感觉到php的可移植性和功能的强大吧。
Apache Configuration Director &#8212; 这点很重要！选择Apache的配置文件httpd.conf的路径。上面这里是 &#8220;C:\Apache2.2\conf&#8221;。如果设定错误，嘿嘿，php可不会为你工作。


PHP Extensions  记得选择扩展啦，基本的mysql都没有的话，php和mysql就不能携手而为了。我大致选择这些：


bzip2,bz2_filter,Crack,GD2,Gettext,GMP,IMAP,LDAP,mcrypt,Multi-Byte String,MySQL,OpenSSL,zip,zlib_filter
安装完成后检查httpd.conf是否含有：
#BEGIN PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL
PHPIniDir “C:/PHP/”
LoadModule php5_module “C:/PHP/php5apache2_2.dll”
#END PHP INSTALLER EDITS &#8211; REMOVE ONLY ON [...]]]></description>
			<content:encoded><![CDATA[<h3>注：除了phpMyAdmin,以下均为二进制的安装文件。</h3>
<h3><span style="color: #0000ff;">安装 apache_2.2.6-win32-x86-openssl-0.98e</span></h3>
<ul>
<li>Server information: 填入域名，服务器名，管理员信箱。</li>
<li>默认：for All users,on Port 80,as a service,即可。</li>
</ul>
<ul>
<li>选择Custem定制安装。为方便起见，更改安装目录到 &#8220;C:\Apache2.2\&#8221;。（理由是：某些配置文件对含空格的目录名比较敏感，这样能减少出错。）<span id="more-7"></span></li>
</ul>
<p>打开 firefox 输入 localhost,然后看到&#8221;It works!&#8221; 的话，说明安装正常。Win32平台上Apache的安装再简单不过了。最后在开始菜单的Aapache程序组，可以找到查看error log的地方，一般性如：</p>
<blockquote><p>[error] [client 127.0.0.1] File does not exist: C:/Apache2.2/htdocs/favicon.ico</p></blockquote>
<p>之类的错误提示在根目录添加个ico图标就可以了。配置Apache最重要的就是查看这个error log,这是解决各种问题的根本。这个日志文件在Apache安装目录的logs文件夹下</p>
<h3><span style="color: #0000ff;">安装 php-5.2.5-win32</span></h3>
<ul>
<li>同理地更改安装目录为 &#8220;C:\PHP&#8221;</li>
<li>Web server setup：我安装的Apache 2.2.6自然选择了&#8221;Apache 2.2.x Module&#8221;。（测试用的服务器我们可以追求最近版本，值得注意的是，大的网站基本爱用Apache1.3.x。) ps:从服务器的诸多选择来看，能感觉到php的可移植性和功能的强大吧。</li>
<li><span style="color: #ff0000;">Apache Configuration Director</span> &#8212; 这点很重要！选择Apache的配置文件httpd.conf的路径。上面这里是 &#8220;C:\Apache2.2\conf&#8221;。如果设定错误，嘿嘿，php可不会为你工作。</li>
</ul>
<ul>
<li><span style="color: #ff6600;">PHP Extensions  <span style="color: #000000;">记得选择扩展啦，基本的mysql都没有的话，php和mysql就不能携手而为了。我大致选择这些：</span><br />
</span></li>
</ul>
<blockquote><p>bzip2,bz2_filter,Crack,GD2,Gettext,GMP,IMAP,LDAP,mcrypt,Multi-Byte String,MySQL,OpenSSL,zip,zlib_filter</p></blockquote>
<p>安装完成后检查httpd.conf是否含有：</p>
<blockquote><p>#BEGIN PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL<br />
PHPIniDir “C:/PHP/”<br />
LoadModule php5_module “C:/PHP/php5apache2_2.dll”<br />
#END PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL</p></blockquote>
<p>有了这两句配置语句，就不需要<a href="http://www.freebsd.org/">FreeBSD</a>/Linux下的</p>
<blockquote><p>AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php-source .phps</p></blockquote>
<p>然后定位到</p>
<p>&#8220;DirectoryIndex index.html&#8221;添加&#8221;index.php&#8221;</p>
<p>重启Apache,添加index.php替换掉index.html,内容如下：</p>
<p>刷新localhost页面能看到PHP的系统信息的话，说明安装成功。但是也别高兴的太早，看看哪些扩展没有成功启用。直接查看error log，例如如下提示：</p>
<blockquote><p>PHP Startup: Unable to load dynamic library &#8220;/php_mysql.dll&#8221;<br />
PHP Startup: Unable to load dynamic library &#8220;/php_mcrypt.dll&#8221;</p></blockquote>
<p>这是典型的扩展依赖问题，PHP官网的FAQ中都已说明，php_mysql和php_mcrypt分别依赖于libmysql.dll和libmcrypt.dll。不过PHP的安装程序够周全，当你选择了这两个扩展，相关依赖的动态链接库（dll）就自动释放到了php的主安装目录，直接将libmysql.dll和libmcrypt.dl复制到&#8221;C:\windows\system32&#8243;下，重启Apache，扩展就成功启用了。</p>
<p>另外需要注意的一点：Windows下安装PHP，默认short_open_tag = Off,也就是说网页代码里不能使用SGML(标准通用置标语言)风格的&lt;? &#8230; ?&gt; 可能你需要打开，改为On，因为大部分操作数据库的代码均使用这类标签。如果没有打开可能网页直接返回PHP的网页源代码。</p>
<p>小结下处理解决问题的有效方法：先找找到出现问题的直接原因（查看错误日志），不要盲目猜忌。根据问题提示找出根本的关系，分析问题产生的原因，查找资料找到解决问题的办法。或者我们会说，直接&#8221;Google It!&#8221;来地更快一些。可是如果能找到问题透彻的原因的话，我们碰到问题就能举一反三了，这会让我们得到更多。</p>
<h3><span style="color: #0000ff;">安装 mysql-5.0.51b-win32</span></h3>
<ul>
<li>运行安装向导，Custom（定制安装）。当 &#8220;Wizard Completed &#8220;，开始配置服务器</li>
<li>选择 &#8220;Detailed Configuretion&#8221;，然后选择“Server Machine”（Choose this option for web/application servers.MySQL will have medium memory usage.）。</li>
<li>点选&#8221;Transactional Database Only&#8221;——因为我们只是测试服务器，不需要MySQL占用所有资源</li>
<li>&#8220;InnoDB Tablespace Settings&#8221;数据内容的存放位置，自然选择到D盘了</li>
<li>&#8220;Please set the approximate number of concurrent connections to the server&#8221;这里是配置能同时连接MySQL服务器的连接数，我选择&#8221;Manual Setting&#8221;定制到100</li>
<li>&#8220;Plese select the default character set &#8220;Best Support For Multilingualism&#8221;,网站需要中文支持的话自然选择utf8字符集比较好的。</li>
<li>&#8220;Install As Windows Service&#8221;并且点选上&#8221;Include Bin Directory in Windows PATH&#8221;，这样就能方便在CMD下操作MySQL了。</li>
<li>最后，填入root密码完成安装即可。如无需要，不要点选上匿名用户，隐患么。</li>
</ul>
<p>完成安装后，打开CMD，输入 &#8220;mysql -u root -p&#8221;，输入密码后能看到系统信息和 &#8220;mysql&gt;&#8221;提示符，大功告成。</p>
<h3><span style="color: #0000ff;">安装 phpMyAdmin-2.11.4-all-languages</span></h3>
<ul>
<li>直接Decompression（解压缩） the phpMyAdmin-2.11.4-all-languages.zip 到“D:\phpMyAdmin”</li>
<li>进入“D:\phpMyAdmin”复制config.sample.inc.php 为 config.inc.php，并编辑之。</li>
</ul>
<blockquote><p>/* Authentication type */<br />
$cfg[’Servers’][$i][’auth_type’] = ‘cookie’;</p></blockquote>
<ul>
<li>保留认证类型为coolie的话，在以下字段的单引号内添加一些认证用的字符，</li>
</ul>
<blockquote><p>$cfg['blowfish_secret'] = &#8216; &#8216;; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */</p></blockquote>
<ul>
<li>或者更改cookie的认证类型为http。推荐用http</li>
<li>编辑httpd.conf，定位到：&#8221;&lt;IfModule alias_module&gt;&#8221;内添加</li>
</ul>
<blockquote><p>Alias /phpMyAdmin/ &#8220;D:/phpMyAdmin/&#8221;</p></blockquote>
<ul>
<li>并在模块外添加如下做权限给予和控制</li>
</ul>
<blockquote><p>&lt;Directory &#8220;D:/phpMyAdmin/&#8221;&gt;<br />
AllowOverride Limit<br />
Options None<br />
Order Deny,Allow<br />
Deny from all<br />
Allow from 127.0.0.1 192.168.161.5  219.145.13.96 .example.com<br />
&lt;/Directory&gt;</p></blockquote>
<p>Allow from 就是允许你访问控制phpMyAdmin的IP或者域名</p>
<p>注：配置文件是严格区分大小写和文件夹后的&#8221;/&#8221;符号的，这里怎么定义的，浏览器里头也得怎么输入才能打开。<br />
重启Apache服务器open http://localhost/phpMyAdmin</p>
<p>基本的安装就这些，详细的配置以后再与大家同享。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/windows-xp-php-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
