<?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>pzg&#039;s blog &#187; 网页设计</title>
	<atom:link href="http://pzg.me/c/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://pzg.me</link>
	<description>永远怀念……</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:14:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>让wordpress通过HTML5验证</title>
		<link>http://pzg.me/web/1794/html5-validation-to-wordpress-by/</link>
		<comments>http://pzg.me/web/1794/html5-validation-to-wordpress-by/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 08:33:39 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1794</guid>
		<description><![CDATA[&#60;?php   foreach(array(     'rsd_link',//rel="EditURI"     'index_rel_link',//rel="index"     'start_post_rel_link',//rel="start"     'wlwmanifest_link'//rel="wlwmanifest"   ) as $xx)   remove_action('wp_head',$xx);//X掉以上   funct... ]]></description>
			<content:encoded><![CDATA[<blockquote><p>&lt;?php   foreach(array(     'rsd_link',//rel="EditURI"     'index_rel_link',//rel="index"     'start_post_rel_link',//rel="start"     'wlwmanifest_link'//rel="wlwmanifest"   ) as $xx)   remove_action('wp_head',$xx);//X掉以上   function the_category_filter($thelist){//rel="category"或rel="category tag", 这个最巨量     return preg_replace('/rel=".*?"/','rel="tag"',$thelist);   }   add_filter('the_category','the_category_filter'); ?&gt;</p></blockquote>
<p>将以上代码加到functions.php里面去，Wordpress就不会生成烦人无用的rel属性了</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1794/html5-validation-to-wordpress-by/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Function ereg_replace() is deprecated in</title>
		<link>http://pzg.me/web/1789/installation-dedecms-appear-function-ereg_replace-is-deprecated-in/</link>
		<comments>http://pzg.me/web/1789/installation-dedecms-appear-function-ereg_replace-is-deprecated-in/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 03:35:41 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[DEDECMS]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1789</guid>
		<description><![CDATA[Deprecated: Function ereg_replace() is deprecated in     由于PHP版本是5.3.3。     查询了一下，这个错误的意思是说：config.php文件里ereg_replace()不能执行或执行错了。     而出现这个问题的原因是PHP的... ]]></description>
			<content:encoded><![CDATA[<p>Deprecated: Function ereg_replace() is deprecated in</p>
<p>    由于PHP版本是5.3.3。</p>
<p>    查询了一下，这个错误的意思是说：config.php文件里ereg_replace()不能执行或执行错了。</p>
<p>    而出现这个问题的原因是PHP的版本问题：DEDE的开发人员现在还在5.1时代，不知道ereg_replace是php5.3中废弃的标签，不推进使用了。PHP5.3及以上一些函数已经淘汰了，不被支持。而DEDE很多都是使用的5.2以前的函数写的。官方也没有做这方面的更新。<br />
   自己整理了一下，找到了下面的几种解决方法：<br />
   1.从新下一个个PHP5.2,安装后，将版本切换到5.2，问题解决了。<br />
   2.信息提示是不推荐使用ereg_replace()，你加个@看能不能屏蔽掉,@ereg_replace(...)<br />
   3.要是不行的话，就改改吧，将dede\config.php文件的第二行替换成<br />
 define(’DEDEADMIN’, preg_replace(”/[\/\\\\]{1,}/”, ‘/’, dirname(__FILE__) ) );</p>
<p>   4.要是加那一句不行的话，就改成下面的样子吧：<br />
（1）define('DEDEADMIN', preg_replace("/[\/\\\\]{1,}/", '/', dirname(__FILE__) ) );<br />
（2）define('DEDEADMIN',strtr(dirname(__FILE__),'\\/','//'));</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1789/installation-dedecms-appear-function-ereg_replace-is-deprecated-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>亦歌wordpress插件1g1g</title>
		<link>http://pzg.me/web/1785/song-of-wordpress-plug-1g1g-also/</link>
		<comments>http://pzg.me/web/1785/song-of-wordpress-plug-1g1g-also/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 14:32:32 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1785</guid>
		<description><![CDATA[使用WordPress搭建的博客，安装此插件后，可以在文章或页面中分享作者喜爱的歌曲。 该插件提供搜索功能，作者输入关键字，即可搜索出希望分享的歌曲。分享后页面中自动出现亦歌迷你播放... ]]></description>
			<content:encoded><![CDATA[<p>使用WordPress搭建的博客，安装此插件后，可以在文章或页面中分享作者喜爱的歌曲。</p>
<p>该插件提供搜索功能，作者输入关键字，即可搜索出希望分享的歌曲。分享后页面中自动出现亦歌迷你播放器，播放分享的歌曲。</p>
<p>在管理平台的“插件”-&gt;“添加新插件”中，搜索“1g music share”，即可找到此插件，轻松安装。</p>
<p>安装WordPress分享插件</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1785/song-of-wordpress-plug-1g1g-also/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>常见的100多个爬虫</title>
		<link>http://pzg.me/web/1629/more-than-100-reptiles-common/</link>
		<comments>http://pzg.me/web/1629/more-than-100-reptiles-common/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 07:01:21 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[爬虫]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1629</guid>
		<description><![CDATA[107 个机器人 Yahoo Slurp Unknown robot (identified by 'crawl') Googlebot Yahoo! Slurp China GouGou OutfoxBot GigaBot Lilina MSNBot Java (Often spam bot) NewsGator Online BaiDuSpider Sina Iask Spider Bloglines MagpieRSS Alexa (IA Archiver) Feedfetcher... ]]></description>
			<content:encoded><![CDATA[<p>107 个机器人<br />
Yahoo Slurp<br />
Unknown robot (identified by 'crawl')<br />
Googlebot<br />
Yahoo! Slurp China<br />
GouGou<br />
OutfoxBot<br />
GigaBot<br />
Lilina<br />
MSNBot<br />
Java (Often spam bot)<br />
NewsGator Online<br />
BaiDuSpider<br />
Sina Iask Spider<br />
Bloglines<br />
MagpieRSS<br />
Alexa (IA Archiver)<br />
Feedfetcher-Google<br />
MT::Telegraph::Agent<br />
Feedburner<span id="more-1629"></span><br />
RoJo aggregator<br />
Python-urllib<br />
Jakarta commons-httpclient<br />
Heritrix<br />
Google AdSense<br />
Mydoyouhike<br />
Unknown robot (identified by 'spider')<br />
Voyager<br />
Ocelli<br />
Unknown robot (identified by hit on 'robots.txt')<br />
Unknown robot (identified by 'robot')<br />
larbin<br />
Hylanda<br />
ZyBorg<br />
ZhuaXia<br />
lanshanbot<br />
Technoratibot<br />
Microsoft URL Control<br />
IRLbot<br />
Unknown robot (identified by 'bot/' or 'bot-')<br />
Turn It In<br />
Megite<br />
MSIECrawler<br />
msnbot-media<br />
Sogou Spider<br />
NutchCVS<br />
MJ12bot<br />
Kinjabot<br />
Gaisbot<br />
SurveyBot<br />
Ask<br />
StackRambler<br />
Girafabot<br />
T-H-U-N-D-E-R-S-T-O-N-E<br />
Yahoo Feed Seeker<br />
WordPress<br />
UniversalFeedParser<br />
Sphere Scout<br />
findlinks<br />
SBIder<br />
Yahoo-Blogs<br />
FeedValidator<br />
Yahoo-MMCrawler<br />
lwp-trivial<br />
Webdup<br />
Blogslive<br />
IBM Almaden Research Center WebFountain?<br />
Openfind data gatherer<br />
BlogPulse ISSpider intelliseek.com<br />
HPPrint<br />
Walhello appie<br />
BlogSearch<br />
ping.blo.gs<br />
Biz360 spider<br />
UP.Browser<br />
topicblogs<br />
Exabot<br />
Snappy<br />
LinkWalker<br />
BlogBridge Service<br />
The World Wide Web Worm<br />
Nutch<br />
The web archive (IA Archiver)<br />
Feedster<br />
YahooSeeker-Testing<br />
Voila<br />
aipbot<br />
PluckFeedCrawler<br />
Everest-Vulcan<br />
NG 2.x (Exalead)<br />
MS SharePoint Portal Server - MS Search 4.0 Robot<br />
Missigua_Locator<br />
boitho.com-dc<br />
Sunrise<br />
Blogshares Spiders<br />
ExactSeek Crawler<br />
Nagios<br />
nicebot<br />
HTTrack off-line browser<br />
Harvest<br />
SandCrawler (Microsoft)<br />
edgeio-retriever<br />
NG 1.x (Exalead)<br />
HTMLParser<br />
Scooter<br />
Y!J Yahoo Japan<br />
arks<br />
Tagyu Agent</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1629/more-than-100-reptiles-common/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>HTML5之表单详解</title>
		<link>http://pzg.me/web/1625/detailed-html5-of-the-form/</link>
		<comments>http://pzg.me/web/1625/detailed-html5-of-the-form/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 12:36:59 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1625</guid>
		<description><![CDATA[email输入类型 &#60;INPUT type=email name=email&#62;   此类型要求输入格式正确的email地址,否则浏览器是不允许提交的,并会有一个错误信息提示.此类型必须指定name值,否则无效果. url输入类型 &#60;INPUT typ... ]]></description>
			<content:encoded><![CDATA[<p>email输入类型</p>
<p>&lt;INPUT type=email name=email&gt;<br />
 <br />
此类型要求输入格式正确的email地址,否则浏览器是不允许提交的,并会有一个错误信息提示.此类型必须指定name值,否则无效果.</p>
<p>url输入类型</p>
<p>&lt;INPUT type=url&gt;<br />
 <br />
上面代码展示的文本域要求输入格式正确的URL地址,Opera中会自动在开始处添加http://.</p>
<p>日期时间相关输入类型(这些个很牛X的)</p>
<p>&lt;INPUT type=date&gt;<br />
&lt;INPUT type=time&gt;<br />
&lt;INPUT type=month&gt;<br />
&lt;INPUT type=week&gt;<br />
 <br />
这一系列是很酷的一个类型,完全解决了烦琐的JS日历控件问题.但目前MS只有Opera/Chrome新版本支持,且展示效果也不一样.</p>
<p>number输入类型(这些个很牛X的)</p>
<p>&lt;INPUT type=number&gt;<br />
 <br />
这个不用多解释了,要求输入一个数字字符,若未输入则会抛出一个错误.</p>
<p>range输入类型</p>
<p>&lt;INPUT type=range&gt;<br />
 <br />
此类型将显示一个可拖动的滑块条,并可通过设定max/min/step值限定拖动范围.拖动时会反馈给value一个值.</p>
<p>search输入类型</p>
<p>&lt;INPUT type=search&gt;<br />
 <br />
此类型表示输入的将是一个搜索关键字,通过results=s可显示一个搜索小图标.</p>
<p>tel输入类型</p>
<p>&lt;INPUT type=tel&gt;<br />
 <br />
此类型要求输入一个电话号码,但实际上它并没有特殊的验证,与text类型没什么区别.</p>
<p>color输入类型</p>
<p>&lt;INPUT type=color&gt;<br />
 <br />
此类型表单,可让用户通过颜色选择器选择一个颜色值,并反馈到value中.</p>
<p>三、新增的表单属性</p>
<p>placeholder属性</p>
<p>&lt;INPUT id=placeholder placeholder="点击我会以清除"&gt;<br />
 <br />
这是一个很实用的属性,免去了用JS去实现点击清除表单初始值.浏览器支持也还不错,MS除了Firefox,其他标准浏览器都能很好的支持.</p>
<p>require/pattern属性</p>
<p>&lt;INPUT id=placeholder name=require required&gt;<br />
&lt;INPUT id=placeholder name=require1 required="required"&gt;<br />
&lt;INPUT name=require2 pattern="^[1-9]\d{5}$"&gt;<br />
 <br />
表单验证属性，require类型时，若输入值为空，则拒绝提交，并会有一个提示。上面两种写法都对，这个很有用。并且可以用于textarea以及hidden/image/submit类型.pattern类型为正则验证，可以完成各种复杂的验证。这两种类型必须指定name值，否则无效果。</p>
<p>autofocus属性</p>
<p>&lt;INPUT autofocus="true"&gt;<br />
 <br />
默认聚焦属性,可在页面加载时聚焦到一个表单控件,类似于JS的focus().</p>
<p>list属性</p>
<p>&lt;INPUT id=list list="ilist"&gt;<br />
&lt;DATALIST id=ilist&gt;<br />
 &lt;OPTION value="a" label="a"&gt;<br />
 &lt;OPTION value="b" label="b"&gt;<br />
 &lt;OPTION value="c" label="c"&gt;<br />
&lt;/DATALIST&gt;<br />
 <br />
该属性需要与datalist属性共用，datalist是对选择框的记忆，而list属性可以为选择框自定义记忆的内容。</p>
<p>max/min/step属性</p>
<p>&lt;INPUT type=range step="20" min="1" max="100"&gt;<br />
 <br />
限制值的输入范围，以及值的输入渐进程度，比如可在number设定输入最大值最小值，或者在range中设定拖动阶梯。</p>
<p>autocomplete属性</p>
<p>&lt;INPUT id=autocomplete autocomplete="on"&gt;<br />
 <br />
此属性是为表单提供自动完成功能。如果该属性为打开状态可很好地自动完成。一般来说，此属性必须启动浏览器的自动完成功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1625/detailed-html5-of-the-form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>合理配置MySQL缓存</title>
		<link>http://pzg.me/web/1618/rational-distribution-of-mysql-cache/</link>
		<comments>http://pzg.me/web/1618/rational-distribution-of-mysql-cache/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 11:30:21 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1618</guid>
		<description><![CDATA[一、什么时候应用系统会从缓存中获取数据? 　　数据库从服务器上读取数据时，可以从硬盘的数据文件中获取数据，也可以从数据库缓存中读取数据。现在数据库管理员需要搞清楚的是，在什... ]]></description>
			<content:encoded><![CDATA[<p>一、什么时候应用系统会从缓存中获取数据?</p>
<p>　　数据库从服务器上读取数据时，可以从硬盘的数据文件中获取数据，也可以从数据库缓存中读取数据。现在数据库管理员需要搞清楚的是，在什么样的情况下，系统是从缓存中读取数据，而不是从硬盘的数据文件中读取数据?</p>
<p>　　简单的说，数据缓存就是内存中的一块存储区域，其存储了用户的SQL文本以及相关的查询结果。通常情况下，用户下次查询时，如果所使用的SQL文本是相同的，并且自从上次查询后，相关的纪录没有被更新过，此时数据库就直接采用缓存中的内容。从这个原则中，可以看到如果要直接使用缓存中的数据，至少要满足以下几个条件。</p>
<p>　　一是所采用的SQL文本是相同的。当前后两次用户使用了相同的SQL语句(假设不考虑其他条件)，则服务器会从缓存中读取结果，而不需要再去解析和执行SQL语句。这里需要注意的是，这里的SQL文本必须一次不差的完全相同。如果前后两次查询，使用了不同的查询条件。如第一次查询时没有输入Where条件语句。后来发现数据量过多，利用了Where条件了过滤查询的结果。此时即使最后的查询结果是相同的，系统仍然是从数据文件中获取数据，而不是从数据缓存中。再如，Select后面所使用的字段名称也必须是相同的。如果有一个字段名称不同或者前后两次查询所使用的字段数量不同，则系统都会认为是不同的SQL语句，而重新解析并查询。</p>
<p>　　二是从数据缓存的角度考虑，大小写是不敏感的。如前后两次查询时，采用的字段名称可能只有大小写的差异。如第一次使用的是大小，第二次使用的是小写，这系统认为仍然是相同的SQL语句。或者说关键字大小写等等这都是不敏感的。</p>
<p>　　三是要满足二次查询之间，数据记录包括表结构都没有被更改过。如果记录所在的标更改了，如增加了一个字段等等，此时使用这个表的所有缓冲数据系统将自动清空。这里需要注意，这里指的更改是一个广义的更改，包括表中任何数据或者结果的改变。举一个简单的例子，第一次查询时用户需要查询2010年的出货数据。查询后有用户在这个表中插入了一条2011年1月份的出货信息。然后又有用户需要查询2010年的出货信息。使用的SQL语句与第一次查询时完全相同。在这种情况下，数据库系统会使用缓存中的数据吗?答案是否定的。因为当中间用户插入一条记录时，系统会自动清空跟这个表相关的所有缓存记录。当第二次查询时，缓存中已经没有这张表对应的缓存信息。此时就需要重新解析并查询。</p>
<p>　　四是需要注意，默认字符集对缓存命中率的影响。通常情况下，如果客户端与服务器之间所采用的默认字符集不同，则即使查询语句相同、在两次查询之间记录与表结构也没有被更改，系统仍然认为是不同的查询。对于这一点需要特别的注意，大家比较容易忽视。</p>
<p>　　二、提高缓存命中率的建议。</p>
<p>　　从上面的条件分析中可以看出，利用缓存中的数据具有比较严格的条件。其实这些条件也是合情合理的。主要是为了保障数据的一致性。对以上这些条件有深入的认识之后，现在数据库管理员需要考虑的是，如何来提高这个缓存的命中率?对此笔者有如下几个建议。</p>
<p>　　一是在配置时，客户端与服务器端要使用相同的字符集。如果客户端(或者说第三方工具)与服务器端使用的字符集不同，那么任何情况下都不会使用缓存功能。特别在国内，需要用到中文的字符集。此时特别需要注意，客户端默认字符集要与服务器端的默认字符集相同。注意，这里是相同，而不是兼容。有时候即使采用了不同的字符集，客户端上仍然可以正常显示。这主要是因为有些字符集虽然不相同，但是是相互兼容的。在缓存管理上，需要相同，光兼容还不行。</p>
<p>　　二是在客户端上，要固化查询的语句。如现在有财务人员和采购人员同时从系统中查询11月份的出货数据。显然他们岗位职责不同，所需要字段的内容是不同的。此时在客户端出，可以允许用户设置自己所需要的表单格式。但是笔者建议，后台所采用的SQL语句最好是相同的。这里数据会经过三个渠道：后台数据库、客户端、用户。笔者的意识时，后台数据库与客户端之间的交互采用相同的SQL语句。然后客户端与用户之间进行交互时，根据用户定义的格式(包括字段前后的排列、不包括查询条件语句的差异)向用户显示数据。此时由于采用了相同的SQL语句(只是用户对于显示格式的要求不同)，从而可以提高应用系统的查询效率。</p>
<p>　　三是提高内存中缓存的配置，来提高命中率。一般在服务器启动时，操作系统会跟数据库软件协商缓存空间的大小。当缓存工作不足时，缓存中最旧的缓存记录会被最新的消息所覆盖。可见，如果能够提高缓存空间，就可以提高命中率。这就好像打靶，目标多了，命中的几率也会高许多。不过用户的并发数越多，这个设置的效果会越不明显。</p>
<p>　　四是通过分区表可以提高缓存的命中率。在上面的条件分析中，大家可以看到，只要所查询的表中插入了一条记录，系统就会清空缓存记录。现在以查询出货记录为例。出货记录表每天都在更新，而用户在年初时，会经常需要查询上一年的出货记录。此时由于这个表中的数据每个小时都在更新，那么缓存中的信息会不断的被情况。此时缓存的命中率显然不会很高。针对这种情况，笔者建议可以采用分区表。如可以通过系统设置，将2010年的出货记录单独存放在一个出货的分区表中。即每一个年度都使用一张单独的分区表。此时2011年的纪录，就不会影响到2010年的分区表。此时如果用户重复查询2010年的出货信息，只要其使用的SQL语句相同(没有采用不同的查询条件)，那么就可以享受缓存机制所带来的效益，提高应用系统的查询效果。。</p>
<p>　　三、多个应用对缓存的影响。</p>
<p>　　通常情况下，MySQL数据库的缓存是根据服务器内存的大小自动分配的。如果一台服务器上只有一个MySQL应用，那么固然最好。不过在实际工作中，为了降低信息化投资的成本，往往会在同一台服务器上布置多个信息化应用。由于其他信息化应用也需要使用内存的空间作为缓存，那么MySQL数据库中缓存空间就可能变小。如果遇到这种情况下，数据库管理员需要跟系统工程师进行协商，为各种不同的应用根据性能要求的不同，手工设置不同的缓存空间。如此的话，就可以避免同一台服务器上不同信息化应用对缓存的冲突。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1618/rational-distribution-of-mysql-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP获文件扩展名的三种方法</title>
		<link>http://pzg.me/web/1614/php-by-the-three-methods-of-file-extensions/</link>
		<comments>http://pzg.me/web/1614/php-by-the-three-methods-of-file-extensions/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 15:56:25 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1614</guid>
		<description><![CDATA[方法一： &#60;?php function extend_1($file_name) { $retval=""; $pt=strrpos($file_name, "."); if ($pt) $retval=substr($file_name, $pt+1, strlen($file_name) - $pt); return ($retval); } ?&#62; 方法二： function extend_2($file_name) { $extend = pathi... ]]></description>
			<content:encoded><![CDATA[<p>方法一：</p>
<p>&lt;?php<br />
function extend_1($file_name)<br />
{<br />
$retval="";<br />
$pt=strrpos($file_name, ".");<br />
if ($pt) $retval=substr($file_name, $pt+1, strlen($file_name) - $pt);<br />
return ($retval);<br />
}<br />
?&gt;<br />
方法二：</p>
<p>function extend_2($file_name)<br />
{<br />
$extend = pathinfo($file_name);<br />
$extend = strtolower($extend["extension"]);<br />
return $extend;<br />
} <br />
方法三：</p>
<p>function extend_3($file_name)<br />
{<br />
$extend =explode("." , $file_name);<br />
$va=count($extend)-1;<br />
return $extend[$va];<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1614/php-by-the-three-methods-of-file-extensions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>百度在线输入法API</title>
		<link>http://pzg.me/web/1579/baidu-online-input-method-api/</link>
		<comments>http://pzg.me/web/1579/baidu-online-input-method-api/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 08:02:08 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1579</guid>
		<description><![CDATA[将以下代码加入到您的网页中，放置在&#60;/body&#62;标签前，即可使用百度在线拼音输入法。 简单方式： &#60;script type="text/javascript" src="http://www.baidu.com/olime/bdime_open.js"&#62;&#60;/script&#62; 说明：采... ]]></description>
			<content:encoded><![CDATA[<p>将以下代码加入到您的网页中，放置在&lt;/body&gt;标签前，即可使用百度在线拼音输入法。</p>
<p>简单方式：</p>
<p>&lt;script type="text/javascript" src="http://www.baidu.com/olime/bdime_open.js"&gt;&lt;/script&gt;</p>
<p>说明：采用简单方式的接口使用百度在线输入法时，所有设置将使用默认状态，如需要自定义各设置项，请使用高级方式。</p>
<p>高级方式：</p>
<p>&lt;script type="text/javascript"&gt;</p>
<p>var bdime_option = {<br />
    ch : true,<br />
    bc : true,<br />
    pt : true,<br />
    on : true,<br />
    domain : "",<br />
    username : "",<br />
    targets : []<br />
}</p>
<p>&lt;/script&gt;</p>
<p>&lt;script type="text/javascript" src="http://www.baidu.com/olime/bdime_open.js"&gt;&lt;/script&gt;</p>
<p>参数说明：</p>
<p>    ch</p>
<p>        中/英文开关，true表示中文、false表示英文，可缺省，默认中文；</p>
<p>    bc</p>
<p>        全/半角开关，true表示半角、false表示全角，可缺省，默认半角；</p>
<p>    pt</p>
<p>        中/英文标点开关，true表示中文标点、false表示英文标点，可缺省，默认中文标点；</p>
<p>    on</p>
<p>        休眠开关，true表示开启、false表示休眠，可缺省，默认开启；</p>
<p>    domain</p>
<p>        cookie作用域（用于记录休眠、中/英文、全/半角、中/英文标点开关的状态），可缺省，默认不记录状态，cookie对应的key是bdime；</p>
<p>    username</p>
<p>        百度账号，可缺省，无默认值；</p>
<p>        用户词库接口，指定相同的值将获得相同的用户词库用于存放用户自造词。站长也可以通过制定此值使得网站上所有用户获得相同的用户词库。（未开放）</p>
<p>    targets</p>
<p>        指定哪些输入框可以使用百度在线拼音输入法（输入框对象或id，多个输入框以","分隔），可缺省，默认自动识别页面中的输入框；</p>
<p>其他接口：</p>
<p>    bdime.close()</p>
<p>        当百度在线拼音输入法加载并初始化成功之后，可通过此方法关闭百度在线拼音输入法；</p>
<p>    bdime.open()</p>
<p>        当百度在线拼音输入法处于休眠状态或通过bdime.close()关闭之后，可通过此方法重新开启百度在线拼音输入法；</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1579/baidu-online-input-method-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>给wordpress添加最新、热评、随机日志</title>
		<link>http://pzg.me/web/1578/to-add-the-latest-wordpress-lively-random-log/</link>
		<comments>http://pzg.me/web/1578/to-add-the-latest-wordpress-lively-random-log/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 22:51:05 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1578</guid>
		<description><![CDATA[首先把以下函数放在 WordPress 主题文件夹里的 functions.php 中： function filter_where($where = '') { $where .= " AND post_date &#62; '" . date('Y-m-d', strtotime('-30 days')) . "'"; return $where; } function some_posts($orderby = '', $pl... ]]></description>
			<content:encoded><![CDATA[<p>首先把以下函数放在 WordPress 主题文件夹里的 functions.php 中：</p>
<p>function filter_where($where = '') {<br />
$where .= " AND post_date &gt; '" . date('Y-m-d', strtotime('-30 days')) . "'";<br />
return $where;<br />
}<br />
function some_posts($orderby = '', $plusmsg = '',$limit = 10) {<br />
add_filter('posts_where', 'filter_where');<br />
$some_posts = query_posts('posts_per_page='.$limit.'&amp;caller_get_posts=1&amp;orderby='.$orderby);<br />
foreach ($some_posts as $some_post) {<br />
$output = '';<br />
$post_date = mysql2date('y年m月d日', $some_post-&gt;post_date);<br />
$commentcount = '('.$some_post-&gt;comment_count.' 条评论)';<br />
$post_title = htmlspecialchars(stripslashes($some_post-&gt;post_title));<br />
$permalink = get_permalink($some_post-&gt;ID);<br />
$output .= '</p>
<li>' . $post_title . ''.$$plusmsg.'</li>
<p>';<br />
echo $output;<br />
}<br />
wp_reset_query();<br />
}<br />
可以看到第二行中的 30 就是指最近 30 天，也可以根据你自己的需要修改这个时间。至于调用则和升级版之前的一样，下面只是比上次多加了一个 $limit 参数：</p>
<p>&lt; ?php<br />
//最新日志<br />
some_posts( $orderby = 'date', $plusmsg = 'post_date', 10 );<br />
//热评日志<br />
some_posts( $orderby = 'comment_count', $plusmsg = 'commentcount', 10 );<br />
//随机日志<br />
some_posts( $orderby = 'rand', $plusmsg = 'post_date', 10 );<br />
?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1578/to-add-the-latest-wordpress-lively-random-log/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>nginx下wp-super的rewrite规则</title>
		<link>http://pzg.me/web/1571/the-following-wp-super-nginx-rewrite-rules/</link>
		<comments>http://pzg.me/web/1571/the-following-wp-super-nginx-rewrite-rules/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 05:40:47 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[rewrite]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1571</guid>
		<description><![CDATA[location / { # if the requested file exists, return it immediately                if (-f $request_filename) {                        break;                }                set $supercache_fi... ]]></description>
			<content:encoded><![CDATA[<p>location / {<br />
# if the requested file exists, return it immediately<br />
               if (-f $request_filename) {<br />
                       break;<br />
               }<br />
               set $supercache_file '';<br />
               set $supercache_uri $request_uri;<br />
               if ($request_method = POST) {<br />
                       set $supercache_uri '';<br />
               }<br />
# Using pretty permalinks, so bypass the cache for any query string<br />
               if ($query_string) {<br />
                       set $supercache_uri '';<br />
               }<br />
               if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {<br />
                       set $supercache_uri '';<br />
               }<br />
# if we haven't bypassed the cache, specify our supercache file<br />
               if ($supercache_uri ~ ^(.+)$) {<br />
                       set $supercache_file /wp-content/cache/supercache/$http_host/</p>
<p>$1index.html;<br />
               }<br />
# only rewrite to the supercache file if it actually exists<br />
               if (-f $document_root$supercache_file) {<br />
                       rewrite ^(.*)$ $supercache_file break;<br />
               }<br />
# all other requests go to WordPress<br />
               if (!-e $request_filename) {<br />
                       rewrite . /index.php last;<br />
               }</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1571/the-following-wp-super-nginx-rewrite-rules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql左连接sql语句详解</title>
		<link>http://pzg.me/web/1569/detailed-statement-mysql-sql-left-join/</link>
		<comments>http://pzg.me/web/1569/detailed-statement-mysql-sql-left-join/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 17:52:01 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1569</guid>
		<description><![CDATA[MySQL左连接查询是联合查询中的一种方式，就是说把两个相关的表通过这种方式联合在一起查询，从而更加方便调用数据，避免多层循环嵌套。 左连接查询所用关键字 left join ，书面解释如下：... ]]></description>
			<content:encoded><![CDATA[<p>MySQL左连接查询是联合查询中的一种方式，就是说把两个相关的表通过这种方式联合在一起查询，从而更加方便调用数据，避免多层循环嵌套。</p>
<p>左连接查询所用关键字 left join<br />
，书面解释如下：</p>
<p>左外连接（左连接）：结果集既包括连接表的匹配行，也包括左连接表的所有行。<br />
下面我解释一下，也就是说左链接查询的返回结果既包含了left join关键字左边表的全部资料，同时也包含了与左表匹配的右表中的符合条件的资源。 简单的说就是以左表为中心，连带右表中的符合条件的资源。</p>
<p>Sql语句的写法：</p>
<p>SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c</p>
<p>相信大家看完之后一定很晕把，没关系，我解释一下大家就都明白了，看似复杂，其实条理很清楚。它的意思是：</p>
<p>一<br />
select a.a , a.b<br />
中<br />
a.a 就是a表中的a字段的意思。</p>
<p>二<br />
Select与from之间放的就是a表 b表中的相关要查询的字段。</p>
<p>三<br />
from a LEFT OUT JOIN b<br />
就是 从以a表为主左链接上右表b ,<br />
匹配条件是 a表的a字段等于b表的c字段。 </p>
<p>通过这几点解释相信大家也都明白百分之八十了，下面我们通过实例的演示再给大家说一下： </p>
<p>首先建立两个表 </p>
<p>表pic<br />
用于存放图片名字的表</p>
<p>CREATE TABLE `image`.`pic` ( </p>
<p>`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,<br />
`pname` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL </p>
<p>) ENGINE = InnoDB </p>
<p>表二  用于存放图片评论的 </p>
<p>CREATE TABLE `image`.`comment` ( </p>
<p>`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,<br />
`pid` INT( 10 ) NOT NULL ,<br />
`content` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL </p>
<p>) ENGINE = InnoDB </p>
<p>下面我要联合查询这两个表通过一条sql语句，注意以前咱们查询两个表肯定是先写一个表的sql然后在根据条件循环查询另一个表，现在不用了，通过这种查询，把返回结果放到一个数组中，</p>
<p>Sql语句写法：select<br />
pic.*,comment.*<br />
from<br />
pic left join comment<br />
on<br />
pic.id=comment.pid</p>
<p>代码如下：<br />
$conn = mysql_connect("localhost","root","");<br />
if(!$conn){<br />
die('连接MySQL数据库失败: ' . mysql_error());<br />
}</p>
<p>mysql_select_db('image');</p>
<p>$sql="select<br />
pic.*,comment.*<br />
from<br />
pic left join comment<br />
on<br />
pic.id=comment.pid";<br />
$re=mysql_query($sql);<br />
while($re1=mysql_fetch_array($re))<br />
{<br />
$arr[]=$re1;<br />
}<br />
print_r($arr); </p>
<p>打印结果如下：</p>
<p>Array<br />
(<br />
[0] => Array<br />
(<br />
[0] => 1<br />
[id] => 1<br />
[1] => aaaaaaaaa<br />
[pname] => aaaaaaaaa<br />
[2] => 1<br />
[3] => 1<br />
[pid] => 1<br />
[4] => ccccccc<br />
[content] => ccccccc<br />
)<br />
[1] => Array<br />
(<br />
[0] => 2<br />
[id] => 2<br />
[1] => bbbbbbbbbbb<br />
[pname] => bbbbbbbbbbb<br />
[2] => 2<br />
[3] => 2<br />
[pid] => 2<br />
[4] => vvvvvvv<br />
[content] => vvvvvvv<br />
)<br />
)<br />
Ok</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1569/detailed-statement-mysql-sql-left-join/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP生成word文档类</title>
		<link>http://pzg.me/web/1567/php-generated-word-document-class/</link>
		<comments>http://pzg.me/web/1567/php-generated-word-document-class/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 14:09:37 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[word]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1567</guid>
		<description><![CDATA[&#60;?php class word { function start() { ob_start(); print'&#60;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"&#62;'; } function save($path) { print "&#60;/h... ]]></description>
			<content:encoded><![CDATA[<p>&lt;?php<br />
class word<br />
{<br />
function start()<br />
{<br />
ob_start();<br />
print'&lt;html xmlns:o="urn:schemas-microsoft-com:office:office"<br />
xmlns:w="urn:schemas-microsoft-com:office:word"<br />
xmlns="http://www.w3.org/TR/REC-html40"&gt;';<br />
}<br />
function save($path)<br />
{<br />
print "&lt;/html&gt;";<br />
$data = ob_get_contents();<br />
ob_end_clean();<br />
$this-&gt;wirtefile ($path,$data);<br />
}<br />
function wirtefile ($fn,$data)<br />
{<br />
$fp=fopen($fn,"wb");<br />
fwrite($fp,$data);<br />
fclose($fp);<br />
}<br />
}<br />
?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1567/php-generated-word-document-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP写的小型数据库</title>
		<link>http://pzg.me/web/1564/small-database-written-in-php/</link>
		<comments>http://pzg.me/web/1564/small-database-written-in-php/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 08:10:04 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1564</guid>
		<description><![CDATA[插入数据 include 'pdbm.php'; $timestart = explode(' ', microtime()); $timestart = $timestart[0] + $timestart[1]; $pdbm = new Pdbm('test'); $pdbm-&#62;open(PDBM_CREAT &#124; PDBM_REWD); for ($i = 0; $i &#60; 100000; $i++) {     $pdbm-&#62;insert("k... ]]></description>
			<content:encoded><![CDATA[<p>插入数据</p>
<p>include 'pdbm.php';</p>
<p>$timestart = explode(' ', microtime());<br />
$timestart = $timestart[0] + $timestart[1];</p>
<p>$pdbm = new Pdbm('test');<br />
$pdbm-&gt;open(PDBM_CREAT | PDBM_REWD);</p>
<p>for ($i = 0; $i &lt; 100000; $i++) {<br />
    $pdbm-&gt;insert("key{$i}", "value{$i}");<br />
}</p>
<p>$timetime = explode(' ', microtime());<br />
$timetime = $timetime[0] + $timetime[1];</p>
<p>echo $timetime - $timestart;<br />
//*/</p>
<p>获取数据</p>
<p>include 'pdbm.php';</p>
<p>$timestart = explode(' ', microtime());<br />
$timestart = $timestart[0] + $timestart[1];</p>
<p>$pdbm = new Pdbm('test');<br />
$pdbm-&gt;open(PDBM_REWD);</p>
<p>$val = $pdbm-&gt;fetch('key9999');<br />
if ($val == NULL) {<br />
    echo 'Not found&lt;/br&gt;';<br />
} else {<br />
    echo $val."&lt;br/&gt;";<br />
}</p>
<p>//$pdbm-&gt;delete('key100'); //delete data</p>
<p>$val = $pdbm-&gt;fetch('key100');<br />
if ($val == NULL) {<br />
    echo 'Not found&lt;/br&gt;';<br />
} else {<br />
    echo $val."&lt;br/&gt;";<br />
}</p>
<p>$timetime = explode(' ', microtime());<br />
$timetime = $timetime[0] + $timetime[1];</p>
<p>echo $timetime - $timestart;<br />
//*/</p>
<p><span id="more-1564"></span></p>
<p>'pdbm.php'</p>
<p>&lt;?php<br />
/*  This file is part of PDBM, the GNU data base manager, by Philip A. Nelson.<br />
    Copyright (C) 2010, 2011  Free Software Foundation, Inc.</p>
<p>    PDBM is free software; you can redistribute it and/or modify<br />
    it under the terms of the GNU General Public License as published by<br />
    the Free Software Foundation; either version 2, or (at your option)<br />
    any later version.</p>
<p>    PDBM is distributed in the hope that it will be useful,<br />
    but WITHOUT ANY WARRANTY; without even the implied warranty of<br />
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br />
    GNU General Public License for more details.</p>
<p>    You may contact the author by:<br />
       e-mail: <a href="mailto:280259971@qq.com">280259971@qq.com</a><br />
    author: liexusong<br />
*************************************************************************/</p>
<p>function int_pack($int) {<br />
 return pack("I", $int);<br />
}</p>
<p>function int_unpack($bin) {<br />
 $ret = unpack("I", $bin);<br />
 return $ret[1];<br />
}</p>
<p>function zero_block() {<br />
 return pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0).<br />
     pack("I", 0);<br />
}</p>
<p>define('PDBM_READ',  1);<br />
define('PDBM_WRITE', 2);<br />
define('PDBM_REWD',  3);</p>
<p>define('PDBM_CREAT', 4);</p>
<p>define('PDBM_HASHBUCKET_SIZE', 10240);<br />
define('PDBM_BLOCK_SIZE', 80);</p>
<p>class IndexHead {<br />
 var $keyLength;<br />
 var $key;<br />
 var $indexNext;<br />
 var $dataOffset;<br />
 var $dataLength;<br />
}</p>
<p>class Pdbm {<br />
 var $version;<br />
 var $dbname;<br />
 var $mode;<br />
 var $index_fp;<br />
 var $data_fp;<br />
 var $hash_bucket = array();<br />
 <br />
 function Pdbm($dbname) {<br />
  $this-&gt;dbname = $dbname;<br />
  $this-&gt;version = "1.0.0";<br />
  if (!function_exists('pack')) {<br />
   exit('"pack" function is not exists in your system');<br />
  }<br />
 }<br />
 <br />
 function _init() {<br />
  if (PDBM_CREAT &amp; $this-&gt;mode) {<br />
   for ($i = 0; $i &lt; PDBM_HASHBUCKET_SIZE; $i++) {<br />
    $this-&gt;hash_bucket[$i] = new IndexHead();<br />
    $this-&gt;hash_bucket[$i]-&gt;keyLength = 0;<br />
    $this-&gt;hash_bucket[$i]-&gt;key = NULL;<br />
    $this-&gt;hash_bucket[$i]-&gt;indexNext = 0;<br />
    $this-&gt;hash_bucket[$i]-&gt;dataOffset = 0;<br />
    $this-&gt;hash_bucket[$i]-&gt;dataLength = 0;<br />
    <br />
    fwrite($this-&gt;index_fp, zero_block(), PDBM_BLOCK_SIZE);<br />
   }<br />
   fflush($this-&gt;index_fp);/* write data into the index file */<br />
  } else {<br />
   for ($i = 0; $i &lt; PDBM_HASHBUCKET_SIZE; $i++) {<br />
    $buf = fread($this-&gt;index_fp, PDBM_BLOCK_SIZE);<br />
    <br />
    $this-&gt;hash_bucket[$i] = new IndexHead();<br />
    $this-&gt;hash_bucket[$i]-&gt;keyLength = int_unpack(substr($buf, 0, 4));<br />
    $this-&gt;hash_bucket[$i]-&gt;key = substr($buf, 4, 64);<br />
    $this-&gt;hash_bucket[$i]-&gt;indexNext = int_unpack(substr($buf, 68, 4));<br />
    $this-&gt;hash_bucket[$i]-&gt;dataOffset = int_unpack(substr($buf, 72, 4));<br />
    $this-&gt;hash_bucket[$i]-&gt;dataLength = int_unpack(substr($buf, 76, 4));<br />
   }<br />
  }<br />
 }<br />
 <br />
 function open($flags) {<br />
  $this-&gt;mode = $flags;<br />
  $dbname = $this-&gt;dbname;<br />
  <br />
  if (PDBM_CREAT &amp; $this-&gt;mode) {<br />
   if (PDBM_READ &amp; $this-&gt;mode) {<br />
    $this-&gt;index_fp = fopen("{$dbname}.ind", "wb+");<br />
    $this-&gt;data_fp  = fopen("{$dbname}.dat", "wb+");<br />
   } else {<br />
    $this-&gt;index_fp = fopen("{$dbname}.ind", "wb");<br />
    $this-&gt;data_fp  = fopen("{$dbname}.dat", "wb");<br />
   }<br />
  } else if (PDBM_REWD &amp; $this-&gt;mode) {<br />
   $this-&gt;index_fp = fopen("{$dbname}.ind", "rb+");<br />
   $this-&gt;data_fp  = fopen("{$dbname}.dat", "ab+");<br />
  } else if (PDBM_WRITE &amp; $this-&gt;mode) {<br />
   $this-&gt;index_fp = fopen("{$dbname}.ind", "ab");<br />
   $this-&gt;data_fp  = fopen("{$dbname}.dat", "ab");<br />
  } else {<br />
   $this-&gt;index_fp = fopen("{$dbname}.ind", "rb");<br />
   $this-&gt;data_fp  = fopen("{$dbname}.dat", "rb");<br />
  }<br />
  <br />
  $this-&gt;_init();<br />
  <br />
  if (!$this-&gt;index_fd &amp;&amp; !$this-&gt;data_fp) {<br />
   return true;<br />
  } else {<br />
   return false;<br />
  }<br />
 }<br />
 <br />
 function insert($key, $val) {<br />
  $index = $this-&gt;hash($key);<br />
  <br />
  $ioffset = fstat($this-&gt;index_fp);<br />
  $ioffset = intval($ioffset['size']);<br />
  <br />
  $doffset = fstat($this-&gt;data_fp);<br />
  $doffset = intval($doffset['size']);<br />
  <br />
  $keylen  = strlen($key);<br />
  $datalen = strlen($val);<br />
  <br />
  if ($keylen == 0 || $keylen &gt; 64) return false;<br />
  if ($datalen == 0) return false;<br />
  <br />
  $bucket = $this-&gt;hash_bucket[$index];<br />
  if ($bucket-&gt;keyLength == 0) {<br />
   $this-&gt;hash_bucket[$index]-&gt;keyLength = $keylen;<br />
   $this-&gt;hash_bucket[$index]-&gt;key = $key;<br />
   $this-&gt;hash_bucket[$index]-&gt;indexNext = 0;<br />
   $this-&gt;hash_bucket[$index]-&gt;dataOffset = $doffset;<br />
   $this-&gt;hash_bucket[$index]-&gt;dataLength = $datalen;<br />
   <br />
   $bucketoffset = PDBM_BLOCK_SIZE * $index;<br />
   fseek($this-&gt;index_fp, $bucketoffset, SEEK_SET);<br />
   <br />
   /* write data into index file */<br />
   fwrite($this-&gt;index_fp, int_pack($this-&gt;hash_bucket[$index]-&gt;keyLength), 4);<br />
   fwrite($this-&gt;index_fp, $this-&gt;hash_bucket[$index]-&gt;key, $this-&gt;hash_bucket[$index]-&gt;keyLength);<br />
   fseek($this-&gt;index_fp, 64 - $this-&gt;hash_bucket[$index]-&gt;keyLength, SEEK_CUR);<br />
   fwrite($this-&gt;index_fp, int_pack($this-&gt;hash_bucket[$index]-&gt;indexNext), 4);<br />
   fwrite($this-&gt;index_fp, int_pack($this-&gt;hash_bucket[$index]-&gt;dataOffset), 4);<br />
   fwrite($this-&gt;index_fp, int_pack($this-&gt;hash_bucket[$index]-&gt;dataLength), 4);<br />
   fflush($this-&gt;index_fp);<br />
   <br />
   //echo $this-&gt;hash_bucket[$index]-&gt;key;<br />
   <br />
   /* write data into data file */<br />
   fwrite($this-&gt;data_fp, $val, $datalen);<br />
   fflush($this-&gt;data_fp);<br />
   <br />
  } else {<br />
   <br />
   if ($bucket-&gt;indexNext == 0) {<br />
    fseek($this-&gt;index_fp, PDBM_BLOCK_SIZE * $index, SEEK_SET);<br />
    fseek($this-&gt;index_fp, 68, SEEK_CUR);<br />
    fwrite($this-&gt;index_fp, int_pack($ioffset), 4);<br />
   } else {<br />
    $nextbucket = new IndexHead();<br />
    while ($bucket-&gt;indexNext != 0) {<br />
     fseek($this-&gt;index_fp, $bucket-&gt;indexNext, SEEK_SET);<br />
     $buf = fread($this-&gt;index_fp, PDBM_BLOCK_SIZE);<br />
     <br />
     //$nextbucket-&gt;keyLength = int_unpack(substr($buf, 0, 4));<br />
     //$nextbucket-&gt;key = substr($buf, 4, 64);<br />
     $nextbucket-&gt;indexNext = int_unpack(substr($buf, 68, 4));<br />
     //$nextbucket-&gt;dataOffset = int_unpack(substr($buf, 72, 4));<br />
     //$nextbucket-&gt;dataLength = int_unpack(substr($buf, 76, 4));<br />
     <br />
     $bucket = $nextbucket;<br />
    }<br />
    <br />
    fseek($this-&gt;index_fp, 12, SEEK_CUR);<br />
    fwrite($this-&gt;index_fp, int_pack($ioffset), 4);<br />
   }<br />
   <br />
   fseek($this-&gt;index_fp, $ioffset, SEEK_SET);<br />
   fwrite($this-&gt;index_fp, int_pack($keylen), 4);<br />
   fwrite($this-&gt;index_fp, $key, $keylen);<br />
   fseek($this-&gt;index_fp, 64 - $keylen, SEEK_CUR);<br />
   fwrite($this-&gt;index_fp, int_pack(0), 4);<br />
   fwrite($this-&gt;index_fp, int_pack($doffset), 4);<br />
   fwrite($this-&gt;index_fp, int_pack($datalen), 4);<br />
   fflush($this-&gt;index_fp);<br />
   <br />
   fwrite($this-&gt;data_fp, $val, $datalen);<br />
   fflush($this-&gt;data_fp);<br />
  }<br />
  <br />
  return true;<br />
 }<br />
 <br />
 function fetch($key) {<br />
  $index = $this-&gt;hash($key);<br />
  <br />
  $bucket = $this-&gt;hash_bucket[$index];<br />
  if ($bucket-&gt;keyLength == 0 &amp;&amp; $bucket-&gt;indexNext == 0) {<br />
   return NULL;<br />
  }<br />
  <br />
  $nextbucket = new IndexHead();<br />
  while ($bucket-&gt;indexNext != 0) {<br />
   if ($bucket-&gt;keyLength == 0 || strncmp($bucket-&gt;key, $key, $bucket-&gt;keyLength) != 0) {<br />
    fseek($this-&gt;index_fp, $bucket-&gt;indexNext, SEEK_SET);<br />
    $buf = fread($this-&gt;index_fp, PDBM_BLOCK_SIZE);<br />
    <br />
    $nextbucket-&gt;keyLength = int_unpack(substr($buf, 0, 4));<br />
    $nextbucket-&gt;key = substr($buf, 4, 64);<br />
    $nextbucket-&gt;indexNext = int_unpack(substr($buf, 68, 4));<br />
    $nextbucket-&gt;dataOffset = int_unpack(substr($buf, 72, 4));<br />
    $nextbucket-&gt;dataLength = int_unpack(substr($buf, 76, 4));<br />
    <br />
    $bucket = $nextbucket;<br />
   } else {<br />
    break;<br />
   }<br />
  }<br />
  <br />
  if ($bucket-&gt;keyLength == 0) {<br />
   return NULL;<br />
  } else {<br />
   if (strncmp($key, $bucket-&gt;key, $bucket-&gt;keyLength) == 0) {<br />
    fseek($this-&gt;data_fp, $bucket-&gt;dataOffset, SEEK_SET);<br />
    $ret = fread($this-&gt;data_fp, $bucket-&gt;dataLength);<br />
   } else {<br />
    $ret = NULL;<br />
   }<br />
   <br />
   return $ret;<br />
  }<br />
 }<br />
 <br />
 function delete($key) {<br />
  $index = $this-&gt;hash($key);<br />
  <br />
  $bucket = $this-&gt;hash_bucket[$index];<br />
  if ($bucket-&gt;keyLength == 0 &amp;&amp; $bucket-&gt;indexNext == 0) {<br />
   return NULL;<br />
  }<br />
  <br />
  if ($bucket-&gt;keyLength &gt; 0 &amp;&amp; strncmp($bucket-&gt;key, $key, $bucket-&gt;keyLength) == 0) {<br />
   fseek($this-&gt;index_fp, PDBM_BLOCK_SIZE * $index, SEEK_SET);<br />
   fwrite($this-&gt;index_fp, int_pack(0), 4);<br />
   fflush($this-&gt;index_fp);<br />
   return true;<br />
  }<br />
  <br />
  $nextbucket = new IndexHead();<br />
  while ($bucket-&gt;indexNext != 0) {<br />
   if ($bucket-&gt;keyLength == 0 || strncmp($bucket-&gt;key, $key, $bucket-&gt;keyLength) != 0) {<br />
    fseek($this-&gt;index_fp, $bucket-&gt;indexNext, SEEK_SET);<br />
    $buf = fread($this-&gt;index_fp, PDBM_BLOCK_SIZE);<br />
    <br />
    $nextbucket-&gt;keyLength = int_unpack(substr($buf, 0, 4));<br />
    $nextbucket-&gt;key = substr($buf, 4, 64);<br />
    $nextbucket-&gt;indexNext = int_unpack(substr($buf, 68, 4));<br />
    $nextbucket-&gt;dataOffset = int_unpack(substr($buf, 72, 4));<br />
    $nextbucket-&gt;dataLength = int_unpack(substr($buf, 76, 4));<br />
    <br />
    $bucket = $nextbucket;<br />
   } else {<br />
    break;<br />
   }<br />
  }<br />
  <br />
  if ($bucket-&gt;keyLength == 0) {<br />
   return false;<br />
  } else {<br />
   if (strncmp($key, $bucket-&gt;key, $bucket-&gt;keyLength) == 0) {<br />
    fseek($this-&gt;index_fp, -(PDBM_BLOCK_SIZE), SEEK_CUR);<br />
    fwrite($this-&gt;index_fp, int_pack(0), 4);<br />
    $ret = true;<br />
   } else {<br />
    $ret = false;<br />
   }<br />
   <br />
   fflush($this-&gt;index_fp);<br />
   return $ret;<br />
  }<br />
 }<br />
 <br />
 function hash($key) {<br />
  $seed = 131;<br />
  $hash = 0;<br />
  $i = 0;<br />
  <br />
  while (isset($key{$i})) {<br />
   $hash = $hash * $seed + ord($key{$i});<br />
   $i++;<br />
  }<br />
  return ($hash &amp; 0x7FFFFFFF) % PDBM_HASHBUCKET_SIZE;<br />
 }<br />
 <br />
 function isexists() {<br />
  if (file_exists($this-&gt;dbname.'.ind')) {<br />
   return true;<br />
  } else {<br />
   return false;<br />
  }<br />
 }<br />
 <br />
 function version() {<br />
  return $this-&gt;version;<br />
 }<br />
}<br />
?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1564/small-database-written-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress清理wp_postmeta全攻略</title>
		<link>http://pzg.me/web/1532/wordpress-clean-wp_postmeta-raiders/</link>
		<comments>http://pzg.me/web/1532/wordpress-clean-wp_postmeta-raiders/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 02:18:59 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp_postmeta]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1532</guid>
		<description><![CDATA[wp_postmeta 表 是存储文章附带信息的，除了一些特定时候里面的数据是没有用的我之前也写过数据清理文章简单的给出了两条语句并且有其他数据表的清理，详情参见wordpress数据库清理。 下面在... ]]></description>
			<content:encoded><![CDATA[<p><strong>wp_postmeta </strong>表 是存储文章附带信息的，除了一些特定时候里面的数据是没有用的我之前也写过数据清理文章简单的给出了两条语句并且有其他数据表的清理，详情参见<a title="wordpress数据库清理" href="http://pzg.me/web/779/wordpress-database-clean-up/">wordpress数据库清理</a>。</p>
<p>下面在给出几条语句让你的<strong>wp_postmeta</strong>干净到非常。</p>
<p>DELETE FROM wp_postmeta WHERE meta_key = '_edit_lock';<br />
DELETE FROM wp_postmeta WHERE meta_key = '_edit_last';</p>
<p>这是之前给出的两条语句测试安全删除无危险。</p>
<p>DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';<br />
DELETE FROM wp_postmeta WHERE meta_key = '_revision-control';<br />
DELETE FROM wp_postmeta WHERE meta_value = '{{unknown}}';</p>
<p>这是新尝试的三条语句，前两条危险性不大。最后一条不太清楚目前作用，但是删除后无任何异常。这五条语句执行完毕能够删除掉95%以上的数据，算的上是极限优化了，最后考虑到这个数据表并不是很重要，有洁净癖的人可以尝试清空这个表，当然我测试清空表会让一些原本的数据丢失。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1532/wordpress-clean-wp_postmeta-raiders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>修改WP Cleaner短标签语句</title>
		<link>http://pzg.me/web/1530/modify-the-label-statement-short-wp-cleaner/</link>
		<comments>http://pzg.me/web/1530/modify-the-label-statement-short-wp-cleaner/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 01:04:13 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1530</guid>
		<description><![CDATA[之前写过一篇这个插件的文章WP Cleaner 删除wordpress不再需要的修订版，但是自从某次升级以后变无法使用这款插件了，我一直以为是插件的问题，并且作者也发出了一个修正版本，但是情况依然... ]]></description>
			<content:encoded><![CDATA[<p>之前写过一篇这个插件的文章<a title="WP Cleaner 删除wordpress不再需要的修订版" href="http://pzg.me/web/280/wp-cleaner-no-longer-need-to-delete-a-revised-version-of/">WP Cleaner 删除wordpress不再需要的修订版</a>，但是自从某次升级以后变无法使用这款插件了，我一直以为是插件的问题，并且作者也发出了一个修正版本，但是情况依然没有改变，我还是无法使用。</p>
<p>这两天找了找其他的清理插件，效果没有这个理想还是想用这款插件，于是耐下心来看了看插件的代码，结果发现并不是大问题，因为我的空间不在支持短标签了，而插件是使用的短标签“&lt;? ”我只需要改成“&lt;?php ”即可了，粗略看了下代码使用了三次替换来处理这块。</p>
<p>第一，把代码里的“&lt;?=”替换为“&lt;?php echo ”<br />
第二，把“&lt;?”替换为“&lt;?php”<br />
第三，把“&lt;?phpphp”替换为“&lt;?php”</p>
<p>完成这三次替换保存代码即可在关闭短标签的状态下使用了。</p>
<p>插件官方地址：<a href="http://www.jiangmiao.org/blog/138.html">http://www.jiangmiao.org/blog/138.html</a></p>
<p>本站提供修改版下载地址：<a href="http://www.box.net/shared/sarkgk9ma2">http://www.box.net/shared/sarkgk9ma2</a></p>
<p>PS：其实这个只是代码写作习惯问题，建议插件作者也处理下这块，毕竟运行环境有时候不用用户能够操作的，而且一个良好的习惯也是有必要的。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1530/modify-the-label-statement-short-wp-cleaner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Akismet获取API KEY的方法</title>
		<link>http://pzg.me/web/1527/way-to-get-akismet-api-key/</link>
		<comments>http://pzg.me/web/1527/way-to-get-akismet-api-key/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 09:05:42 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[Akismet]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1527</guid>
		<description><![CDATA[详细步骤： 1，登录http://www.wordpress.com 2，在WordPress.com右上角找到 Sign Up Now。 3，填写基本信息，需要注意的，我都注明了： 4，到邮箱里点击链接验证，并更新个人信息。 Update Your Profile!是 更... ]]></description>
			<content:encoded><![CDATA[<p>详细步骤：</p>
<p>1，登录http://www.wordpress.com</p>
<p>2，在WordPress.com右上角找到 Sign Up Now。</p>
<p>3，填写基本信息，需要注意的，我都注明了：</p>
<p>4，到邮箱里点击链接验证，并更新个人信息。</p>
<p>Update Your Profile!是 更新个人信息 的意思。</p>
<p>这里有一个细节，可以体现WordPress.com的用户体验做的非常完美：如果一直没有收到验证的邮件，可以重新选择邮箱。</p>
<p>5，点击邮箱里的验证链接，出现 Your account is now active! 表示帐户已经验证成功。</p>
<p>6，登陆WordPress.com，登陆之后，http://www.wordpress.com首页左上角的用户状态已经变更：</p>
<p>7，点击 My Account下面的Global Dashboard进入后台，再点击 Profile，再点击 Were you looking for your API Key and other Personal Settings?。</p>
<p>8，在点开的页面里可以看到：Your WordPress.com API key is: xxxxxxxxx，这就是属于自己的Akismet的Api Key了。<br />
但要注意后面的一句话：Don't share your API key, it's like a password.中文意思是：这和密码一样重要，请勿分享给其他人使用。</p>
<p>9，到这里，就完成Akismet的Api Key的获取过程，以后各位可以自己获取了。</p>
<p>10，有任何问题，欢迎留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1527/way-to-get-akismet-api-key/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关闭wordpress的自动草稿</title>
		<link>http://pzg.me/web/1523/turn-off-the-automatic-draft-wordpress/</link>
		<comments>http://pzg.me/web/1523/turn-off-the-automatic-draft-wordpress/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 00:57:12 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1523</guid>
		<description><![CDATA[网上目前能找到两种方法： 1、找到wp-admin/includes/post.php里边的get_default_post_to_edit这个函数, $post = get_post( wp_insert_post( array( 'post_title' =&#62; __( 'Auto Draft' ), 'post_type' =&#62; $post_type, 'post_status' =&#62; '... ]]></description>
			<content:encoded><![CDATA[<p>网上目前能找到两种方法：</p>
<p>1、找到wp-admin/includes/post.php里边的get_default_post_to_edit这个函数,</p>
<p>$post = get_post( wp_insert_post( array( 'post_title' =&gt; __( 'Auto Draft' ), 'post_type' =&gt; $post_type, 'post_status' =&gt; 'auto-draft' ) ) );</p>
<p>把这一句修改成如下:</p>
<p>$post_auto_draft = $wpdb-&gt;get_row( "SELECT * FROM $wpdb-&gt;posts WHERE post_type = '$post_type' AND post_status = 'auto-draft' LIMIT 1" );<br />
if ( $post_auto_draft ) {<br />
$post = $post_auto_draft;<br />
} else {<br />
$post = get_post( wp_insert_post( array( 'post_title' =&gt; __( 'Auto Draft' ), 'post_type' =&gt; $post_type, 'post_status' =&gt; 'auto-draft' ) ) );<br />
}<br />
意思就是: 如果有自动保存的auto-draft就使用以前的auto-draft的ID来写文章,如果没有就插入一条auto-draft, 最后,数据库中总有一条auto-draft... 虽然数据库会多一条数据,但ID还是可以保持连续.</p>
<p>2、找到wp-admin\includes\post.php文件,在if ( $create_in_db ) {前面加上这句代码就可以了：</p>
<p>$create_in_db = false;</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1523/turn-off-the-automatic-draft-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>22个HTML5的初级技巧</title>
		<link>http://pzg.me/web/1501/22-primary-skills-html5/</link>
		<comments>http://pzg.me/web/1501/22-primary-skills-html5/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 05:24:48 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1501</guid>
		<description><![CDATA[1. 新的Doctype声明 XHTML的声明太长了，我相信很少会有前端开发人员能手写出这个Doctype声明。 &#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#62; ... ]]></description>
			<content:encoded><![CDATA[<p>1. 新的Doctype声明</p>
<p>XHTML的声明太长了，我相信很少会有前端开发人员能手写出这个Doctype声明。</p>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"<br />
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
 </p>
<p> <br />
HTML5的Doctype声明很短，看到这个声明相信你马上就能记住，不用浪费脑细胞去记那长的有点变态的XHTML的Doctype声明了。</p>
<p>&lt;!DOCTYPE html&gt;<br />
 <br />
HTML5的简短的DOCTYPE声明是让Firefox、Chrome等现代浏览器和IE6/7/8等浏览器都进入(准)标准模式，你可能会奇怪IE6/7居然也可以支持HTML5 Doctype，事实上，IE是只要doctype符合 这种格式，都会进入标准模式。</p>
<p>2. &lt;figure&gt;标签</p>
<p>看看下面一段简单的代码：</p>
<p>&lt;img alt="About image" src="path/to/image"&gt;<br />
&lt;h6&gt;image of Mars.&lt;/h6&gt;</p>
<p> <br />
遗憾的是，这里的h6标签和img标签好像没有什么关系，语义不够明确。HTML5意识到了这一点，于是就采用了&lt;figure&gt;标签。当&lt;figure&gt;结合&lt;figcaption&gt;标签的使用，可以让h6标签和img标签组合起来，代码就更具语义化了。</p>
<p>&lt;figure&gt;<br />
&lt;img alt="about image" src="path/to/image"&gt;<br />
&lt;figcaption&gt;<br />
&lt;h6&gt;This is an image of something interesting. &lt;/h6&gt;<br />
&lt;/figcaption&gt;<br />
&lt;/figure&gt;<br />
 <br />
3. 重新定义&lt;small&gt;</p>
<p>不久前，我使用了&lt;small&gt;标签来创建与logo相关的副标题。但是在HTML5中重新定义了&lt;small&gt;标签，使之更能表现语义化，在&lt;small&gt;的字号都会变小，想想如果这个标签用于网站的底部的版权信息还是个不错的做法。</p>
<p>4. 去掉了Javascript和CSS标签的type属性</p>
<p>通常你会在&lt;link&gt;和&lt;script&gt;加上type属性：</p>
<p>&lt;link rel="stylesheet" type=text/css href="path/to/stylesheet.css"&gt;<br />
 &lt;script type="text/javascript" src="path/to/script.js"&gt;&lt;/script&gt;<br />
 <br />
在HTML5中，不再需要type属性了，因为这显得有点多余，去掉之后可以让代码更为简洁。</p>
<p>&lt;link href="path/to/stylesheet.css"&gt;<br />
 &lt;script src="path/to/script.js"&gt;&lt;/script&gt;<br />
 <br />
5. 是否使用双引号</p>
<p>这有点让人纠结，HTML5并不是XTHML，你可以省去标签中的双引号。相信大多数同志也包括我都习惯了加上双引号，因为这让代码看起来会更标准。不过，这可以根据你的个人喜好来确定是到底要不要双引号。</p>
<p>&lt;h6 id="someid"&gt; start the reactor. &lt;/h6&gt;<br />
 <span id="more-1501"></span><br />
6. 使网页内容可以编辑</p>
<p>7. 电子邮件输入框</p>
<p>HMTL5中新增了一个输入框的电子邮件属性，可以检测输入的内容是否符合电子邮件的书写格式，功能越来越强大了吧，在HTML5之前只能依靠JS来检测。虽然内置的表单验证功能很快就会成为现实，但这个属性很多浏览器都还不支持，只会当作普通的文本输入框来处理。</p>
<p>&lt;form method=get&gt;<br />
   &lt;label for="email"&gt;email:&lt;/label&gt;<br />
&lt;input id="email" type="email" name="email"&gt;<br />
  &lt;button type="submit"&gt; submit form &lt;/button&gt;<br />
&lt;/form&gt;<br />
到目前为止，包括现代浏览器在内都不支持该属性，所以这个属性暂时还是靠不住的。</p>
<p>8. 占位符</p>
<p>文本框中的占位符（看看本博的搜索框效果）有利于提升用户体验，之前，我们只能依靠JS来实现占位符的效果，在HTML5中新增了占位符属性placeholder。</p>
<p>&lt;input type="email" name="email" placeholder="doug@givethesepeopleair.com"&gt; <br />
同样，目前的主流现代浏览器对该属性的支持不大好，暂时只有Chrome和Safari支持该属性，Firefox和Opera不支持该属性。</p>
<p>9. 本地存储</p>
<p>HTML5的本地存储功能，可以让现代浏览器“记住”我们输入的，就算浏览器关闭和刷新也不会受影响。虽然这个功能有些浏览器不支持，但是IE8， Safari 4， 还有 Firefox 3.5还是支持这个功能的，你可以测试下。</p>
<p>10. 更有语义的header和footer</p>
<p>下面的代码在HTML5中将不复存在</p>
<p>&lt;div id=header&gt;<br />
     ...<br />
&lt;/div&gt;<br />
&lt;div id=footer&gt;<br />
     ...<br />
&lt;/div&gt;<br />
通常我们都会给header和footer定义一个div，然后再添加一个id，但是在HTML5中可以直接使用&lt;header&gt;和&lt;footer&gt;标签，所以可以将上面的代码改写成：</p>
<p>&lt;header&gt;<br />
    ...<br />
&lt;/header&gt;<br />
&lt;footer&gt;<br />
    ...<br />
&lt;/footer&gt;<br />
要注意不要将这两个标签和网站的头部和页脚混淆起来，它们只是代表它们的容器。</p>
<p>11. IE对HTML5的支持</p>
<p>IE浏览器目前对HTML5的支持并不好，也是阻碍HTML5的更快普及的一大绊脚石，不过，IE9对HTML5的支持度还是很不错的。</p>
<p>IE把HTML5新增的标签都解析成内联元素，而实际上它们是块级元素，所以有必要为它们定义一个样式：</p>
<p>header, footer, article, section, nav, menu, hgroup {<br />
   display: block;<br />
}<br />
 <br />
尽管如此，IE还是不能解析这些新增的HTML5标签，这个时候就需要借助Javascript来解决这个问题：</p>
<p>document.createElement("article");<br />
document.createElement("footer");<br />
document.createElement("header");<br />
document.createElement("hgroup");<br />
document.createElement("nav");<br />
document.createElement("menu");<br />
 <br />
你可以借助这一段Javascript代码来修复IE更好的解析HTML5</p>
<p>&lt;script mce_src="http://html5shim.googlecode.com/svn/trunk/html5.js"&gt;&lt;/script&gt;</p>
<p>12. 标题群( hgroup)</p>
<p>这个类似于第二点技巧。如果用h1和h2标签分别表示网站的名称和副标题，但这会让两个本义上密切相关的标题并没有关联起来。这个时候可以使用&lt;hgroup&gt;标签将它们组合起来，这样代码会更有语义。</p>
<p>&lt;header&gt;<br />
&lt;hgroup&gt;<br />
&lt;h1&gt; Recall Fan Page &lt;/h1&gt;<br />
&lt;h2&gt; Only for people who want the memory of a lifetime. &lt;/h2&gt;<br />
&lt;/hgroup&gt;<br />
&lt;/header&gt;<br />
 <br />
13. 必填项属性</p>
<p>前端人员肯定做过不少表单验证的项目，其中很重要的一点就是有些输入框的内容是必须填写的，这里就需要使用Javascript来检查。在HTML5中，新增了一个“必须填写”的属性：required。required属性有两种使用方法，第二种方法显得更有结构性，而第一种更简洁。</p>
<p>&lt;input type="text" name="someInput" required&gt;<br />
&lt;input type="text" name="someInput" required="required"&gt;<br />
 <br />
有了这个属性，使表单的提交验证变得更简单了，看看下面简单的例子：</p>
<p>&lt;form method=post&gt;<br />
    &lt;label for=someInput&gt; your name: &lt;/label&gt;<br />
&lt;input id=someInput type=text name=someInput placeholder="Douglas Quaid" required="required"&gt;<br />
    &lt;button type="submit"&gt;Go&lt;/button&gt;<br />
&lt;/form&gt;<br />
 <br />
如果输入框为空，表单将无法提交成功。</p>
<p>14. 自动获取焦点</p>
<p>同样的，HTML5也不再需要Javascript来解决输入框的自动获取焦点，如果某个输入框应当被选择或是获取到输入焦点，HTML5新增了自动获取焦点属性autofocus：</p>
<p>&lt;input type="text" name="someInput" placeholder="douglas quaid" required="required" autofocus="autofocus"&gt;<br />
 <br />
autofocus也同样可以写成”autofocus=autofocus”，这样看起来标准些，这个根据自己的个人喜好而定。</p>
<p>15. 音频播放的支持</p>
<p>HTML5中提供了&lt;audio&gt;标签，解决了以往必须依靠第三方插件才能播放音频文件的问题。目前为止，还只有少数的最新浏览器支持该标签。</p>
<p>&lt;audio controls="controls" autoplay="autoplay"&gt;<br />
    &lt;source src="file.ogg" /&gt;<br />
    &lt;source src="file.mp3" /&gt;<br />
    &lt;a href="file.mp3"&gt;Download this file.&lt;/a&gt;<br />
&lt;/audio&gt;<br />
 <br />
为什么会有两种格式的音频文件？因为Firefox和Webkit浏览器所支持的格式存在差异，Firefox只能支持.ogg文件，而Webkit只支持.mp3的文件，解决的办法就是创建两个版本的音频文件，这样就可以兼容Firefox和Webkit的浏览器了，需要注意的是IE不支持该标签。</p>
<p>16. 视频播放的支持</p>
<p>和&lt;audio&gt;标签一样，HTML5也提供了&lt;video&gt;标签对播放视频文件的支持。YouTube也宣布了一项新的HTML5的视频嵌入。不过有点遗憾，HTML5的规范并没有指定特定的视频解码器，而是让浏览器自己来决定。这就造成了个浏览器的兼容问题，虽然Safari和IE9都支持还H.264格式的视频( Flash 播放器可以可以播放)，Firefox和Opera则支持开源的Theora和Vorbis格式。因此，当显示HTML5视频的时候，也得准备2种格式。</p>
<p>&lt;video controls preload&gt;<br />
    &lt;source src="cohagenPhoneCall.ogv" type="video/ogg"; codecs='vorbis, theora'" /&gt;<br />
    &lt;source src="cohagenPhoneCall.mp4" type="video/mp4; 'codecs='avc1.42E01E, mp4a.40.2'" /&gt;<br />
&lt;div&gt; your browser is old. &lt;a href="cohagenPhoneCall.mp4"&gt;download this video instead.&lt;/a&gt; &lt;/div&gt;<br />
&lt;/video&gt;<br />
 <br />
需要注意的是，type属性虽然可以省略掉，但是如果加上的话，浏览器就可以更快的准确的解析该视频文件。并不是所有的浏览器都支持HTML5的视频，所以得做好使用Flash版本来代替，当然，这个决定权在于你。</p>
<p>17. 预加载视频</p>
<p>预加载属性：preload，首先要确定是否需要预先加载视频，假如，访客在访问一个有很多视频展示的页面，那么就有必要预先加载一段视频，这样可以节省访客的等待时间，提高用户体验。你可以给&lt;video&gt;标签添加一个preload属性来实现预先加载的功能。</p>
<p>&lt;video preload="preload"&gt;<br />
 ...<br />
&lt;/video&gt;<br />
 <br />
18. 显示控件</p>
<p>显示控件属性可以给视频添加一个播放暂停的控件，需要注意的是每个浏览器显示的效果可能会有些差异。</p>
<p>&lt;video controls="controls" preload="preload"&gt;<br />
...<br />
&lt;/video&gt;<br />
 <br />
19. 使用正则表达式</p>
<p>在HTML5中，我们可以直接使用正则表达式。</p>
<p>&lt;form method=post action=""&gt;<br />
    &lt;label for="username"&gt;create a username: &lt;/label&gt;<br />
&lt;input id="username" type="text" name="username" placeholder="4 &lt;&gt; 10" required="required" autofocus="autofocus" pattern="[A-Za-z]{4,10}"&gt;<br />
    &lt;button type="submit"&gt;Go &lt;/button&gt;<br />
&lt;/form&gt;<br />
 <br />
20. 检测浏览器对HTML5属性的支持</p>
<p>由于各浏览器对HTML5属性的支持度不同，这就造成了一些兼容问题。但是可以使用方法来检测该浏览器是否支持这些属性，上例中的代码如果要检测pattern属性是否被浏览器识别，可以使用Javascript代码来检测。</p>
<p>alert( 'pattern' in document.createElement('input') ) // boolean;<br />
 <br />
其实这是确定浏览器兼容常用的方法，jQuery库就经常使用这种方法。上面的代码中创建了一个input标签，并检测pattern属性是否被浏览器支持，如果能支持的话，浏览器就支持这个功能，否则就不支持。</p>
<p>&lt;script&gt;<br />
 if (!'pattern' in document.createElement('input') ) {<br />
    // do client/server side validation<br />
 }<br />
&lt;/script&gt;<br />
 <br />
21. Mark标签</p>
<p>&lt;mark&gt;标签用于高亮显示那些需要在视觉上向用户突出其重要性的文字，包裹在此标签里的字符串必须与用户当前的行为相关。例如，如果我在一些博客中搜索“Open your Mind” ，我可以使用在&lt;mark&gt;标签里使用JavaScript 来包裹每一次动作。</p>
<p>&lt;h3&gt; search results &lt;/h3&gt;<br />
&lt;h6&gt; They were interrupted, just after Quato said, &lt;mark&gt;"Open your Mind"&lt;/mark&gt;. &lt;/h6&gt;<br />
 <br />
22. 该如何正确的使用div标签</p>
<p>有些人可能会有疑问，有了&lt;header&gt;和&lt;footer&gt;等这些标签，&lt;div&gt;标签在HTML5中还有用吗？答案是肯定的，比如你想创建一个能包裹特殊内容的容器自由灵活的&lt;div&gt;肯定是首选，而你要创建一篇文章或者一个导航菜单，建议你使用更有语义的&lt;article&gt;和&lt;nav&gt;标签。</p>
<p>很多人认为HTML5可能还是很遥远的事，所以直接无视，其实不然，现在很多网站都已经开始使用HTML5了，事实上，HTML5的一些新增属性和功能是让代码变得更简洁，这总归是一件好事，应该值得我们推崇。最后感谢你阅读了这篇HTML5的入门级文章，希望能为你进一步学习HTML5提供一些帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1501/22-primary-skills-html5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>HTML调用rss</title>
		<link>http://pzg.me/web/1497/html-call-rss/</link>
		<comments>http://pzg.me/web/1497/html-call-rss/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 07:31:14 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[RSS]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1497</guid>
		<description><![CDATA[&#60;html&#62; &#60;head&#62;       &#60;title&#62;javascript读取RSS数据&#60;/title&#62; &#60;META content="text/html; charset=utf-8" http-equiv=Content-Type /&#62; &#60;/head&#62; &#60;body leftmargin="0" topmargin="0"&#62; &#60;font&#62;&#60;h... ]]></description>
			<content:encoded><![CDATA[<p>&lt;html&gt;<br />
&lt;head&gt;<br />
      &lt;title&gt;javascript读取RSS数据&lt;/title&gt;<br />
&lt;META content="text/html; charset=utf-8" http-equiv=Content-Type /&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body leftmargin="0" topmargin="0"&gt;<br />
&lt;font&gt;&lt;h3 align="center"&gt;javascript读取RSS数据&lt;/h3&gt;&lt;/font&gt;<br />
&lt;br&gt;<br />
&lt;table width="90%" align="center" border="0" cellpadding=0 cellspacing=0&gt;<br />
&lt;tr&gt;<br />
   &lt;td bgcolor=White&gt;&lt;b&gt;新闻中心&lt;/b&gt;&lt;font size="-1"&gt;(摘自新浪网)&lt;/font&gt;&lt;hr&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
   &lt;td bgcolor=White&gt;<br />
    &lt;div id="container" &gt;News Loading...&lt;/div&gt;<br />
   &lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;script language="JavaScript1.2"&gt;<br />
//Container for ticker. Modify its STYLE attribute to customize style:<br />
var tickercontainer=''<br />
var xmlsource="http://rss.sina.com.cn/news/marquee/ddt.xml";<br />
var root;<br />
var title;<br />
var link;<br />
var items;<br />
var item;<br />
var images;<br />
var image;<br />
var description;<br />
if (window.ActiveXObject)<br />
{<br />
//document.write("Microsoft.XMLDOM");<br />
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");<br />
}<br />
else if (document.implementation &amp;&amp; document.implementation.createDocument)<br />
{<br />
//document.write("document.implementation.createDocument");<br />
var xmlDoc= document.implementation.createDocument("","doc",null);<br />
}<br />
if (typeof xmlDoc!="undefined")<br />
{<br />
//document.write(tickercontainer)<br />
xmlDoc.load(xmlsource)<br />
}<br />
function fetchxml()<br />
{<br />
if (xmlDoc.readyState==4)<br />
   output()<br />
else<br />
   setTimeout("fetchxml()",10)<br />
}<br />
function output()<br />
{<br />
var temp="";<br />
root = xmlDoc.getElementsByTagName("channel")[0];<br />
title =root.getElementsByTagName("title")[0];<br />
//temp = title.firstChild.nodeValue +"&lt;br&gt;";<br />
items=root.getElementsByTagName("item");<br />
for(i=0;i&lt;=items.length-1;i++)<br />
{<br />
   item=items[i];<br />
   title=item.getElementsByTagName("title")[0];<br />
   link=item.getElementsByTagName("link")[0];<br />
   description=item.getElementsByTagName("description")[0];<br />
   temp = temp + "&lt;font size=-1&gt;&lt;a href=" + link.firstChild.nodeValue+ " target='_bank'&gt;" +</p>
<p>title.firstChild.nodeValue +"&lt;/a&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;";<br />
   //temp = temp +"&lt;font size=-1&gt;" + description.firstChild.nodeValue + "&lt;/font&gt;&lt;br&gt;&lt;br&gt;";<br />
   document.getElementById("container").innerHTML = temp;<br />
}<br />
}<br />
if (window.ActiveXObject)<br />
fetchxml()<br />
else if (typeof xmlDoc!="undefined")<br />
xmlDoc.onload=output<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1497/html-call-rss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP探针</title>
		<link>http://pzg.me/web/1495/php-probe/</link>
		<comments>http://pzg.me/web/1495/php-probe/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 03:23:24 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[探针]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1495</guid>
		<description><![CDATA[网上有很多探针，不过各种版本都很老了，而且目前很少人在更新这个东西，最近测试服务器环境网上下了一些探针，各有优缺点。于是找了个时间把各个版本的探针功能揉在了一起，去掉了... ]]></description>
			<content:encoded><![CDATA[<p>网上有很多探针，不过各种版本都很老了，而且目前很少人在更新这个东西，最近测试服务器环境网上下了一些探针，各有优缺点。于是找了个时间把各个版本的探针功能揉在了一起，去掉了广告，清爽了许多。</p>
<p>这个探针是自己用来的，不过还是习惯性的分享出来，对于原版的探针不好意思去掉了链接和广告，服务器性能去掉了过时很久的信息，如果有机会，以后会添加上一些最新服务器的测试信息的。</p>
<p>PHP探针下载地址：<a href="http://www.box.net/shared/va3fdo1v14">php探针</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1495/php-probe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Directadmin自定义404页面</title>
		<link>http://pzg.me/web/1415/directadmin-custom-404-pages/</link>
		<comments>http://pzg.me/web/1415/directadmin-custom-404-pages/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 01:31:36 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[404]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1415</guid>
		<description><![CDATA[Directadmin控制面板，支持用户自定义404、403、401、500错误页面。 具体操作步骤如下： 1、进入主机控制面板，点击“自定义错误页面”； 2、点击“401.shtml ”、“403.shtml”、“404.shtml”、“500.sh... ]]></description>
			<content:encoded><![CDATA[<p>Directadmin控制面板，支持用户自定义404、403、401、500错误页面。</p>
<p>具体操作步骤如下：</p>
<p>1、进入主机控制面板，点击“自定义错误页面”；</p>
<p>2、点击“401.shtml ”、“403.shtml”、“404.shtml”、“500.shtml”即可以进入编辑相关设置页面；</p>
<p>3、编辑完成后，可点击“预览html”进行预览，如不需要修改，则直接点击“保存为”按钮即可成功设置相应错误页面。（注意：错误页面内容必须大于或等于512个字节，不然会自动使用系统内置错误页面）</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1415/directadmin-custom-404-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cURL库功能简介</title>
		<link>http://pzg.me/web/1414/curl-library-features/</link>
		<comments>http://pzg.me/web/1414/curl-library-features/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 05:37:16 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[cURL]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1414</guid>
		<description><![CDATA[首先，我们得先要确定我们的PHP是否开启了这个库，你可以通过使用php_info()函数来得到这一信息。 &#60;?php phpinfo(); ?&#62; 如果你可以在网页上看到下面的输出，那么表示cURL库已被开启。 如果你... ]]></description>
			<content:encoded><![CDATA[<p>首先，我们得先要确定我们的PHP是否开启了这个库，你可以通过使用php_info()函数来得到这一信息。</p>
<p>&lt;?php<br />
phpinfo();<br />
?&gt;</p>
<p>如果你可以在网页上看到下面的输出，那么表示cURL库已被开启。</p>
<p>如果你看到的话，那么你需要设置你的PHP并开启这个库。如果你是在Windows平台下，那么非常简单，你需要改一改你的php.ini文件的设置，找到php_curl.dll，并取消前面的分号注释就行了。如下所示：</p>
<p>//取消下在的注释<br />
extension=php_curl.dll<br />
如果你是在Linux下面，那么，你需要重新编译你的PHP了，编辑时，你需要打开编译参数——在configure命令上加上“–with-curl” 参数。</p>
<p>一个小示例</p>
<p>如果一切就绪，下面是一个小例程：</p>
<p>&lt;?php<br />
// 初始化一个 cURL 对象<br />
$curl = curl_init();</p>
<p>// 设置你需要抓取的URL<br />
curl_setopt($curl, CURLOPT_URL, 'http://pzg.me');</p>
<p>// 设置header<br />
curl_setopt($curl, CURLOPT_HEADER, 1);</p>
<p>// 设置cURL 参数，要求结果保存到字符串中还是输出到屏幕上。<br />
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);</p>
<p>// 运行cURL，请求网页<br />
$data = curl_exec($curl);</p>
<p>// 关闭URL请求<br />
curl_close($curl);</p>
<p>// 显示获得的数据<br />
var_dump($data);<br />
?&gt;<br />
如何POST数据</p>
<p>上面是抓取网页的代码，下面则是向某个网页POST数据。假设我们有一个处理表单的网址http://www.example.com/sendSMS.php，其可以接受两个表单域，一个是电话号码，一个是短信内容。</p>
<p>&lt;?php<br />
$phoneNumber = '13912345678';<br />
$message = 'This message was generated by curl and php';<br />
$curlPost = 'pNUMBER=' . urlencode($phoneNumber) . '&amp;MESSAGE=' . urlencode($message) . '&amp;SUBMIT=Send';<br />
$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/sendSMS.php');<br />
curl_setopt($ch, CURLOPT_HEADER, 1);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_POST, 1);<br />
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);<br />
$data = curl_exec();curl_close($ch);<br />
?&gt;<br />
从上面的程序我们可以看到，使用CURLOPT_POST设置HTTP协议的POST方法，而不是GET方法，然后以CURLOPT_POSTFIELDS设置POST的数据。</p>
<p>关于代理服务器</p>
<p>下面是一个如何使用代理服务器的示例。请注意其中高亮的代码，代码很简单，我就不用多说了。</p>
<p>&lt;?php<br />
$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');<br />
curl_setopt($ch, CURLOPT_HEADER, 1);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);<br />
curl_setopt($ch, CURLOPT_PROXY, 'fakeproxy.com:1080');<br />
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');<br />
$data = curl_exec();curl_close($ch);<br />
?&gt;<br />
关于SSL和Cookie</p>
<p>关于SSL也就是HTTPS协议，你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然，还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。</p>
<p>关于Cookie，你需要了解下面三个参数：</p>
<p>CURLOPT_COOKIE，在当面的会话中设置一个cookie</p>
<p>CURLOPT_COOKIEJAR，当会话结束的时候保存一个Cookie</p>
<p>CURLOPT_COOKIEFILE，Cookie的文件。</p>
<p>HTTP服务器认证</p>
<p>最后，我们来看一看HTTP服务器认证的情况。</p>
<p>&lt;?php<br />
$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);<br />
curl_setopt(CURLOPT_USERPWD, '[username]:[password]')</p>
<p>$data = curl_exec();<br />
curl_close($ch);<br />
?&gt;<br />
关于其它更多的内容，请参看相关的cURL手册。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1414/curl-library-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress访客来向和欢迎词</title>
		<link>http://pzg.me/web/1408/wordpress-and-welcome-visitors-to-the/</link>
		<comments>http://pzg.me/web/1408/wordpress-and-welcome-visitors-to-the/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 00:54:50 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1408</guid>
		<description><![CDATA[1、把以下代码复制到 WordPress 主题的 functions.php 中： function show_refer_in(){ $refer_info=$_SERVER['HTTP_REFERER']; $ban_list=array($_SERVER["HTTP_HOST"]); for($ii=0;$ii&#60;count($ban_list);$ii++){ if(strpos($refer_info,$ban_list[$ii])... ]]></description>
			<content:encoded><![CDATA[<p>1、把以下代码复制到 WordPress 主题的 functions.php 中：</p>
<p>function show_refer_in(){<br />
$refer_info=$_SERVER['HTTP_REFERER'];<br />
$ban_list=array($_SERVER["HTTP_HOST"]);<br />
for($ii=0;$ii&lt;count($ban_list);$ii++){<br />
if(strpos($refer_info,$ban_list[$ii])){<br />
return;<br />
}<br />
}<br />
if($refer_info){<br />
preg_match("/^(http:\/\/)?([^\/]+)/i",<br />
$refer_info, $matches);<br />
$host = $matches[2];<br />
echo "&lt;div id=\"hellobaby\"&gt;欢迎来自 ".$host." 的朋友！&lt;br /&gt;推荐您 &lt;b&gt;&lt;a href=\"http://pzg.me\" target=\"_blank\"&gt;点击这里&lt;/a&gt;&lt;/b&gt; 订阅我的博客 o(∩_∩)o&lt;div class=\"closebox\"&gt;&lt;a href=\"javascript:void(0)\" onclick=\"$('#hellobaby').slideUp('slow');$('.closebox').css('display','none');\" title=\"关闭\"&gt;×&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;";<br />
}<br />
}<br />
2、在主题文件的任何部位调用以下函数，我建议是放在 footer.php 中：</p>
<p>&lt;?php show_refer_in();?&gt;<br />
3、接下来样式部分仅供参考：</p>
<p>#hellobaby {<br />
background:#000000;<br />
border:1px solid #B3B3B3;<br />
color:#FFFFFF;<br />
font-size:14px;<br />
opacity:0.7;<br />
filter:alpha(opacity=70);<br />
padding:10px;<br />
position:absolute;<br />
right:0;<br />
top:250px;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1408/wordpress-and-welcome-visitors-to-the/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>部分wordpress函数</title>
		<link>http://pzg.me/web/1407/part-of-the-wordpress-function/</link>
		<comments>http://pzg.me/web/1407/part-of-the-wordpress-function/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 00:41:51 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1407</guid>
		<description><![CDATA[set_transient(), get_transient(), delete_transient() 这个函数类似于用于存储检索选项数据库表单的get_options()以及update_options()函数。 他们的主要区别在于，你可以给这个临时API函数传递一个时间参数，作... ]]></description>
			<content:encoded><![CDATA[<p>set_transient(), get_transient(), delete_transient()<br />
这个函数类似于用于存储检索选项数据库表单的get_options()以及update_options()函数。 他们的主要区别在于，你可以给这个临时API函数传递一个时间参数，作为数据库输入的过期日。当参数显示的时间到达之后，输入会被移除。如果你需要缓存数据或查询某个短期时间内的结果，这会是个相当有用的函数。</p>
<p>set_transient的参数：</p>
<p>set_transient($transient, $value, $expiration);<br />
将某个值保留在数据库中一小时：</p>
<p>set_transient('the_name', $special_query_results, 60*60);<br />
结果值：</p>
<p>$value = get_transient('the_name');<br />
WordPress “定时任务”函数</p>
<p>wp_schedule_event(time(), 'hourly', 'my_schedule_hook');<br />
如果你需要定时执行某段代码，像是检查RSS订阅、数据库备份或是重设数据库值等，就可以用到这个函数。</p>
<p>WordPress HTTP API</p>
<p>wp_remote_get( $url, $args = array() );<br />
这是个用于检索网页内容的简单函数。函数把检索结果存储在一个数组里。你不仅可以得到网页的结果内容，还可以获取网页的页头信息和相应代码。</p>
<p>轻松获取RSS 订阅</p>
<p>$feed = fetch_feed( $uri );<br />
fetch_feed是一个用来获取订阅内容的简单WordPress函数。这个函数可以检索、分析并自动缓存订阅内容。</p>
<p>WordPress邮件函数</p>
<p>wp_mail()  wp_mail( $to, $subject, $message, $headers, $attachments );<br />
示例：</p>
<p>Example:   <br />
$to = 'Example@Example.com'; <br />
$subject = 'Hello！'; <br />
$message = 'This message was sent by wordpress'   <br />
$mail = wp_mail($to, $subject, $message);   <br />
if($mail) echo 'Mail delivered';<br />
相当简单实用的函数，利用这个函数你可以发送页头信息和附件、普通文本、HTML信息以及其他各种选项。</p>
<p>计时函数</p>
<p>human_time_diff( $from, $to )<br />
这个函数显示出的时间效果不是普通的时间格式，而是“XXX发布于XXX小时前”这样。</p>
<p>WordPress get_comments函数</p>
<p>get_comments()<br />
在评论循环外检索评论内容。</p>
<p>字符串验证</p>
<p>wp_kses($string, $allowed_html, $allowed_protocols);<br />
如果你需要过滤不受信任的用户输入内容，wp_kses会是个很实用的函数。这个函数确保$string中只出现经许可的HTML元素名称、属性和属性值以及正常的HTML实体。</p>
<p>WordPress文本转换</p>
<p>wptexturize()<br />
这个函数把常用的字符串转换成印刷时采用的正确符号，比如破折号、省略号等，有时也会为某些段落加上排版引号。</p>
<p>wpautop()<br />
给字符串添加&lt;p&gt;标签</p>
<p>WordPress短码API</p>
<p>add_shortcode(), do_shortcode()<br />
add_shortcode()可以快速为你的日志内容创建宏。假设你希望把日志里的某些内容包围在一个div块里，并且加上若干类和id，让你可以创建多个内容栏。你可以用HTML编辑器进行编辑，然后输入下面的内容：</p>
<p>&lt;div class='one_third'&gt;内容&lt;/div&gt;<br />
用PHP函数生成WordPress日志wp_insert_post() 这个函数在数据库中插入文章页面和自定义文章类型。它会过滤变量并执行检查，补充日期/时间等缺失变量。如果用户可以通过你的网站前台提交内容，这个函数会相当有帮助。</p>
<p>用PHP函数生成WordPress评论</p>
<p>wp_insert_comment()<br />
和wp_insert_posts类似，不过wp_insert_comment插入的是评论。</p>
<p>WordPress对象缓存</p>
<p>wp_cache_add(),  wp_cache_set(),  wp_cache_get(),  wp_cache_delete, wp_cache_replace(), wp_cache_flush<br />
WP_Object_Cache是WordPress中用以缓存数据的类。</p>
<p>禁止执行WordPress任务</p>
<p>wp_die()<br />
wp_die终止WordPress运行，显示HTML错误信息。</p>
<p>这个函数与PHP函数die()互为补充。HTML信息显示给用户。推荐仅在进程不能再继续时才使用该函数。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1407/part-of-the-wordpress-function/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WEB前端开发规范文档</title>
		<link>http://pzg.me/web/1403/web-front-end-development-of-specification-documents/</link>
		<comments>http://pzg.me/web/1403/web-front-end-development-of-specification-documents/#comments</comments>
		<pubDate>Sat, 16 Oct 2010 08:29:04 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1403</guid>
		<description><![CDATA[规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本文档... ]]></description>
			<content:encoded><![CDATA[<p>规范目的</p>
<p>为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本文档如有不对或者不合适的地方请及时提出, 经讨论决定后方可更改.</p>
<p>基本准则</p>
<p>符合web标准, 语义化html, 结构表现行为分离, 兼容性优良. 页面性能方面, 代码要求简洁明了有序, 尽可能的减小服务器负载, 保证最快的解析速度.</p>
<p>文件规范</p>
<p>1. html, css, js, images文件均归档至&lt;系统开发规范&gt;约定的目录中;</p>
<p>2. html文件命名: 英文命名, 后缀.htm. 同时将对应界面稿放于同目录中, 若界面稿命名为中文, 请重命名与html文件同名, 以方便后端添加功能时查找对应页面;</p>
<p>3. css文件命名: 英文命名, 后缀.css. 共用base.css, 首页index.css, 其他页面依实际模块需求命名.;</p>
<p>4. Js文件命名: 英文命名, 后缀.js. 共用common.js, 其他依实际模块需求命名.</p>
<p>html书写规范</p>
<p>1. 文档类型声明及编码: 统一为html5声明类型&lt;!DOCTYPE html&gt;; 编码统一为&lt;meta charset=”utf-8″ /&gt;, 书写时利用IDE实现层次分明的缩进;</p>
<p>2. 非特殊情况下样式文件必须外链至&lt;head&gt;…&lt;/head&gt;之间;非特殊情况下JavaScript文件必须外链至页面底部;</p>
<p>3. 引入样式文件或JavaScript文件时, 须略去默认类型声明, 写法如下:</p>
<p>&lt;link rel=”stylesheet” href=”…” /&gt;</p>
<p>&lt;style&gt;…&lt;/style&gt;</p>
<p>&lt;script src=”…”&gt;&lt;/script&gt;</p>
<p>4. 引入JS库文件, 文件名须包含库名称及版本号及是否为压缩版, 比如jquery-1.4.1.min.js; 引入插件, 文件名格式为库名称+插件名称, 比如jQuery.cookie.js;</p>
<p>5. 所有编码均遵循xhtml标准, 标签 &amp; 属性 &amp; 属性命名 必须由小写字母及下划线数字组成, 且所有标签必须闭合, 包括br (&lt;br /&gt;), hr(&lt;hr /&gt;)等; 属性值必须用双引号包括;</p>
<p>6. 充分利用无兼容性问题的html自身标签, 比如span, em, strong, optgroup, label,等等; 需要为html元素添加自定义属性的时候, 首先要考虑下有没有默认的已有的合适标签去设置, 如果没有, 可以使用须以”data-”为前缀来添加自定义属性，避免使用”data:”等其他命名方式;</p>
<p>7. 语义化html, 如 标题根据重要性用h*(同一页面只能有一个h1), 段落标记用p, 列表用ul, 内联元素中不可嵌套块级元素;</p>
<p>8. 尽可能减少div嵌套, 如&lt;div class=”box”&gt;&lt;div class=”welcome”&gt;欢迎访问XXX, 您的用户名是&lt;div class=”name”&gt;用户名&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;完全可以用以下代码替代: &lt;div class=”box”&gt;&lt;p&gt;欢迎访问XXX, 您的用户名是&lt;span&gt;用户名&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;;</p>
<p>9. 书写链接地址时, 必须避免重定向，例如：href=”http://itaolun.com/”, 即须在URL地址后面加上“/”；</p>
<p>10. 在页面中尽量避免使用style属性,即style=”…”;</p>
<p>11. 必须为含有描述性表单元素(input, textarea)添加label, 如&lt;p&gt;姓名: &lt;input type=”text” id=”name” name=”name” /&gt;&lt;/p&gt;须写成:&lt;p&gt;&lt;label for=”name”&gt;姓名: &lt;/label&gt;&lt;input type=”text” id=”name” /&gt;&lt;/p&gt;</p>
<p>12. 能以背景形式呈现的图片, 尽量写入css样式中;</p>
<p>13. 重要图片必须加上alt属性; 给重要的元素和截断的元素加上title;</p>
<p>14. 给区块代码及重要功能(比如循环)加上注释, 方便后台添加功能;</p>
<p>15. 特殊符号使用: 尽可能使用代码替代: 比如 &lt;(&lt;) &amp; &gt;(&amp;gt;) &amp; 空格( ) &amp; ?(?) 等等;</p>
<p>16. 书写页面过程中, 请考虑向后扩展性;</p>
<p>17. class &amp; id 参见 css书写规范.</p>
<p>css书写规范</p>
<p>1. 编码统一为utf-8;</p>
<p>2. 协作开发及分工: i会根据各个模块, 同时根据页面相似程序, 事先写好大体框架文件, 分配给前端人员实现内部结构&amp;表现&amp;行为; 共用css文件base.css由i书写, 协作开发过程中, 每个页面请务必都要引入, 此文件包含reset及头部底部样式, 此文件不可随意修改;</p>
<p>3. class与id的使用: id是唯一的并是父级的, class是可以重复的并是子级的, 所以id仅使用在大的模块上, class可用在重复使用率高及子级中; id原则上都是由我分发框架文件时命名的, 为JavaScript预留钩子的除外;</p>
<p>4. 为JavaScript预留钩子的命名, 请以 js_ 起始, 比如: js_hide, js_show;</p>
<p>5. class与id命名: 大的框架命名比如header/footer/wrapper/left/right之类的在2中由i统一命名.其他样式名称由 小写英文 &amp; 数字 &amp; _ 来组合命名, 如i_comment, fontred, width200; 避免使用中文拼音, 尽量使用简易的单词组合; 总之, 命名要语义化, 简明化.</p>
<p>6. 规避class与id命名(此条重要, 若有不明白请及时与i沟通):</p>
<p>a, 通过从属写法规避, 示例见d;</p>
<p>b, 取父级元素id/class命名部分命名, 示例见d;</p>
<p>c, 重复使用率高的命名, 请以自己代号加下划线起始, 比如i_clear;</p>
<p>d, a,b两条, 适用于在2中已建好框架的页面, 如, 要在2中已建好框架的页面代码&lt;div id=”mainnav”&gt;&lt;/div&gt;中加入新的div元素,</p>
<p>按a命名法则: &lt;div id=”mainnav”&gt;&lt;div class=”firstnav”&gt;…&lt;/div&gt;&lt;/div&gt;,</p>
<p>样式写法:  #mainnav  .firstnav{…….}</p>
<p>按b命名法则: &lt;div id=”mainnav”&gt;&lt;div class=”main_firstnav”&gt;…&lt;/div&gt;&lt;/div&gt;,</p>
<p>样式写法:  .main_firstnav{…….}</p>
<p>7. css属性书写顺序, 建议遵循 布局定位属性–&gt;自身属性–&gt;文本属性–&gt;其他属性. 此条可根据自身习惯书写, 但尽量保证同类属性写在一起. 属性列举: 布局定位属性主要包括: margin　＆　padding　＆　float（包括clear）　＆　position（相应的 top,right,bottom,left）　＆　display　＆　visibility　＆　overflow等； 自身属性主要包括: width  &amp;  height  &amp;  background  &amp;  border; 文本属性主要包括：　font　＆　color　＆　text-align　＆　text-decoration　＆　text-indent等；其他属性包括: list-style(列表样式)　＆　vertical-vlign　＆　cursor　＆　z-index(层叠顺序) 　＆　zoom等. 我所列出的这些属性只是最常用到的, 并不代表全部;</p>
<p>8. 书写代码前, 考虑并提高样式重复使用率;</p>
<p>9. 充分利用html自身属性及样式继承原理减少代码量, 比如:</p>
<p>&lt;ul class=”list”&gt;&lt;li&gt;这儿是标题列表&lt;span&gt;2010-09-15&lt;/span&gt;&lt;/ul&gt;</p>
<p>定义</p>
<p>ul.list li{position:relative}  ul.list li span{position:absolute; right:0}</p>
<p>即可实现日期居右显示</p>
<p>10. 样式表中中文字体名, 请务必转码成unicode码, 以避免编码错误时乱码;</p>
<p>11. 背景图片请尽可能使用sprite技术, 减小http请求, 考虑到多人协作开发, sprite按模块制作;</p>
<p>12. 使用table标签时(尽量避免使用table标签), 请不要用width/ height/cellspacing/cellpadding等table属性直接定义表现, 应尽可能的利用table自身私有属性分离结构与表现, 如thead,tr,th,td,tbody,tfoot,colgroup,scope; (cellspaing及cellpadding的css控制方法: table{border:0;margin:0;border-collapse:collapse;} table th, table td{padding:0;} , base.css文件中我会初始化表格样式)</p>
<p>13. 杜绝使用&lt;meta http-equiv=”X-UA-Compatible” content=”IE=7″ /&gt; 兼容ie8;</p>
<p>14. 用png图片做图片时, 要求图片格式为png-8格式,若png-8实在影响图片质量或其中有半透明效果, 请为ie6单独定义背景:</p>
<p>_background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=crop, src=’img/bg.png’);</p>
<p>15. 避免兼容性属性的使用, 比如text-shadow || css3的相关属性;</p>
<p>16. 减少使用影响性能的属性, 比如position:absolute || float ;</p>
<p>17. 必须为大区块样式添加注释, 小区块适量注释;</p>
<p>18. 代码缩进与格式: 建议单行书写, 可根据自身习惯, 后期优化i会统一处理;</p>
<p>JavaScript书写规范</p>
<p>1. 文件编码统一为utf-8, 书写过程过, 每行代码结束必须有分号; 原则上所有功能均根据XXX项目需求原生开发, 以避免网上down下来的代码造成的代码污染(沉冗代码 || 与现有代码冲突 || …);</p>
<p>2. 库引入: 原则上仅引入jQuery库, 若需引入第三方库, 须与团队其他人员讨论决定;</p>
<p>3. 变量命名: 驼峰式命名. 原生JavaScript变量要求是纯英文字母, 首字母须小写, 如iTaoLun;</p>
<p>jQuery变量要求首字符为’_’, 其他与原生JavaScript 规则相同, 如: _iTaoLun;</p>
<p>另, 要求变量集中声明, 避免全局变量.</p>
<p>4. 类命名: 首字母大写, 驼峰式命名. 如 ITaoLun;</p>
<p>5. 函数命名: 首字母小写驼峰式命名. 如iTaoLun();</p>
<p>6. 命名语义化, 尽可能利用英文单词或其缩写;</p>
<p>7. 尽量避免使用存在兼容性及消耗资源的方法或属性, 比如eval() &amp; innerText;</p>
<p>8. 后期优化中, JavaScript非注释类中文字符须转换成unicode编码使用, 以避免编码错误时乱码显示;</p>
<p>9. 代码结构明了, 加适量注释. 提高函数重用率;</p>
<p>10. 注重与html分离, 减小reflow, 注重性能.</p>
<p>图片规范</p>
<p>1. 所有页面元素类图片均放入img文件夹, 测试用图片放于img/demoimg文件夹;</p>
<p>2. 图片格式仅限于gif || png || jpg;</p>
<p>3. 命名全部用小写英文字母 || 数字 || _ 的组合，其中不得包含汉字 || 空格 || 特殊字符；尽量用易懂的词汇, 便于团队其他成员理解; 另, 命名分头尾两部分, 用下划线隔开, 比如ad_left01.gif || btn_submit.gif;</p>
<p>4. 在保证视觉效果的情况下选择最小的图片格式与图片质量, 以减少加载时间;</p>
<p>5. 尽量避免使用半透明的png图片(若使用, 请参考css规范相关说明);</p>
<p>6. 运用css sprite技术集中小的背景图或图标, 减小页面http请求, 但注意, 请务必在对应的sprite psd源图中划参考线, 并保存至img目录下.</p>
<p>注释规范</p>
<p>1. html注释: 注释格式 &lt;!–这儿是注释–&gt;, ’–’只能在注释的始末位置,不可置入注释文字区域;</p>
<p>2. css注释: 注释格式 /*这儿是注释*/;</p>
<p>3. JavaScript注释, 单行注释使用’//这儿是单行注释’ ,多行注释使用 /* 这儿有多行注释 */;</p>
<p>开发及测试工具约定</p>
<p>建议使用Aptana || Dw || Vim , 亦可根据自己喜好选择, 但须遵循如下原则:</p>
<p>1. 不可利用IDE的视图模式’画’代码;</p>
<p>2. 不可利用IDE生成相关功能代码, 比如Dw内置的一些功能js;</p>
<p>3. 编码必须格式化, 比如缩进;</p>
<p>测试工具: 前期开发仅测试FireFox &amp; IE6 &amp; IE7 &amp; IE8 , 后期优化时加入Opera &amp; Chrome &amp; Safari;</p>
<p>建议测试顺序: FireFox–&gt;IE7–&gt;IE8–&gt;IE6–&gt;Opera–&gt;Chrome–&gt;Safari, 建议安装firebug及IE Tab Plus插件.</p>
<p>其他规范</p>
<p>1. 开发过程中严格按分工完成页面, 以提高css复用率, 避免重复开发;</p>
<p>2. 减小沉冗代码, 书写所有人都可以看的懂的代码. 简洁易懂是一种美德. 为用户着想, 为服务器着想.</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1403/web-front-end-development-of-specification-documents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网站更换模板须注意事项</title>
		<link>http://pzg.me/web/1401/web-site-templates-to-note-change/</link>
		<comments>http://pzg.me/web/1401/web-site-templates-to-note-change/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 04:39:45 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[模板]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1401</guid>
		<description><![CDATA[最近看到了一篇文章是在说网站更换模板要注意那些地方是不能改动的，否则这些是会导致搜索引擎对其进行惩罚的。我大概看了下文章内容，这个内容我稍后在后面会贴出主要内容部分，注... ]]></description>
			<content:encoded><![CDATA[<p>最近看到了一篇文章是在说网站更换模板要注意那些地方是不能改动的，否则这些是会导致搜索引擎对其进行惩罚的。我大概看了下文章内容，这个内容我稍后在后面会贴出主要内容部分，注意的地方在 标题 关键词 摘要 H标签 这几个因素上面，那么我相信这文章写出来一定是经过作者的反复试验得出的结论，这样就是说搜索引擎对网站的检索是标记性的记住几个关键标签，会把网页自动翻译成所谓的“百度地图”格式。那么接下来贴出文章参考一下。</p>
<p>一：注意Title的变化。</p>
<p>Title是最重要的部分，搜索引擎的蜘蛛首先会抓取这里，所以在更换模板时首先看此部分是否和原模板相同，如果别人制作的模板Title与你模板Title不同，由于模板&lt;title&gt;&lt;/title&gt;代码的结构不同，输出的Title也不同，那么应该把新模板的Title改成和老模板一致，因为搜索引擎收录的是老模板的Title。</p>
<p>还有一点，通常在使用CMS时，如DEDEcms，每篇文章的Title都会有“Power by DedeCMS”，如果去掉了，新模板则也应去掉。</p>
<p>二：注意keywords 和description的变化。</p>
<p>最近看了下百度和google的SEO指南，发现keywords已经被搜索引擎抛弃了，我重点说下description，也就是网页描述。卢松松就拿Z-blog来说明，有的博客模板没有description，有的就有，或者有的模板description采用文章的简介标签部分，而有的则采用description+标题+关键字，所以更换模板时也要考虑到description描述部分。<br />
三：注意H1、H2、H3、H4的变化。</p>
<p>这些都是HTML常用语法，按照SEO优化方法， 在更换模板时切忌注意新模板的H1-H6标签是否和老模板一致，如果不一致，就改回老模板的样式。这里还有一点是要提醒大家的，在标签中出现关键词是有利于优化的，如你在做“网络推广”这个关键词，那么&lt;h1&gt;&lt;/h1&gt;或&lt;h2&gt;&lt;/h2&gt;中尽量加上“网络推广”这几个字。</p>
<p>H1 — 大标题，放置于导航以上的部分，全站通用，用来诠释整个网站的内容，应包含网站主关键字，但切忌不要进行关键字堆砌。通常H1在一个页面只能出现一次，多数模板把&lt;h1&gt;&lt;/h1&gt;作为网站名称使用。</p>
<p>H2 — 副标题，在博客通常用作文章标题来使用。H3 —小标题，通常用于栏目介绍，如内容页右侧“最新文章”“最新评论及回复”等栏目。H4、H5、H6是同样道理，如H4可以用在文章的摘要部分，这三个没有前面几个常用，大家只要记得这几个标签是降序即可，即H1最重要，H2其次，以此推类。</p>
<p>总结，最近我也在把百度和google优化指南对比着看，我尽量满足这两份指南对模板的要求，也写下此文。以上几个是卢松松总结出更换模板的注意事项，希望对大家有用。更换模板就一句话，尽量不要变这些部分，实在要变也先从部分开始，一点点变。如果你不会懂HTML，那么请直接把老模板的Title、description和h1、h2标签部分复制替换到新模板上即可，如本文插图所示。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1401/web-site-templates-to-note-change/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript 编码规范建议</title>
		<link>http://pzg.me/web/1399/javascript-coding-standard-proposed/</link>
		<comments>http://pzg.me/web/1399/javascript-coding-standard-proposed/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 05:13:31 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1399</guid>
		<description><![CDATA[JavaScript 编码规范建议 本文就 JavaScript 编码过程中涉及的排版、命名、声明、作用域、及一些特殊符号的使用等方面，根据个人在学习工作中的总结，给出自己的一些建议，并分析其中缘由，... ]]></description>
			<content:encoded><![CDATA[<p>JavaScript 编码规范建议</p>
<p>本文就 JavaScript 编码过程中涉及的排版、命名、声明、作用域、及一些特殊符号的使用等方面，根据个人在学习工作中的总结，给出自己的一些建议，并分析其中缘由，以供参考。</p>
<p>JavaScript 文件引用</p>
<p>JavaScript 程序应该尽量放在 .js 的文件中，需要调用的时候在 HTML 中以 &lt;script src="filename.js"&gt; 的形式包含进来。JavaScript 代码若不是该 HTML 文件所专用的，则应尽量避免在 HTML 文件中直接编写 JavaScript 代码。因为这样会大大增加 HTML 文件的大小，无益于代码的压缩和缓存的使用。</p>
<p>另外，&lt;script src="filename.js"&gt; 标签应尽量放在文件的后面。这样会降低因加载 JavaScript 代码而影响页面中其它组件的加载时间。<span id="more-1399"></span></p>
<p>代码排版</p>
<p>行长度</p>
<p>每行代码应小于 80 个字符。如果代码较长，应尽量选择换行，下一行代码应缩进 8 个空格。这样可以使代码排版整齐，减轻阅读代码的疲劳感。换行缩进 8 个空格可以和代码段的缩进 4 个空格区分开，以增强代码的可阅读性。</p>
<p>行结束</p>
<p>JavaScript 语句应该以分号结束。但大多数浏览器允许不写分号，只要在本应是分号的地方有一个换行符就行。但是如果代码行较长需要换行的时候，有哪些注意事项呢？换行应选择在操作符和标点符号之后，最好是在逗号','之后，而不要在变量名、字符串、数字、或')' ']' '++' '--'等符号之后换行。</p>
<p>这样可以有效的防止拷贝、粘贴而引起的错误，并可有效地增强代码的可阅读性。请见清单 1，代码的输出符合我们的期望。但就写法而言，对 valueB 的赋值语句是在变量 valueA 之后进行的换行，这很容易被误解为 valueB=ValueA，给阅读造成障碍。而对 valueC 的复制语句是在'+'之后进行的换行，就容易理解的多。这也是本文所提倡的换行方式。<br />
清单 1. 行结束的位置<br />
   <br />
 &lt;script language="javascript"&gt;<br />
 var valueA = 1;<br />
 var valueB = valueA         ///bad<br />
       +1;<br />
 var valueC = valueB +      ///good<br />
       valueA;<br />
 alert(valueB);              //output: valueB=2<br />
 alert(valueC);//output: valueC=3<br />
 &lt;/script&gt; <br />
缩进</p>
<p>关于缩进的问题，不只是 JavaScript，几乎所有的语言编写的时候，都会提及缩进的问题。缩进几乎是代码编写规范的第一课，是代码可阅读性判断的直接因素。</p>
<p>代码缩进的好处是不言而喻的，但是对于如何缩进，则没有标准而言。最受欢迎的是方便使用 TAB 键缩进，也有些喜欢用 2 个、4 个、8 个空格进行缩进。这样缩进风格不一，也同样给代码的阅读带来障碍。</p>
<p>本文提倡用 4 个空格来进行缩进，并在同一产品中采用同一种缩进标准。不支持用 TAB 键进行缩进。这是因为直到现在还没有统一的标准来定义 TAB 键所代替的空白大小，有些编辑器解析为 4 个空格大小，有些则解析为 8 个。因而用不同的编辑器查看代码，可能造成格式混乱。当然 TAB 简单易用，为解决这个问题，建议在设置开发环境时，将编辑器里的 TAB 快捷键重新设置为 4 个空格。据了解 Eclipse, Vi, Nodepad++，Editplus, UltraEdit 等流行的编辑器，均提供了此功能。</p>
<p>注释</p>
<p>代码中的注释很重要，自然也是毋庸置疑的。通常我们会强调代码中注释数量的多少，而轻视了对注释质量的提高。编码是及时添加注释，会给后续代码的维护人员带来很大的便利。但是如果注释不注意更新，或者由于拷贝、粘贴引起的错误的注释，则会误导阅读人员，反而给阅读带来障碍。</p>
<p>除了注释要 及时更新外，我们还应对注释的内容要特别关注。注释要尽量简单、清晰明了，避免使用含混晦涩的语言，同时着重 注释的意义，对不太直观的部分进行注解。请见清单 2。<br />
清单 2. 有意义的注释<br />
 &lt;script language="javascript"&gt;<br />
 //following section is used to initialize golbal variables             (good)<br />
 var valueA = 0;     //initialize  valueA to be sero                       (bad)<br />
 var valueB = 1;<br />
 ...<br />
 //call f1 function after waiting for 50 seconds.                         (good)<br />
 setTimeout(f1,50000); //set timeout to be 20s                     (copy error)<br />
 ...<br />
 &lt;/script&gt; <br />
这样的注释方式在 JavaScript 代码中经常见到。"initialize valueA to be sero" 这样的注释有什么用呢？难道阅读程序的工程师从"var valueA = 0;"复制语句中看不出来么？"set timeout to be 20s"这条注释，不只是因拷贝、粘贴引起的时间大小的错误，同时也误导了程序员对这条语句的理解。setTimeout() 函数的作用并非是设置函数执行的超时时间，而是等待一定时间后执行所调用的函数，害人匪浅呀。这样的注释内容宁可删掉。</p>
<p>此外，JavaScript 的注释有两种"//" 和"/* .... */"，建议"//"用作代码行注释，"/* .... */"形式用作对整个代码段的注销，或较正式的声明中，如函数参数、功能、文件功能等的描述中。</p>
<p>标识符命名</p>
<p>JavaScript 中的标识符的命名规则：</p>
<p>•以字母、下划线'_'或美元符号'$'开头<br />
•允许名称中包含字母，数字，下划线'_'和美元符号'$'<br />
•区分大小写<br />
变量、参数、成员变量、函数等名称均以小写字母开头，构造器的名称以大写字母开头。下划线'_'开头的变量一般习惯于标识私有 / 局部成员。而美元符号'$'开头的变量习惯于标识系统相关，比如系统进程等。应避免用下划线'_'或美元符号'$'来命名标识符。尽可能地降低代码的阅读负担。</p>
<p>声明</p>
<p>变量的声明</p>
<p>尽管 JavaScript 语言并不要求在变量使用前先对变量进行声明。但我们还是应该养成这个好习惯。这样可以比较容易的检测出那些未经声明的变量，避免其变为隐藏的全局变量，造成隐患。</p>
<p>在函数的开始应先用 var 关键字声明函数中要使用的局部变量，注释变量的功能及代表的含义，且应以字母顺序排序。每个变量单独占一行，以便添加注释。这是因为 JavaScript 中只有函数的 {} 表明作用域，用 var 关键字声明的局部变量只在函数内有效，而未经 var 声明的变量则被视为全局变量。我们来看下清单 3。<br />
清单 3. 局部变量声明<br />
    &lt;script language="javascript"&gt;<br />
 var valueA  = "a";<br />
 var valueB  = "b";<br />
 function f1() {<br />
   var valueA = "c";<br />
   alert("valueA="+valueA);        //output: valueA=c<br />
   valueB = "d";<br />
   alert("valueB="+valueB);        //output: valueB=d<br />
 }<br />
 f1();<br />
 alert("valueA="+valueA);            //output: valueA=a<br />
 alert("valueB="+valueB);            //output: valueB=d<br />
 &lt;/script&gt; <br />
从上例的输出惊奇地发现，用 var 声明过的变量 valueA 和没有声明的变量 valueB 是有区别的。特别需要注意的是，在函数内部用 var 声明的变量为局部变量，这样可以有效地避免因局部变量和全局变量同名而产生的错误。</p>
<p>函数的声明</p>
<p>函数也应在调用前进行声明，内部函数应在 var 声明内部变量的语句之后声明，可以清晰地表明内部变量和内部函数的作用域。</p>
<p>此外，函数名紧接左括号'('之间，而右括号')'和后面的'{'之间要有个空格，以清楚地显示函数名以其参数部分，和函数体的开始。若函数为匿名 / 无名函数，则 function 关键字和左括号'('之间要留空格，否则可能误认为该函数的函数名为 function。<br />
清单 4. 内部函数声明<br />
    &lt;script language="javascript"&gt;<br />
 var innerA = 1;<br />
 function outF() {<br />
   var innerA = 2;<br />
   function _inF() {<br />
       alert("valueA="+innerA);<br />
   }<br />
   _inF();<br />
 }<br />
 outF();                         //output: valueA=2<br />
 _inF();                         //error: innerF is not defined<br />
 &lt;/script&gt; <br />
从清单 4 的输出可以看出，inF() 函数仅在 outF() 函数的内部生效，局部变量 innerA 对内部函数的作用域生效。这样的编码方式使得变量和函数的作用域变得清晰。</p>
<p>语句</p>
<p>对于简单语句而言，需要提及的仍然是分号必要性，同时，一行最多有一个语句。如果一个赋值语句是用函数和对象来赋值，可能需要跨多行，一定切记要在赋值语句末加上分号。</p>
<p>这是因为 JavaScript 中，所有表达式都可以当语句，遇换行符时会解析为表达式的结束，此时不规范的换行和分号的丢失，可能引入新的错误。</p>
<p>对于复合语句，if, for, while, do, switch, try … catch 等代码体，函数定义的函数体，对象的定义等都需要放在花括号'{}'里面。</p>
<p>•'{' 应在行末，标志代码块的开始。<br />
•'}' 应在一行开头，标志代码块的结束，同时需要和'{'所在行的开始对齐，以表明一个完整的复合语句段。这样可以极大地提高代码的可阅读性，控制逻辑能清晰地表现出来。<br />
•被包含的代码段应该再缩进 4 个空格。<br />
•即使被包含的代码段只有一句，也应该用花括号'{}'包含。尽管不用花括号代码也不会错，但如若需要增加语句的话，则较容易因花括号遗漏而引起的编译错误或逻辑错误。<br />
return语句在使用时也需慎重，如果用表达式的执行作为返回值，请把表达式和 return 放在同一行中，以免换行符被误解析为语句的结束而引起返回错误。return 关键字后若没有返回表达式，则返回 undefined。构造器的默认返回值为 this。<br />
清单 5. return 表达式<br />
    &lt;script language="javascript"&gt;<br />
 function F1() {<br />
   var valueA  = 1;<br />
   var valueB  = 2;<br />
   return valueA + valueB;<br />
 }<br />
 function F2() {<br />
   var valueA  = 1;<br />
   var valueB  = 2;<br />
   return<br />
       valueA + valueB;<br />
 }<br />
 alert( F1() );  //output: 3<br />
 alert( F2() );  //ouput: undefined<br />
 &lt;/script&gt; <br />
在清单 5 中显示了因返回表达式没有和 return 关键字放在同一行而引起的返回错误，需重视。</p>
<p>特殊符号</p>
<p>空白符</p>
<p>适当的空白行可以大大提高代码的可阅读性，可以使代码逻辑更清晰易懂。同时，在表达式中适当的留空白，也会给代码的阅读带来方便。</p>
<p>关键字的后面如有括号，则最好在关键字和左括号'('之间留空白，如 for, if, while 等。而函数名和括号之间则不宜留空白，但若是匿名函数，则必须在 function 和左括号'('之间留空白，否则，编辑器会误认为函数名为 function。</p>
<p>在表达式中，二元运算符 ( 除左括号'('，左方括号'['，作用域点'.') 和两个操作数之间最好留空白。一元运算符（若不是词 typeof 等）和其操作数之间不宜留空白。</p>
<p>逗号','的后面需要留空白，以显示明确的参数间隔，变量间隔等。</p>
<p>分号';'之后通常表明表达语句的结束，而应空行。在 for 的条件语句中，分号之后则应该留空白。</p>
<p>{ } 和 [ ]</p>
<p>在 JavaScript 中，如需定义空对象和空数组，通常很自然地想到用 new Object() 和 new Array() 的方法。其实花括号'{}'和方括号'[]'可以直接用来定义一个空对象和一个空数组。这种书写方法可以使代码看起来简单易懂。</p>
<p>== 和 ===</p>
<p>判断"逻辑等"在代码里太平常的不过事情了，但 JavaScript 与其他熟知的编程语言不同的是，除了可以使用两个等号'=='来作判断以为，还可以使用三个等号'==='来进行逻辑等判断。两者的不同是'=='作逻辑等判断时，会先进行类型转换后再进行比较。'==='则不会。因而，'=='进行的判断结果可能产生偏差。'!='与'!=='的区别亦是如此。本文提倡尽量使用'==='来进行逻辑等的判断，用'!=='进行逻辑不等的判断。<br />
清单 6. === 的使用<br />
    &lt;script language="javascript"&gt;<br />
 var valueA = "1";<br />
 var valueB = 1;<br />
 if ( valueA == valueB) {<br />
   alert("Equal");<br />
 }<br />
 else {<br />
   alert("Not equal")<br />
 }<br />
 //output: "Equal"<br />
 if ( valueA === valueB) {<br />
   alert("Equal");<br />
 }<br />
 else {<br />
   alert("Not equal")<br />
 }<br />
 //output: "Not equal"<br />
 &lt;/script&gt; <br />
清单 6 中，valueA 和 valueB 两个变量的值显然是不相等的，起码 valueA 是个字符串，而 valueB 是一个数字。但用'=='进行判断是，程序却输出相等的字样。这是因为编译器对两个变量进行比较时，因为他们的类型不同，而自动地将 valueB 转换成字符串，而后再和 valueA 进行比较的。用'==='得到的判断结果正和预期的结果相符。</p>
<p>+</p>
<p>加号'+'也同样是程序员所熟知的操作符之一。JavaScript 和其他编程语言不同的是，在 JavaScript 中，'+'除了表示数字值相加，字符串相连接以外，还可以作一元运算符用，把字符串转换为数字。因而如果使用不当，则可能与自增符'++'混淆而引起计算错误。这一点，在清单 7 中可以清楚地看出。<br />
清单 7. 巧用 + 号<br />
    &lt;script language="javascript"&gt;<br />
 var valueA = 20;<br />
 var valueB = "10";<br />
 alert( valueA + valueB);     //ouput: 2010<br />
 alert( valueA + (+valueB)); //output: 30<br />
 alert( valueA + +valueB);    //output:30<br />
 alert( valueA ++valueB);     //Compile error<br />
 &lt;/script&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1399/javascript-coding-standard-proposed/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress实现投稿功能</title>
		<link>http://pzg.me/web/1389/wordpress-submission-feature-to-achieve/</link>
		<comments>http://pzg.me/web/1389/wordpress-submission-feature-to-achieve/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 02:50:09 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1389</guid>
		<description><![CDATA[很多网站都想开放读者的投稿功能，接受读者的投稿，不仅可以丰富博客的内容，还可以增加与读者之间的沟通，可以说是一举多得的事情，何乐不为呢？WordPress本身并不提供投稿功能，但是Wo... ]]></description>
			<content:encoded><![CDATA[<p>很多网站都想开放读者的投稿功能，接受读者的投稿，不仅可以丰富博客的内容，还可以增加与读者之间的沟通，可以说是一举多得的事情，何乐不为呢？WordPress本身并不提供投稿功能，但是WordPress拥有强大的扩展能力，我们可以自己来添加这个功能。</p>
<p>实现用户投稿，有两种方法，一种是开放后台的注册功能，普通用户注册进去默认为投稿者，登陆进去即可添加文章（默认为草稿）；另一种方法是在前台提供投稿表单，用户填写相应的表格即可。前一种方法实现起来比较简单，基本不需要博主配置太多东西，只是有些博主可能会觉得别扭，不愿让他人看到自己的博客后台；而后一种方法对投稿者来说方便了很多，博主也不用担心自己博客的后台隐私，只是该方法实现起来比较麻烦，需要配置的东西很多。本文也只将介绍后一种方法，希望对你有所帮助。</p>
<p>一、添加投稿表单</p>
<p>1、首先在当前主题的目录下新建一个php文件，命名为tougao-page.php，然后将page.php中的所有代码复制到tougao-page.php中；</p>
<p>2、删除tougao-page.php开头的所有注释，即 /* 与 */ ，以及它们之间的所有内容；</p>
<p>3、将 &lt;?php the_content(); ?&gt; 改成以下代码：</p>
<p>&lt;?php the_content(); ?&gt;</p>
<p>&lt;form method="post" action="&lt;?php echo $_SERVER["REQUEST_URI"]; ?&gt;"&gt;<br />
    &lt;div style="text-align: left; padding-top: 10px;"&gt;<br />
        &lt;label&gt;昵称:*&lt;/label&gt;<br />
    &lt;/div&gt;<br />
    &lt;div&gt;<br />
        &lt;input type="text" size="40" value="" name="tougao_authorname" /&gt;<br />
    &lt;/div&gt;</p>
<p>    &lt;div style="text-align: left; padding-top: 10px;"&gt;<br />
        &lt;label&gt;E-Mail:*&lt;/label&gt;<br />
    &lt;/div&gt;<br />
    &lt;div&gt;<br />
        &lt;input type="text" size="40" value="" name="tougao_authoremail" /&gt;<br />
    &lt;/div&gt;<br />
                   <br />
    &lt;div style="text-align: left; padding-top: 10px;"&gt;<br />
        &lt;label&gt;您的博客:&lt;/label&gt;<br />
    &lt;/div&gt;<br />
    &lt;div&gt;<br />
        &lt;input type="text" size="40" value="" name="tougao_authorblog" /&gt;<br />
    &lt;/div&gt;<br />
                   <br />
    &lt;div style="text-align: left; padding-top: 10px;"&gt;<br />
        &lt;label&gt;文章标题:*&lt;/label&gt;<br />
    &lt;/div&gt;<br />
    &lt;div&gt;<br />
        &lt;input type="text" size="40" value="" name="tougao_title" /&gt;<br />
    &lt;/div&gt;</p>
<p>    &lt;div style="text-align: left; padding-top: 10px;"&gt;<br />
        &lt;label&gt;分类:*&lt;/label&gt;<br />
    &lt;/div&gt;<br />
    &lt;div style="text-align: left;"&gt;<br />
        &lt;?php wp_dropdown_categories('show_count=1&amp;hierarchical=1'); ?&gt;<br />
    &lt;/div&gt;<br />
                   <br />
    &lt;div style="text-align: left; padding-top: 10px;"&gt;<br />
        &lt;label&gt;文章内容:*&lt;/label&gt;<br />
    &lt;/div&gt;<br />
    &lt;div&gt;<br />
        &lt;textarea rows="15" cols="55" name="tougao_content"&gt;&lt;/textarea&gt;<br />
    &lt;/div&gt;<br />
                   <br />
    &lt;br clear="all"&gt;<br />
    &lt;div style="text-align: center; padding-top: 10px;"&gt;<br />
        &lt;input type="hidden" value="send" name="tougao_form" /&gt;<br />
        &lt;input type="submit" value="提交" /&gt;<br />
        &lt;input type="reset" value="重填" /&gt;<br />
    &lt;/div&gt;<br />
&lt;/form&gt;</p>
<p>二、添加表单处理代码</p>
<p>在tougao-page.php中，将第一个 &lt;?php 改成:</p>
<p>&lt;?php<br />
   <br />
if( isset($_POST['tougao_form']) &amp;&amp; $_POST['tougao_form'] == 'send')<br />
{<br />
    if ( isset($_COOKIE["tougao"]) &amp;&amp; ( time() - $_COOKIE["tougao"] ) &lt; 120 )<br />
    {<br />
        wp_die('您投稿也太勤快了吧，先歇会儿！');<br />
    }<br />
       <br />
    // 表单变量初始化<br />
    $name = isset( $_POST['tougao_authorname'] ) ? trim(htmlspecialchars($_POST['tougao_authorname'], ENT_QUOTES)) : '';<br />
    $email =  isset( $_POST['tougao_authoremail'] ) ? trim(htmlspecialchars($_POST['tougao_authoremail'], ENT_QUOTES)) : '';<br />
    $blog =  isset( $_POST['tougao_authorblog'] ) ? trim(htmlspecialchars($_POST['tougao_authorblog'], ENT_QUOTES)) : '';<br />
    $title =  isset( $_POST['tougao_title'] ) ? trim(htmlspecialchars($_POST['tougao_title'], ENT_QUOTES)) : '';<br />
    $category =  isset( $_POST['cat'] ) ? (int)$_POST['cat'] : 0;<br />
    $content =  isset( $_POST['tougao_content'] ) ? trim(htmlspecialchars($_POST['tougao_content'], ENT_QUOTES)) : '';<br />
   <br />
    // 表单项数据验证<br />
    if ( empty($name) || strlen($name) &gt; 20 )<br />
    {<br />
        wp_die('昵称必须填写，且长度不得超过20字');<br />
    }<br />
   <br />
    if ( empty($email) || strlen($email) &gt; 60 || !preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $email))<br />
    {<br />
        wp_die('Email必须填写，且长度不得超过60字，必须符合Email格式');<br />
    }<br />
   <br />
    if ( empty($title) || strlen($title) &gt; 100 )<br />
    {<br />
        wp_die('标题必须填写，且长度不得超过100字');<br />
    }<br />
   <br />
    if ( empty($content) || strlen($content) &gt; 3000 || strlen($content) &lt; 100)<br />
    {<br />
        wp_die('内容必须填写，且长度不得超过3000字，不得少于100字');<br />
    }<br />
   <br />
    $post_content = '昵称: '.$name.'&lt;br /&gt;Email: '.$email.'&lt;br /&gt;blog: '.$blog.'&lt;br /&gt;内容:'.$content;<br />
 <br />
    $tougao = array(<br />
        'post_title' =&gt; $title,<br />
        'post_content' =&gt; $post_content,<br />
        'post_category' =&gt; array($category)<br />
    );<br />
    // 将文章插入数据库<br />
    $status = wp_insert_post( $tougao );<br />
 <br />
    if ($status != 0)<br />
    {<br />
        setcookie("tougao", time(), time()+180);<br />
        wp_die('投稿成功！感谢投稿！');<br />
    }<br />
    else<br />
    {<br />
        wp_die('投稿失败！');<br />
    }<br />
}<br />
代码补充说明，如果你想让让投稿的文章立即发布，而不需要审核再编辑，那么请将以上代码45行改成：</p>
<p>'post_content' =&gt; $post_content, 'post_status' =&gt; 'publish',<br />
最后进入WordPress管理后台 – 页面 – 创建页面，标题为投稿（可以自己起名），内容填上投稿说明等，右侧可以选择模板，选择 tougao 即可好了，基本的投稿功能已经添加完毕，至于表单样式不好看，表单缺少你想要的项目等问题，你就自己添加css、表单项吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1389/wordpress-submission-feature-to-achieve/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MYSQL数据表能存多少条数据</title>
		<link>http://pzg.me/web/1382/mysql-how-many-tables-can-store-data/</link>
		<comments>http://pzg.me/web/1382/mysql-how-many-tables-can-store-data/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 03:11:38 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1382</guid>
		<description><![CDATA[两个方面来说，理论值和实际应用值。 如果说只是为了存储的话 那么这个理论值是可以参考的 在mysql中，每个数据库最多可创建20亿个表，一个表允许定义1024列，每行的最大长度为8092字节（... ]]></description>
			<content:encoded><![CDATA[<p>两个方面来说，理论值和实际应用值。</p>
<p>如果说只是为了存储的话 那么这个理论值是可以参考的<br />
在mysql中，每个数据库最多可创建20亿个表，一个表允许定义1024列，每行的最大长度为8092字节（不包括文本和图像类型的长度）。当表中定义有varchar、nvarchar或varbinary类型列时，如果向表中插入的数据行超过8092字节时将导致Transact-SQL语句失败，并产生错误信息。SQL Server对每个表中行的数量没有直接限制，但它受数据库存储空间的限制。每个数据库的最大空间1048516TB，所以一个表可用的最大空间为1048516TB减去数据库类系统表和其它数据库对象所占用的空间。</p>
<p>如果说要考虑到信息的读取和查询的话，个人建议20-30W 就已经需要做特殊处理了。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1382/mysql-how-many-tables-can-store-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress社区外挂BuddyPress</title>
		<link>http://pzg.me/web/1379/wordpress-plugin-buddypress-community/</link>
		<comments>http://pzg.me/web/1379/wordpress-plugin-buddypress-community/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 00:38:03 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1379</guid>
		<description><![CDATA[很多架站软件都可以让你的网站变成完整的社群网站，其中最常见的就是Discuz论坛系统，透过他并搭配UCHome就可以让网站变成一个小型的社群网站，就跟Facebook一样可以有相簿、个人信息、博客... ]]></description>
			<content:encoded><![CDATA[<p>很多架站软件都可以让你的网站变成完整的社群网站，其中最常见的就是Discuz论坛系统，透过他并搭配UCHome就可以让网站变成一个小型的社群网站，就跟Facebook一样可以有相簿、个人信息、博客、加好友等等，很方便。但你知道吗？世界上最多人使用的博客系统WordPress也可以摇身一变成为社群网站！</p>
<p>BuddyPress是WordPress MU的一个外挂，后来被WordPress买下来了，感觉就是要强大WordPress的社群功能，由官方接手开发吧！不过别担心，这个外挂和WordPress一样都使是免费的，只要你安装了WordPress并启动MU功能就可以安装这个社群网站外挂，让你的网站也可以成为热闹的社群系统。</p>
<p>越来越多网站走向社群平台，就连WordPress也迈向这一块市场，虽说WordPress本身会员机制很阳春，不过搭配上BuddyPress倒是可以增强一下下，实际上还是有别于论坛或是CMS系统的会员机制，只能透过外挂来加强或是期待未来官方可以着手于会员系统的开发、强化。</p>
<p>这个BuddyPress是一款WordPress的外挂系统，必须搭配WordPress MU才可以使用。安装完外挂后会提供您一个互动的社群平台，可以建立群组（小圈圈）、发表个人即时讯息状态、私人短讯、个人名片、发表讨论主题（附有讨论区功能），若有启动博客功能，每个用户还可以拥有个人博客，只要有新文章发表都会显示在讨论区上面或是个人状态。如果弄成功的话，就会像WordPress.com这个网站一样喔！</p>
<p>插件名称：BuddyPress</p>
<p>官方网站：http://buddypress.org/</p>
<p>备注事项：需先安装WordPress并启动WordPress MU功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1379/wordpress-plugin-buddypress-community/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

