<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[零度の热情]]></title> 
<link>http://www.hdj.me/index.php</link> 
<description><![CDATA[__遇见，半空蜜糖。]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[零度の热情]]></copyright>
<item>
<link>http://www.hdj.me/post/php-password-strength.php</link>
<title><![CDATA[简单的密码强度计算]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Mon, 06 Sep 2010 06:07:59 +0000</pubDate> 
<guid>http://www.hdj.me/post/php-password-strength.php</guid> 
<description>
<![CDATA[ 
	<div class="code"><br/>&lt;?php<br/>function password_strength($password)&#123;<br/>&nbsp;&nbsp;$strength = 0;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 小写字母<br/>&nbsp;&nbsp;if(preg_match(&quot;/(&#91;a-z&#93;+)/&quot;, $password)) $strength++;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 大写字母<br/>&nbsp;&nbsp;if(preg_match(&quot;/(&#91;A-Z&#93;+)/&quot;, $password))&nbsp;&nbsp;$strength++;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 数字<br/>&nbsp;&nbsp;if(preg_match(&quot;/(&#91;0-9&#93;+)/&quot;, $password))&nbsp;&nbsp;$strength++;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 非任意(文字和数字)字母和下滑线的字符<br/>&nbsp;&nbsp;if(preg_match(&quot;/(&#92;W+)/&quot;, $password))&nbsp;&nbsp;$strength++;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;// 密码的长度<br/>&nbsp;&nbsp;if (strlen($password) &lt; 7) $strength--;<br/>&nbsp;&nbsp;else $strength++;<br/><br/>&nbsp;&nbsp;switch($strength) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;case 0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;case 1:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$text = &#039;密码强度太弱&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;case 2:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$text = &#039;密码强度弱&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;case 3:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$text = &#039;密码强度高&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;case 4:<br/>&nbsp;&nbsp;&nbsp;&nbsp;case 5:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$text = &#039;密码强度很高&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;return $text;<br/>&#125;<br/><br/>echo password_strength(&#039;123aZ456*&#039;); //密码强度很高<br/>?&gt;<br/></div>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/mysql-order-by-relevance.php</link>
<title><![CDATA[mysql相关度排行]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Fri, 20 Aug 2010 04:32:05 +0000</pubDate> 
<guid>http://www.hdj.me/post/mysql-order-by-relevance.php</guid> 
<description>
<![CDATA[ 
	简单的笔记一下<br/><div class="code">select id,tags,(if(locate(&#039;人类&#039;,tags),2,0)+if(locate(&#039;暴力&#039;,tags),2,0)+if(locate(&#039;美学&#039;,tags),2,0)+if(locate(&#039;生物学&#039;,tags),2,0)+if(locate(&#039;机关枪&#039;,tags),2,0)) as zh from details order by zh desc</div>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/10-css-reset.php</link>
<title><![CDATA[10款浏览器CSS Reset的方法]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[JS/CSS]]></category>
<pubDate>Fri, 06 Aug 2010 06:15:28 +0000</pubDate> 
<guid>http://www.hdj.me/post/10-css-reset.php</guid> 
<description>
<![CDATA[ 
	Generic Reset CSS<br/>Esse com certeza é o mais conhecido e utilizado pelos desenvolvedores:<br/><div class="code"><br/>* &#123;<br/>padding: 0;<br/>margin: 0;<br/>border: 0; <br/>&#125;<br/></div><br/><br/>Ateneu Popular CSS Reset<br/>CSS inicial sugerido pelo site Ateneu Popular:<br/><div class="code"><br/>html, body, div, span, applet, object, iframe, h1, h2, h3, <br/>h4, h5, h6, p, blockquote, pre, a, abbr, acronym, <br/>address, big, cite, code, del, dfn, em, font, img, ins, <br/>kbd, q, s, samp, small, strike, strong, sub, sup, tt, <br/>var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, <br/>table, caption, tbody, tfoot, thead, tr, th, td &#123; <br/>margin: 0; <br/>padding: 0; <br/>border: 0; <br/>outline: 0; <br/>font-weight: inherit; <br/>font-style: inherit; <br/>font-size: 100%; <br/>font-family: inherit; <br/>vertical-align: baseline; <br/>&#125; <br/>:focus &#123; outline: 0;&#125; <br/>a, a:link, a:visited, a:hover, a:active&#123;text-decoration:none&#125; <br/>table &#123; border-collapse: separate;border-spacing: 0;&#125; <br/>th, td &#123;text-align: left; font-weight: normal;&#125; <br/>img, iframe &#123;border: none; text-decoration:none;&#125; <br/>ol, ul &#123;list-style: none;&#125; <br/>input, textarea, select, button &#123;font-size: 100%;font-family: inherit;&#125; <br/>select &#123;margin: inherit;&#125; <br/>hr &#123;margin: 0;padding: 0;border: 0;color: #000;background-color: #000;height: 1px&#125;<br/></div><br/><br/>Chris Poteet's Reset CSS<br/>Técnica sugerida por Chris Poteet's para Reset CSS:<br/><div class="code"><br/>* &#123;<br/>vertical-align: baseline;<br/>font-family: inherit;<br/>font-style: inherit;<br/>font-size: 100%;<br/>border: none;<br/>padding: 0;<br/>margin: 0; <br/>&#125; <br/>body &#123;<br/>padding: 5px; <br/>&#125; <br/>h1, h2, h3, h4, h5, h6, p, pre, blockquote, form, ul, ol, dl &#123;<br/>margin: 20px 0; <br/>&#125; <br/>li, dd, blockquote &#123;<br/>margin-left: 40px; <br/>&#125; <br/>table &#123;<br/>border-collapse: collapse;<br/>border-spacing: 0; <br/>&#125;<br/></div><br/><br/>Yahoo's CSS Reset<br/>Técnica de Reset CSS proposta pelo Yahoo:<br/><div class="code"><br/>body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre, <br/>form,fieldset,input,textarea,p,blockquote,th,td &#123;<br/>padding: 0;<br/>margin: 0; <br/>&#125; <br/>table &#123;<br/>border-collapse: collapse;<br/>border-spacing: 0; <br/>&#125; <br/>fieldset,img &#123;<br/>border: 0; <br/>&#125; <br/>address,caption,cite,code,dfn,em,strong,th,var &#123;<br/>font-weight: normal;<br/>font-style: normal; <br/>&#125; <br/>ol,ul &#123;<br/>list-style: none; <br/>&#125; <br/>caption,th &#123;<br/>text-align: left; <br/>&#125; <br/>h1,h2,h3,h4,h5,h6 &#123;<br/>font-weight: normal;<br/>font-size: 100%; <br/>&#125; <br/>q:before,q:after &#123;<br/>content:&#039;&#039;; <br/>&#125; <br/>abbr,acronym &#123; border: 0; <br/>&#125;<br/></div><br/><br/>Eric Meyer Reset CSS<br/>Esse com certeza deve ser o mais utilizado entre os desenvolvedores, proposto por Eric Meyer, é o que eu utilizo atualmente:<br/><div class="code"><br/>html, body, div, span, applet, object, iframe, table, caption, <br/>tbody, tfoot, thead, tr, th, td, del, dfn, em, font, img, ins, <br/>kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, <br/>h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, <br/>acronym, address, big, cite, code, dl, dt, dd, ol, ul, li, <br/>fieldset, form, label, legend &#123;<br/>vertical-align: baseline;<br/>font-family: inherit;<br/>font-weight: inherit;<br/>font-style: inherit;<br/>font-size: 100%;<br/>outline: 0;<br/>padding: 0;<br/>margin: 0;<br/>border: 0; <br/>&#125; <br/>:focus &#123;<br/>outline: 0; <br/>&#125; <br/>body &#123;<br/>background: white;<br/>line-height: 1;<br/>color: black; <br/>&#125; <br/>ol, ul &#123;<br/>list-style: none; <br/>&#125; <br/>table &#123;<br/>border-collapse: separate;<br/>border-spacing: 0; <br/>&#125; <br/>caption, th, td &#123;<br/>font-weight: normal;<br/>text-align: left; <br/>&#125; <br/>blockquote:before, blockquote:after, q:before, q:after &#123;<br/>content: &quot;&quot;; <br/>&#125; <br/>blockquote, q &#123;<br/>quotes: &quot;&quot; &quot;&quot;; <br/>&#125;<br/></div><br/><br/>Tantek Celik Reset CSS<br/>Técnica de Reset CSS proposta por Tantek Celik:<br/><div class="code"><br/>:link,:visited &#123; text-decoration:none &#125; <br/>ul,ol &#123; list-style:none &#125; <br/>h1,h2,h3,h4,h5,h6,pre,code &#123; font-size:1em; &#125; <br/>ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote,fieldset,input <br/>&#123; margin:0; padding:0 &#125; <br/>a img,:link img,:visited img &#123; border:none &#125; <br/>address &#123; font-style:normal &#125;<br/></div><br/><br/>Christian Montoya Reset CSS<br/>Técnica sugeria por Christian Montoya:<br/><div class="code"><br/>html, body, form, fieldset &#123;<br/>margin: 0;<br/>padding: 0;<br/>font: 100%/120% Verdana, Arial, Helvetica, sans-serif; <br/>&#125; <br/>h1, h2, h3, h4, h5, h6, p, pre, <br/>blockquote, ul, ol, dl, address &#123;<br/>margin: 1em 0;<br/>padding: 0; <br/>&#125; <br/>li, dd, blockquote &#123;<br/>margin-left: 1em; <br/>&#125; <br/>form label &#123;<br/>cursor: pointer; <br/>&#125; <br/>fieldset &#123;<br/>border: none; <br/>&#125; <br/>input, select, textarea &#123;<br/>font-size: 100%;<br/>font-family: inherit; <br/>&#125;<br/></div><br/><br/>Rudeworks Reset CSS<br/>Técinca de Reset CSS proposta por Rudeworks:<br/><div class="code"><br/>* &#123;<br/>margin: 0;<br/>padding: 0;<br/>border: none; <br/>&#125; <br/>html &#123;<br/>font: 5% &quot;Lucida Grande&quot;, Lucida, Verdana, sans-serif;<br/>text-shadow: #000 0px 0px 0px; <br/>&#125; <br/>ul &#123;<br/>list-style: none;<br/>list-style-type: none; <br/>&#125; <br/>h1, h2, h3, h4, h5, h6, p, pre, <br/>blockquote, ul, ol, dl, address &#123;<br/>font-weight: normal;<br/>margin: 0 0 1em 0; <br/>&#125; <br/>cite, em, dfn &#123;<br/>font-style: italic; <br/>&#125; <br/>sup &#123;<br/>position: relative;<br/>bottom: 3em;<br/>vertical-align: baseline; <br/>&#125; <br/>sub &#123;<br/>position: relative;<br/>bottom: -2em;<br/>vertical-align: baseline; <br/>&#125; <br/>li, dd, blockquote &#123;<br/>margin-left: 1em; <br/>&#125; <br/>code, kbd, samp, pre, tt, var, input&#91;type=&#039;text&#039;&#93;, textarea &#123;<br/>font-size: 100%;<br/>font-family: monaco, &quot;Lucida Console&quot;, courier, mono-space; <br/>&#125; <br/>del &#123;<br/>text-decoration: line-through; <br/>&#125; <br/>ins, dfn &#123;<br/>border-bottom: 1px solid #ccc; <br/>&#125; <br/>small, sup, sub &#123;<br/>font-size: 85%; <br/>&#125; <br/>abbr, acronym &#123;<br/>text-transform: uppercase;<br/>font-size: 85%;<br/>letter-spacing: .1em;<br/>border-bottom-style: dotted;<br/>border-bottom-width: 1px; <br/>&#125; <br/>a abbr, a acronym &#123;<br/>border: none; <br/>&#125; <br/>sup &#123;<br/>vertical-align: super; <br/>&#125; <br/>sub &#123;<br/>vertical-align: sub; <br/>&#125; <br/>h1 &#123;<br/>font-size: 2em; <br/>&#125; <br/>h2 &#123;<br/>font-size: 8em; <br/>&#125; <br/>h3 &#123;<br/>font-size: 6em; <br/>&#125; <br/>h4 &#123;<br/>font-size: 4em; <br/>&#125; <br/>h5 &#123;<br/>font-size: 2em; <br/>&#125; <br/>h6 &#123;<br/>font-size: 1em; <br/>&#125; <br/>a, a:link, a:visited, a:hover, a:active &#123;<br/>outline: 0;<br/>text-decoration: none; <br/>&#125; <br/>a img &#123;<br/>border: none;<br/>text-decoration: none; <br/>&#125; <br/>img &#123;<br/>border: none;<br/>text-decoration: none; <br/>&#125; <br/>label, button &#123;<br/>cursor: pointer; <br/>&#125; <br/>input:focus, select:focus, textarea:focus &#123;<br/>background-color: #FFF; <br/>&#125; <br/>fieldset &#123;<br/>border: none; <br/>&#125; <br/>.clear &#123;<br/>clear: both; <br/>&#125; <br/>.float-left &#123;<br/>float: left; <br/>&#125; <br/>.float-right &#123;<br/>float: right; <br/>&#125; <br/>body &#123;<br/>text-align: center; <br/>&#125; <br/>#wrapper &#123;<br/>margin: 0 auto;<br/>text-align: left; <br/>&#125;<br/></div><br/><br/>Anieto2K Reset CSS<br/>Técnica de Reset CSS proposta por Andrés Nieto:<br/><div class="code"><br/>html, body, div, span, applet, object, iframe, <br/>h1, h2, h3, h4, h5, h6, p, <br/>blockquote, pre, a, abbr, acronym, address, big, <br/>cite, code, del, dfn, em, font, img, <br/>ins, kbd, q, s, samp, small, strike, <br/>strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, <br/>fieldset, form, label, legend, <br/>table, caption, tbody, tfoot, thead, tr, th, td, <br/>center, u, b, i &#123;<br/>margin: 0;<br/>padding: 0;<br/>border: 0;<br/>outline: 0;<br/>font-weight: normal;<br/>font-style: normal;<br/>font-size: 100%;<br/>font-family: inherit;<br/>vertical-align: baseline<br/>&#125; <br/>body &#123;<br/>line-height: 1<br/>&#125; <br/>:focus &#123;<br/>outline: 0<br/>&#125; <br/>ol, ul &#123;<br/>list-style: none<br/>&#125; <br/>table &#123;<br/>border-collapse: collapse;<br/>border-spacing: 0<br/>&#125; <br/>blockquote:before, blockquote:after, q:before, q:after &#123;<br/>content: &quot;&quot;<br/>&#125; <br/>blockquote, q &#123;<br/>quotes: &quot;&quot; &quot;&quot;<br/>&#125; <br/>input, textarea &#123;<br/>margin: 0;<br/>padding: 0<br/>&#125; <br/>hr &#123;<br/>margin: 0;<br/>padding: 0;<br/>border: 0;<br/>color: #000;<br/>background-color: #000;<br/>height: 1px<br/>&#125;<br/></div><br/><br/>CSSLab CSS Reset<br/>Técnica de CSS Reset proposta pelo site CSSLab:<br/><div class="code"><br/>html, body, div, span, applet, object, iframe, h1, h2, h3, <br/>h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, <br/>big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, <br/>small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, <br/>fieldset, form, label, legend, table, caption, tbody, tfoot, <br/>thead, tr, th, td &#123;<br/>margin: 0;<br/>padding: 0;<br/>border: 0;<br/>outline: 0;<br/>font-weight: inherit;<br/>font-style: inherit;<br/>font-size: 100%;<br/>font-family: inherit;<br/>vertical-align: baseline; <br/>&#125; <br/>:focus &#123;<br/>outline: 0; <br/>&#125; <br/>table &#123;<br/>border-collapse: separate;<br/>border-spacing: 0; <br/>&#125; <br/>caption, th, td &#123;<br/>text-align: left;<br/>font-weight: normal; <br/>&#125; <br/>a img, iframe &#123;<br/>border: none; <br/>&#125; <br/>ol, ul &#123;<br/>list-style: none; <br/>&#125; <br/>input, textarea, select, button &#123;<br/>font-size: 100%;<br/>font-family: inherit; <br/>&#125; <br/>select &#123;<br/>margin: inherit; <br/>&#125; <br/>/* Fixes incorrect placement of numbers in ol&#039;s in IE6/7 */<br/>ol &#123; margin-left:2em; &#125; <br/>/* == clearfix == */<br/>.clearfix:after &#123;<br/>content: &quot;.&quot;;<br/>display: block;<br/>height: 0;<br/>clear: both;<br/>visibility: hidden; <br/>&#125; <br/>.clearfix &#123;display: inline-block;&#125; <br/>* html .clearfix &#123;height: 1%;&#125; <br/>.clearfix &#123;display: block;&#125;<br/></div>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/javascript-debug.php</link>
<title><![CDATA[Javascript调试错误小技巧]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[JS/CSS]]></category>
<pubDate>Fri, 06 Aug 2010 05:19:59 +0000</pubDate> 
<guid>http://www.hdj.me/post/javascript-debug.php</guid> 
<description>
<![CDATA[ 
	做前端开发的同学们，也许比较能体会到脚本错误的痛苦，脚本错误产生有很多种原因，从大的方向来分，分为两种，一种是人为的，一种是浏览器加载不全导致。<br/><br/>对于第二种情况，暂时来说是无能为力，至于人为的脚本错误，很多也是不经意所产生的，同样是因为不经意，所以你要找到原因也不容易，在这里给各位同学说说我平时是怎么调试的。<br/><br/><br/><div class="code">&lt;script&gt;<br/>// 这是一个存在语法错误的JS函数<br/>function test()&#123;<br/>&nbsp;&nbsp;window.location.href = a;<br/>&#125;<br/><br/>// 自定义的调试函数<br/>function debug(message, url, line)&#123;<br/>&nbsp;&nbsp;alert(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;Error:&quot; + message +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&#92;nUrl:&quot; + url +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&#92;nLine:&quot; + line<br/>&nbsp;&nbsp;);<br/>&nbsp;&nbsp;return false;<br/>&#125;<br/><br/>// 触发脚本错误<br/>window.onload = test;<br/><br/>// 输出调试信息<br/>window.onerror = debug;<br/>&lt;/script&gt;</div><br/><br/>得到的结果是<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Error:a is not defined<br/>Url:file:///C:/Users/hdj/Desktop/html/jserror.html<br/>Line:13</div></div><br/>Tags - <a href="http://www.hdj.me/go.php/tags/javascript/" rel="tag">javascript</a> , <a href="http://www.hdj.me/go.php/tags/debug/" rel="tag">debug</a>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/ucenter-correspond-failed-analysis.php</link>
<title><![CDATA[UCenter通信失败原因分析]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Fri, 16 Jul 2010 19:22:27 +0000</pubDate> 
<guid>http://www.hdj.me/post/ucenter-correspond-failed-analysis.php</guid> 
<description>
<![CDATA[ 
	<div class="quote"><div class="quote-title">引用</div><div class="quote-content">官方给出的参考解决方法应该是首选检查的：<br/>1、UCenter 应用 ID 需要和 UCenter 后台的 ID 一致；<br/>2、UCenter 通信密钥需要和 UCenter 后台的通信密钥一致；<br/>3、UCenter 访问地址查看是否是正确的地址；<br/>4、UCenter IP 地址查看是否是 UCenter 所在的 MySQL 服务器的 IP 地址。</div></div><br/><br/>一一检查，并没有发现以上所提到的情况，这问题困扰了我相当长的一段时间了，我决定不解决誓不摆休。<br/><br/>后来按照<a href="http://www.discuz.net/thread-1388614-1-1.html" target="_blank">http://www.discuz.net/thread-1388614-1-1.html</a>上面的方法，顺藤摸瓜，找到了真正的原因。<br/><br/>原来是php5.3.x以后对<span style="color: #FF4500;">set_magic_quotes_runtime</span>函数默认不支持导致的问题。<br/><br/><div class="code">//解决办法：找到api/uc.php<br/>第32号：set_magic_quotes_runtime(0);<br/>改为：@set_magic_quotes_runtime(0);<br/></div>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/hdj-php-function-array-splice.php</link>
<title><![CDATA[PHP数组指定位置插入单元]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Thu, 15 Jul 2010 15:40:52 +0000</pubDate> 
<guid>http://www.hdj.me/post/hdj-php-function-array-splice.php</guid> 
<description>
<![CDATA[ 
	这个功能需求来自于网站运营策略，举倒子：<br/>在一个排行列表中，默认有以下元素，顺序有一定的依据，假设是按下载次数排列。<br/><br/><div class="code"><br/>$rows = array(<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;QQ2010&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;QQ2009&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;迅雷5&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;飞信2010&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;Kugoo2010&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;TTplayer&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;Firefox4.0&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;美图秀秀&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;360safe&#039;),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;Chrome6&#039;)<br/>);<br/></div><br/><br/>如果有一个客户[可牛杀毒]想买花10元/元下我们第二个位置，可以大家想，直接把QQ2009替换掉不就完事了吗。不，那样的话用户体验并不好，明明QQ2009是一个下载次数比较多的软件，为什么在列表中却没有了呢。<br/><br/>其实我们真正的需求是把QQ2009以下的单元都往后推，腾出第二个位置来给[可牛杀毒]。如果页面中只能显示10个单元，那倒霉的就是[Chrome6]了，谁叫他们付费买我们的位置呢，呵呵。<br/><br/>再说到程序原理上来吧，PHP要实现这个需求，挺简单，用数组函数array_splice就可以了，具体用法参照PHP手册。<br/><br/>给一个完整的例子吧：<br/><br/><div class="code"><br/>&lt;?php<br/>$rows = array(<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;QQ2010&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;QQ2009&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;迅雷5&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;飞信2010&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;Kugoo2010&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;TTplayer&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;Firefox4.0&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;美图秀秀&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;360safe&#039;,),<br/>&nbsp;&nbsp;array(&#039;name&#039;=&gt;&#039;Chrome6&#039;,),<br/>);<br/><br/>$pop = array(<br/>&nbsp;&nbsp;&#039;2&#039;=&gt;array(&#039;name&#039;=&gt;&#039;可牛杀毒&#039;),<br/>&nbsp;&nbsp;&#039;5&#039;=&gt;array(&#039;name&#039;=&gt;&#039;金山词霸2010&#039;),<br/>);<br/><br/>foreach($pop as $key=&gt;$p)&#123;<br/>&nbsp;&nbsp;array_splice($rows, $key-1, 0, array($p));<br/>&#125;<br/><br/>var_dump($rows);<br/>?&gt;<br/></div><br/><br/>最近的结果是：<br/><div class="code"><br/>array(12) &#123;<br/>&nbsp;&nbsp;&#91;0&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(6) &quot;QQ2010&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;1&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(8) &quot;可牛杀毒&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;2&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(6) &quot;QQ2009&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;3&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(5) &quot;迅雷5&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;4&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(12) &quot;金山词霸2010&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;5&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(8) &quot;飞信2010&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;6&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(9) &quot;Kugoo2010&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;7&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(8) &quot;TTplayer&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;8&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(10) &quot;Firefox4.0&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;9&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(8) &quot;美图秀秀&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;10&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(7) &quot;360safe&quot;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#91;11&#93;=&gt;<br/>&nbsp;&nbsp;array(1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;name&quot;&#93;=&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;string(7) &quot;Chrome6&quot;<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/></div>
]]>
</description>
</item><item>
<link>http://www.hdj.me/read.php/290.htm</link>
<title><![CDATA[swfUpload提示302错误原因及解决办法]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Tue, 13 Jul 2010 09:32:41 +0000</pubDate> 
<guid>http://www.hdj.me/read.php/290.htm</guid> 
<description>
<![CDATA[ 
	在使用swfupload上传文件的时候，老提示302。大概知道原因是因为验证失败自动跳转了。<br/><br/>swfuplaod在上传时，会新开一个进程，和原来的进程不一致，要解决这个问题，需要指定session_id，然后在登录页面判断，如果有post过来的session_id，那么就用函数session_id( $_POST['PHP_SESSIONID'])指定一下。<br/><br/>上传页的JS里面，可以获取当前的SESSION_ID的。<br/><br/>例如上传页的JS中：<br/><br/><div class="code">post_params: &#123;&quot;PHPSESSID&quot;: &quot;&lt;?php echo session_id(); ?&gt;&quot;&#125;,</div><br/><br/>在验证的判断页中：<br/><br/><br/><div class="code">if (isset($_POST&#91;&quot;PHPSESSID&quot;&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;session_id($_POST&#91;&quot;PHPSESSID&quot;&#93;);<br/>&#125;</div><br/><br/>（这一段是网上的注释：在带有Session验证的网站后台中SWFUpload无法正常工作，这是因为SWFUpload在上传时相当于重新开辟了一个新的Session 进程，因此无法与原有程序的Session保持一致，这就需要在上传时传递原有程序的SessionID，根据它来“找回”其应有的Session。）<br/><br/>特别感谢：妖怪、膘叔、觉醒。
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/mysql-optimize-20ways.php</link>
<title><![CDATA[MySQL性能优化二十大实战经验]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Sat, 10 Jul 2010 14:57:15 +0000</pubDate> 
<guid>http://www.hdj.me/post/mysql-optimize-20ways.php</guid> 
<description>
<![CDATA[ 
	今天，数据库的操作越来越成为整个应用的性能瓶颈了，这点对于Web应用尤其明显。关于数据库的性能，这并不只是DBA才需要担心的事，而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构，对操作数据库时（尤其是查表时的SQL语句），我们都需要注意数据操作的性能。这里，我们不会讲过多的SQL语句的优化，而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。<br/><br/>1. 为查询缓存优化你的查询<br/><br/>大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一，而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候，这些查询结果会被放到一个缓存中，这样，后续的相同的查询就不用操作表而直接访问缓存结果了。<br/><br/>这里最主要的问题是，对于程序员来说，这个事情是很容易被忽略的。因为，我们某些查询语句会让MySQL不使用缓存。请看下面的示例：<br/><br/><div class="code"><br/>// 查询缓存不开启<br/>$r = mysql_query(&quot;SELECT username FROM user WHERE signup_date &gt;= CURDATE()&quot;);<br/>// 开启查询缓存<br/>$today = date(&#039;Y-m-d&#039;);<br/>$r = mysql_query(&quot;SELECT username FROM user WHERE signup_date &gt;= &#039;&#123;$today&#125;&#039;&quot;);<br/></div><br/><br/><br/>上面两条SQL语句的差别就是 CURDATE() ，MySQL的查询缓存对这个函数不起作用。所以，像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存，因为这些函数的返回是会不定的易变的。所以，你所需要的就是用一个变量来代替MySQL的函数，从而开启缓存。<br/><br/>2. EXPLAIN 你的 SELECT 查询<br/><br/>使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。<br/><br/>EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的，你的数据表是如何被搜索和排序的……等等，等等。<br/><br/>挑一个你的SELECT语句（推荐挑选那个最复杂的，有多表联接的），把关键字EXPLAIN加到前面。你可以使用phpmyadmin来做这个事。然后，你会看到一张表格。下面的这个示例中，我们忘记加上了group_id索引，并且有表联接：<br/><br/><br/><br/>我们可以看到，前一个结果显示搜索了 7883 行，而后一个只是搜索了两个表的 9 和 16 行。查看rows列可以让我们找到潜在的性能问题。<br/><br/>3. 当只要一行数据时使用 LIMIT 1<br/><br/>当你查询表的有些时候，你已经知道结果只会有一条结果，但因为你可能需要去fetch游标，或是你也许会去检查返回的记录数。<br/><br/>在这种情况下，加上 LIMIT 1 可以增加性能。这样一样，MySQL数据库引擎会在找到一条数据后停止搜索，而不是继续往后查少下一条符合记录的数据。<br/><br/>下面的示例，只是为了找一下是否有“中国”的用户，很明显，后面的会比前面的更有效率。（请注意，第一条中是Select *，第二条是Select 1）<br/><br/><div class="code"><br/>// 没有效率的<br/>$r = mysql_query(&quot;SELECT * FROM user WHERE country=&#039;China&#039;&quot;);<br/>if( mysql_num_rows($r) )&#123;<br/>&nbsp;&nbsp;//...<br/>&#125;<br/><br/>// 有效率的<br/>$r = mysql_query(&quot;SELECT 1 FROM user WHERE country=&#039;China&#039;&quot;);<br/>if( mysql_num_rows($r) )&#123;<br/>&nbsp;&nbsp;//...<br/>&#125;<br/></div><br/><br/>4. 为搜索字段建索引<br/><br/>索引并不一定就是给主键或是唯一的字段。如果在你的表中，有某个字段你总要会经常用来做搜索，那么，请为其建立索引吧。<br/><br/><div class="code"><br/>mysql&gt; SELECT COUNT(*) FROM `user` WHERE `last_name` LIKE `a%`; ## mysql_no_cache<br/>... &lt;0.25s&gt;<br/>1 rows<br/><br/>mysql&gt; ALTER TABLE `user` ADD INDEX (`last_name`);<br/>mysql&gt; SELECT COUNT(*) FROM `user` WHERE `last_name` LIKE `a%`; ## mysql_no_cache<br/>... &lt;0.06s&gt;<br/>1 rows<br/></div><br/><br/>从上图你可以看到那个搜索字串 “last_name LIKE ‘a%’”，一个是建了索引，一个是没有索引，性能差了4倍左右。<br/><br/>另外，你应该也需要知道什么样的搜索是不能使用正常的索引的。例如，当你需要在一篇大的文章中搜索一个词时，如： “WHERE post_content LIKE ‘%apple%’”，索引可能是没有意义的。你可能需要使用MySQL全文索引 或是自己做一个索引（比如说：搜索关键词或是Tag什么的）<br/><br/>5. 在Join表的时候使用相当类型的例，并将其索引<br/><br/>如果你的应用程序有很多 JOIN 查询，你应该确认两个表中Join的字段是被建过索引的。这样，MySQL内部会启动为你优化Join的SQL语句的机制。<br/><br/>而且，这些被用来Join的字段，应该是相同的类型的。例如：如果你要把 DECIMAL 字段和一个 INT 字段Join在一起，MySQL就无法使用它们的索引。对于那些STRING类型，还需要有相同的字符集才行。（两个表的字符集有可能不一样）<br/><br/><div class="code"><br/>// 在state中找company<br/>$r = mysql_query(&quot;SELECT company_name FROM user LEFT JOIN company ON (user.state=company.state) WHERE user.id=&#123;$user_id&#125;&quot;);<br/>// 两个state字段应该是被建立在索引的，而且是适当的类型，相同的字符集<br/></div><br/><br/>6. 千万不要 ORDER BY RAND()<br/><br/>想打乱返回的数据行？随机挑一个数据？真不知道谁发明了这种用法，但很多新手很喜欢这样用。但你确不了解这样做有多么可怕的性能问题。<br/><br/>如果你真的想把返回的数据行打乱了，你有N种方法可以达到这个目的。这样使用只让你的数据库的性能呈指数级的下降。这里的问题是：MySQL会不得不去执行RAND()函数（很耗CPU时间），而且这是为了每一行记录去记行，然后再对其排序。就算是你用了Limit 1也无济于事（因为要排序）<br/><br/>下面的示例是随机挑一条记录<br/><br/><div class="code"><br/>// 千万不要这样做<br/>$r = mysql_query(&quot;SELECT username FROM user ORDER BY RAND() LIMIT 1&quot;);<br/><br/>// 这要会更好<br/>$r = mysql_query(&quot;SELECT COUNT(*) FROM `user`&quot;);<br/>$d = mysql_fetch_row($r);<br/>$rand = mt_rand(0, $d&#91;0&#93;-1);<br/><br/>$r = mysql_query(&quot;SELECT username FROM user LIMIT &#123;$rand&#125;, 1&quot;);<br/></div><br/><br/>7. 避免 SELECT *<br/><br/>从数据库里读出越多的数据，那么查询就会变得越慢。并且，如果你的数据库服务器和WEB服务器是两&#92;台&#92;独立的服务器的话，这还会增加网络传输的负载。<br/><br/>所以，你应该养成一个需要什么就取什么的好的习惯。<br/><br/><br/><br/>8. 永远为每张表设置一个ID<br/><br/>我们应该为数据库里的每张表都设置一个ID做为其主键，而且最好的是一个INT型的（推荐使用UNSIGNED），并设置上自动增加的AUTO_INCREMENT标志。<br/><br/>就算是你 users 表有一个主键叫 “email”的字段，你也别让它成为主键。使用 VARCHAR 类型来当主键会使用得性能下降。另外，在你的程序中，你应该使用表的ID来构造你的数据结构。<br/><br/>而且，在MySQL数据引擎下，还有一些操作需要使用主键，在这些情况下，主键的性能和设置变得非常重要，比如，集群，分区……<br/><br/>在这里，只有一个情况是例外，那就是“关联表”的“外键”，也就是说，这个表的主键，通过若干个别的表的主键构成。我们把这个情况叫做“外键”。比如：有一个“学生表”有学生的ID，有一个“课程表”有课程ID，那么，“成绩表”就是“关联表”了，其关联了学生表和课程表，在成绩表中，学生ID和课程ID叫“外键”其共同组成主键。<br/><br/>9. 使用 ENUM 而不是 VARCHAR<br/><br/>ENUM 类型是非常快和紧凑的。在实际上，其保存的是 TINYINT，但其外表上显示为字符串。这样一来，用这个字段来做一些选项列表变得相当的完美。<br/><br/>如果你有一个字段，比如“性别”，“国家”，“民族”，“状态”或“部门”，你知道这些字段的取值是有限而且固定的，那么，你应该使用 ENUM 而不是 VARCHAR。<br/><br/>MySQL也有一个“建议”（见第十条）告诉你怎么去重新组织你的表结构。当你有一个 VARCHAR 字段时，这个建议会告诉你把其改成 ENUM 类型。使用 PROCEDURE ANALYSE() 你可以得到相关的建议。<br/><br/>10. 从 PROCEDURE ANALYSE() 取得建议<br/><br/>PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据，并会给你一些有用的建议。只有表中有实际的数据，这些建议才会变得有用，因为要做一些大的决定是需要有数据作为基础的。<br/><br/>例如，如果你创建了一个 INT 字段作为你的主键，然而并没有太多的数据，那么，PROCEDURE ANALYSE()会建议你把这个字段的类型改成 MEDIUMINT 。或是你使用了一个 VARCHAR 字段，因为数据不多，你可能会得到一个让你把它改成 ENUM 的建议。这些建议，都是可能因为数据不够多，所以决策做得就不够准。<br/><br/>在phpmyadmin里，你可以在查看表时，点击 “Propose table structure” 来查看这些建议<br/><br/>一定要注意，这些只是建议，只有当你的表里的数据越来越多时，这些建议才会变得准确。一定要记住，你才是最终做决定的人。<br/><br/>11. 尽可能的使用 NOT NULL<br/><br/>除非你有一个很特别的原因去使用 NULL 值，你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议，请往下看。<br/><br/>首先，问问你自己“Empty”和“NULL”有多大的区别（如果是INT，那就是0和NULL）？如果你觉得它们之间没有什么区别，那么你就不要使用NULL。（你知道吗？在 Oracle 里，NULL 和 Empty 的字符串是一样的！)<br/><br/>不要以为 NULL 不需要空间，其需要额外的空间，并且，在你进行比较的时候，你的程序会更复杂。 当然，这里并不是说你就不能使用NULL了，现实情况是很复杂的，依然会有些情况下，你需要使用NULL值。<br/><br/><br/>12. Prepared Statements<br/><br/>Prepared Statements很像存储过程，是一种运行在后台的SQL语句集合，我们可以从使用 prepared statements 获得很多好处，无论是性能问题还是安全问题。<br/><br/>Prepared Statements 可以检查一些你绑定好的变量，这样可以保护你的程序不会受到“SQL注入式”攻击。当然，你也可以手动地检查你的这些变量，然而，手动的检查容易出问题，而且很经常会被程序员忘了。当我们使用一些framework或是ORM的时候，这样的问题会好一些。<br/><br/>在性能方面，当一个相同的查询被使用多次的时候，这会为你带来可观的性能优势。你可以给这些Prepared Statements定义一些参数，而MySQL只会解析一次。<br/><br/>虽然最新版本的MySQL在传输Prepared Statements是使用二进制形势，所以这会使得网络传输非常有效率。<br/><br/>当然，也有一些情况下，我们需要避免使用Prepared Statements，因为其不支持查询缓存。但据说版本5.1后支持了。<br/><br/>在PHP中要使用prepared statements，你可以查看其使用手册：mysqli 扩展 或是使用数据库抽象层，如： PDO.<br/><br/><div class="code"><br/>// 创建prepared statement<br/>if($stmt = $mysqli-&gt;prepare(&quot;SELECT username FROM user WHERE state=?&quot;))&#123;<br/>&nbsp;&nbsp;// 绑定参数<br/>&nbsp;&nbsp;$stmt-&gt;bind_param(&quot;s&quot;, $state);<br/><br/>&nbsp;&nbsp;// 执行<br/>&nbsp;&nbsp;$stmp-&gt;execute();<br/><br/>&nbsp;&nbsp;// 绑定结果<br/>&nbsp;&nbsp;$stmt-&gt;bind_result($username);<br/><br/>&nbsp;&nbsp;// 移动游标<br/>&nbsp;&nbsp;$stmt-&gt;fetch();<br/><br/>&nbsp;&nbsp;printf(&quot;%s is from %s&#92;n&quot;, $username, $state);<br/><br/>&nbsp;&nbsp;$stmt-&gt;close();<br/>&#125;<br/></div><br/><br/>13. 无缓冲的查询<br/><br/>正常的情况下，当你在当你在你的脚本中执行一个SQL语句的时候，你的程序会停在那里直到没这个SQL语句返回，然后你的程序再往下继续执行。你可以使用无缓冲查询来改变这个行为。<br/><br/>关于这个事情，在PHP的文档中有一个非常不错的说明： mysql_unbuffered_query() 函数：<br/><br/>上面那句话翻译过来是说，mysql_unbuffered_query() 发送一个SQL语句到MySQL而并不像mysql_query()一样去自动fethch和缓存结果。这会相当节约很多可观的内存，尤其是那些会产生大量结果的查询语句，并且，你不需要等到所有的结果都返回，只需要第一行数据返回的时候，你就可以开始马上开始工作于查询结果了。<br/><br/>然而，这会有一些限制。因为你要么把所有行都读走，或是你要在进行下一次的查询前调用 mysql_free_result() 清除结果。而且， mysql_num_rows() 或 mysql_data_seek() 将无法使用。所以，是否使用无缓冲的查询你需要仔细考虑。<br/><br/>14. 把IP地址存成 UNSIGNED INT<br/><br/>很多程序员都会创建一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP。如果你用整形来存放，只需要4个字节，并且你可以有定长的字段。而且，这会为你带来查询上的优势，尤其是当你需要使用这样的WHERE条件：IP between ip1 and ip2。<br/><br/>我们必需要使用UNSIGNED INT，因为 IP地址会使用整个32位的无符号整形。<br/><br/>而你的查询，你可以使用 INET_ATON() 来把一个字符串IP转成一个整形，并使用 INET_NTOA() 把一个整形转成一个字符串IP。在PHP中，也有这样的函数 ip2long() 和 long2ip()。<br/><br/><div class="code"><br/>$r = mysql_query(&quot;UPDATE user SET `ip`=INET_ATON(&#039;&#123;$_SERVER&#91;&#039;REMOTE_ADDR&#039;&#93;&#125;&#039;) WHERE `user_id`=&#039;&#123;$user_id&#125;&#039;&quot;);<br/></div><br/><br/>15. 固定长度的表会更快<br/><br/>如果表中的所有字段都是“固定长度”的，整个表会被认为是 “static” 或 “fixed-length”。 例如，表中没有如下类型的字段： VARCHAR，TEXT，BLOB。只要你包括了其中一个这些字段，那么这个表就不是“固定长度静态表”了，这样，MySQL 引擎会用另一种方法来处理。<br/><br/>固定长度的表会提高性能，因为MySQL搜寻得会更快一些，因为这些固定的长度是很容易计算下一个数据的偏移量的，所以读取的自然也会很快。而如果字段不是定长的，那么，每一次要找下一条的话，需要程序找到主键。<br/><br/>并且，固定长度的表也更容易被缓存和重建。不过，唯一的副作用是，固定长度的字段会浪费一些空间，因为定长的字段无论你用不用，他都是要分配那么多的空间。<br/><br/>使用“垂直分割”技术（见下一条），你可以分割你的表成为两个一个是定长的，一个则是不定长的。<br/><br/>16. 垂直分割<br/><br/>“垂直分割”是一种把数据库中的表按列变成几张表的方法，这样可以降低表的复杂度和字段的数目，从而达到优化的目的。（以前，在银行做过项目，见过一张表有100多个字段，很恐怖）<br/><br/>示例一：在Users表中有一个字段是家庭地址，这个字段是可选字段，相比起，而且你在数据库操作的时候除了个人信息外，你并不需要经常读取或是改写这个字段。那么，为什么不把他放到另外一张表中呢？ 这样会让你的表有更好的性能，大家想想是不是，大量的时候，我对于用户表来说，只有用户ID，用户名，口令，用户角色等会被经常使用。小一点的表总是会有好的性能。<br/><br/>示例二： 你有一个叫 “last_login” 的字段，它会在每次用户登录时被更新。但是，每次更新时会导致该表的查询缓存被清空。所以，你可以把这个字段放到另一个表中，这样就不会影响你对用户ID，用户名，用户角色的不停地读取了，因为查询缓存会帮你增加很多性能。<br/><br/>另外，你需要注意的是，这些被分出去的字段所形成的表，你不会经常性地去Join他们，不然的话，这样的性能会比不分割时还要差，而且，会是极数级的下降。<br/><br/>17. 拆分大的 DELETE 或 INSERT 语句<br/><br/>如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询，你需要非常小心，要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的，表一锁住了，别的操作都进不来了。<br/><br/>Apache 会有很多的子进程或线程。所以，其工作起来相当有效率，而我们的服务器也不希望有太多的子进程，线程和数据库链接，这是极大的占服务器资源的事情，尤其是内存。<br/><br/>如果你把你的表锁上一段时间，比如30秒钟，那么对于一个有很高访问量的站点来说，这30秒所积累的访问进程/线程，数据库链接，打开的文件数，可能不仅仅会让你泊WEB服务Crash，还可能会让你的整台服务器马上掛了。<br/><br/>所以，如果你有一个大的处理，你定你一定把其拆分，使用 LIMIT 条件是一个好的方法。下面是一个示例：<br/><br/><div class="code"><br/>while(1)&#123;<br/>&nbsp;&nbsp;mysql_query(&quot;DELETE FROM logs WHERE log_date &lt;= &#039;2009-11-01&#039; LIMIT 1000&quot;);<br/>&nbsp;&nbsp;if(mysql_affected_rows() == 0) break;<br/>&nbsp;&nbsp;usleep(5000);<br/>&#125;<br/></div><br/><br/>18. 越小的列会越快<br/><br/>对于大多数的数据库引擎来说，硬盘操作可能是最重大的瓶颈。所以，把你的数据变得紧凑会对这种情况非常有帮助，因为这减少了对硬盘的访问。<br/><br/>参看 MySQL 的文档 Storage Requirements 查看所有的数据类型。<br/><br/>如果一个表只会有几列罢了（比如说字典表，配置表），那么，我们就没有理由使用 INT 来做主键，使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间，使用 DATE 要比 DATETIME 好得多。<br/><br/>当然，你也需要留够足够的扩展空间，不然，你日后来干这个事，你会死的很难看，参看Slashdot的例子（2009年11月06日），一个简单的ALTER TABLE语句花了3个多小时，因为里面有一千六百万条数据。<br/><br/>19. 选择正确的存储引擎<br/><br/>在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB，每个引擎都有利有弊。酷壳以前文章《MySQL: InnoDB 还是 MyISAM?》讨论和这个事情。<br/><br/>MyISAM 适合于一些需要大量查询的应用，但其对于有大量写操作并不是很好。甚至你只是需要update一个字段，整个表都会被锁起来，而别的进程，就算是读进程都无法操作直到读操作完成。另外，MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。<br/><br/>InnoDB 的趋势会是一个非常复杂的存储引擎，对于一些小的应用，它会比 MyISAM 还慢。他是它支持“行锁” ，于是在写操作比较多的时候，会更优秀。并且，他还支持更多的高级应用，比如：事务。<br/><br/>下面是MySQL的手册<br/><br/>target=”_blank”MyISAM Storage Engine<br/><br/>InnoDB Storage Engine<br/><br/>20. 使用一个对象关系映射器（Object Relational Mapper）<br/><br/>使用 ORM (Object Relational Mapper)，你能够获得可靠的性能增涨。一个ORM可以做的所有事情，也能被手动的编写出来。但是，这需要一个高级专家。<br/><br/>ORM 的最重要的是“Lazy Loading”，也就是说，只有在需要的去取值的时候才会去真正的去做。但你也需要小心这种机制的副作用，因为这很有可能会因为要去创建很多很多小的查询反而会降低性能。<br/><br/>ORM 还可以把你的SQL语句打包成一个事务，这会比单独执行他们快得多得多。<br/><br/>目前，个人最喜欢的PHP的ORM是：Doctrine。<br/><br/>21. 小心“永久链接”<br/><br/>“永久链接”的目的是用来减少重新创建MySQL链接的次数。当一个链接被创建了，它会永远处在连接的状态，就算是数据库操作已经结束了。而且，自从我们的Apache开始重用它的子进程后——也就是说，下一次的HTTP请求会重用Apache的子进程，并重用相同的 MySQL 链接。<br/><br/>PHP手册：mysql_pconnect()<br/><br/>在理论上来说，这听起来非常的不错。但是从个人经验（也是大多数人的）上来说，这个功能制造出来的麻烦事更多。因为，你只有有限的链接数，内存问题，文件句柄数，等等。<br/><br/>而且，Apache 运行在极端并行的环境中，会创建很多很多的了进程。这就是为什么这种“永久链接”的机制工作地不好的原因。在你决定要使用“永久链接”之前，你需要好好地考虑一下你的整个系统的架构。<br/><br/>原文地址：<a href="http://hi.baidu.com/%CA%AB%D5%B9/blog/item/361b0efa702b589a58ee907f.html" target="_blank">http://hi.baidu.com/%CA%AB%D5%B9/blog/item/361b0efa702b589a58ee907f.html</a>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/mysql_memcached_space.php</link>
<title><![CDATA[当 MySQL 和 Memcached 遇到尾部空格时]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Tue, 06 Jul 2010 13:47:20 +0000</pubDate> 
<guid>http://www.hdj.me/post/mysql_memcached_space.php</guid> 
<description>
<![CDATA[ 
	转载于s135.com，原文地址：<a href="http://blog.s135.com/mysql_memcached_space/" target="_blank">http://blog.s135.com/mysql_memcached_space/</a><br/>MySQL 和 Memcached 对于同一个key，不能对应起来。最终原因是：PHP将key写入MySQL数据库之前，没有经过trim()过滤首尾空格（关键是尾部空格），结果：<br/><br/><a href="http://blog.s135.com/attachment/201007/mysqlspace.png" target="_blank"><img src="http://blog.s135.com/attachment/201007/mysqlspace.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　1、MySQL的varchar、char类型字段，SELECT .... WHERE 查询时忽略字段的尾部空格。例如varchar类型字段uidcode中，存储的含有尾部空格的内容“rewinx ”，通过以下三种方式均可查询到：<br/><br/>　　<br/><br/>　　在MySQL手册第“11.4.1. CHAR和VARCHAR类型”节中写道（http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char）：请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有MySQL版本均如此，并且它不受SQL服务器模式的影响。<br/><br/><br/>　　2、PHP 的 Memcache 扩展，则在set、get时，自动将key中的空格，转换成了半角下划线“_”。当然，直接通过 Memcached 协议来读取，key值“rewinx ”就要写成“rewinx_”了。<br/><br/>　　示例：testmc.php<br/><br/><br/><div class="code">&lt;?php&nbsp;&nbsp;<br/>$memcache_obj = new Memcache;&nbsp;&nbsp;<br/>$memcache_obj-&gt;connect(&#039;192.168.8.34&#039;, 11211);&nbsp;&nbsp;<br/>$memcache_obj-&gt;set(&#039;rewinx &#039;, &#039;hello world&#039;);&nbsp;&nbsp;<br/>echo $memcache_obj-&gt;get(&#039;rewinx &#039;).&quot;&#92;r&#92;n&quot;;&nbsp;&nbsp;<br/>?&gt;&nbsp;&nbsp;</div><br/><br/><a href="http://blog.s135.com/attachment/201007/memcachedspace.png" target="_blank"><img src="http://blog.s135.com/attachment/201007/memcachedspace.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a>
]]>
</description>
</item><item>
<link>http://www.hdj.me/post/php-function-getChineseNumber.php</link>
<title><![CDATA[阿拉伯数字转中文数字getChineseNumber]]></title> 
<author>deeka &lt;admin@yourname.com&gt;</author>
<category><![CDATA[PHP/MYSQL]]></category>
<pubDate>Mon, 05 Jul 2010 16:11:46 +0000</pubDate> 
<guid>http://www.hdj.me/post/php-function-getChineseNumber.php</guid> 
<description>
<![CDATA[ 
	备忘一下，一个装阿拉伯数字转中文数字的函数。<br/><div class="code"><br/>&lt;?php<br/>function getChineseNumber($money)&#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;$ar = array(&quot;零&quot;, &quot;壹&quot;, &quot;貳&quot;, &quot;參&quot;, &quot;肆&quot;, &quot;伍&quot;, &quot;陸&quot;, &quot;柒&quot;, &quot;捌&quot;, &quot;玖&quot;) ;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;$cName = array(&quot;&quot;, &quot;&quot;, &quot;拾&quot;, &quot;佰&quot;, &quot;仟&quot;, &quot;萬&quot;, &quot;拾&quot;, &quot;佰&quot;, &quot;仟&quot;, &quot;億&quot;, &quot;拾&quot;, &quot;佰&quot;, &quot;仟&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;$conver = &quot;&quot;;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$cLast = &quot;&quot; ;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;$cZero = 0;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;$i = 0;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;for ($j = strlen($money) ; $j &gt;=1 ; $j--)&#123;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cNum = intval(substr($money, $i, 1));&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cunit = $cName&#91;$j&#93;; //取出位數&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($cNum == 0) &#123; //判斷取出的數字是否為0,如果是0,則記錄共有幾0&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cZero++;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strpos($cunit,&quot;萬億&quot;) &gt;0 &amp;&amp; ($cLast == &quot;&quot;))&#123; // &#039;如果取出的是萬,億,則位數以萬億來補&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cLast = $cunit ;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;else &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($cZero &gt; 0) &#123;// &#039;如果取出的數字0有n個,則以零代替所有的0&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strpos(&quot;萬億&quot;, substr($conver, strlen($conver)-2)) &gt;0) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $conver .= $cLast; //&#039;如果最後一位不是億,萬,則最後一位補上&quot;億萬&quot;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$conver .=&nbsp;&nbsp;&quot;零&quot; ;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cZero = 0;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cLast = &quot;&quot; ;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $conver = $conver.$ar&#91;$cNum&#93;.$cunit; // &#039;如果取出的數字沒有0,則是中文數字+單位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$i++;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;//&#039;判斷數字的最後一位是否為0,如果最後一位為0,則把萬億補上&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; if (strpos(&quot;萬億&quot;, substr($conver, strlen($conver)-2)) &gt;0) &#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $conver .=$cLast; // &#039;如果最後一位不是億,萬,則最後一位補上&quot;億萬&quot;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return $conver;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>echo getChineseNumber(1759439);//壹佰柒拾伍萬玖仟肆佰參拾玖<br/>?&gt;<br/></div>
]]>
</description>
</item>
</channel>
</rss>