<?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>Thu, 26 Apr 2012 08:13:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>php open_basedir设置以及关于安全</title>
		<link>http://pzg.me/web/1877/php-open_basedir-is-set-as-well-as-on-security/</link>
		<comments>http://pzg.me/web/1877/php-open_basedir-is-set-as-well-as-on-security/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 08:13:05 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1877</guid>
		<description><![CDATA[open_basedir可将用户访问文件的活动范围限制在指定的区域，通常是其家目录的路径，也可用符号"."来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。 举例来说: 若"open_b... ]]></description>
			<content:encoded><![CDATA[<p>open_basedir可将用户访问文件的活动范围限制在指定的区域，通常是其家目录的路径，也可用符号"."来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。<br />
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/other"都是可以访问的。所以如果要将访问限制在仅为指定的目录，请用斜线结束路径名。<br />
open_basedir也可以同时设置多个目录,在Windows中用分号分隔目录,在任何其它系统中用冒号分隔目录。当其作用于Apache模块时，父目录中的open_basedir路径自动被继承。</p>
<p>Apache+PHP配置方法有三种：<br />
方法一：在php.ini里配置<br />
open_basedir = .:/tmp/</p>
<p>方法二：在Apache配置的VirtualHost里设置(httpd-vhosts.conf)<br />
php_admin_value open_basedir .:/tmp/</p>
<p>方法三：在Apache配置的Direcotry里设置<br />
php_admin_value open_basedir .:/tmp/</p>
<p>关于三个配置方法的解释：<br />
a、方法二的优先级高于方法一，也就是说方法二会覆盖方法一；方法三的优先级高于方法二，也就是说方法三会覆盖方法二；<br />
b、配置目录里加了“/tmp/”是因为php默认的临时文件（如上传的文件、session等）会放在该目录，所以一般需要添加该目录，否则部分功能将无法使用；<br />
c、配置目录里加了“.”是指运行php文件的当前目录，这样做可以避免每个站点一个一个设置；<br />
d、如果站点还使用了站点目录外的文件，需要单独在对应VirtualHost设置该目录；</p>
<p>------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br />
这里是我实验的一个例子,设置了两个host，当然一块把Apache设置vitualHost的方法也列出了：</p>
<p>#虚拟主机配置文件</p>
<p>NameVirtualHost *:80</p>
<p>#简单设置模式<br />
<virtualhost *:80><br />
    ServerAdmin admin@8100.cc<br />
    DocumentRoot "C:/AWEB/phproot/test"<br />
    ServerName localhost<br />
    #ServerAlias www.test.com<br />
    ErrorLog "logs/error.log"<br />
    CustomLog "logs/access.log" common<br />
</virtualhost><br />
#详细设置模式<br />
<virtualhost *:80><br />
    ServerAdmin admin@cc.cc<br />
    DocumentRoot "C:/AWEB/phproot/test2"<br />
    ServerName www.test2.com<br />
    # php_admin_value open_basedir C:/AWEB/phproot/test2/;C:/windows/temp/     放在这里也可以<br />
    <directory "C:/AWEB/phproot/test2"><br />
          Options Indexes FollowSymLinks<br />
          AllowOverride Options FileInfo<br />
         Order allow,deny<br />
         Allow from all<br />
         DirectoryIndex index.htm index.html index.php<br />
        php_admin_value open_basedir c:/AWEB/phproot/test2/;C:/windows/temp/<br />
  </directory><br />
         Alias /phpmyadmin "C:/AWEB/phpMyAdmin/"<br />
          <directory "C:/AWEB/phpMyAdmin"><br />
           AllowOverride AuthConfig<br />
           Order allow,deny<br />
           Allow from all<br />
         </directory><br />
    ErrorLog "logs/error.log"<br />
    CustomLog "logs/access.log" common<br />
</virtualhost></p>
<p>------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br />
最后转军神的那两句话：</p>
<p>一、open_basedir中处理文件路径时没有严格考虑目录的存在，这将导致本地包含或者本地文件读取的绕过（合并/aaa/../../导致linux的目录检查作废）。</p>
<p>二、open_basedir的值配置不当，有可能导致目录跨越（配置时忘记目录最后的斜杠 / ）。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1877/php-open_basedir-is-set-as-well-as-on-security/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>怎样用PHP+MYSQL做留言板？</title>
		<link>http://pzg.me/web/1875/the-message-board-the-the-how-to-use-php-mysql/</link>
		<comments>http://pzg.me/web/1875/the-message-board-the-the-how-to-use-php-mysql/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 06:18:24 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1875</guid>
		<description><![CDATA[一、编程之前的分析  要做一个留言板，而且我们也决定了采用数据库方式做，所以我们要从以下几个步骤开始做：  1.填写留言  在什么地方写留言?  2.传送留言  在文本框中输入了数据后肯... ]]></description>
			<content:encoded><![CDATA[<p>一、编程之前的分析 </p>
<p>要做一个留言板，而且我们也决定了采用数据库方式做，所以我们要从以下几个步骤开始做： </p>
<p>1.填写留言 </p>
<p>在什么地方写留言? </p>
<p>2.传送留言 </p>
<p>在文本框中输入了数据后肯定要以什么方式传到一个什么文件，而后一个文件又是这么接收变量的。 </p>
<p>3.入数据库 </p>
<p>后一个文件将接收的数据要进入数据库，所以，我们还要掌握这么往数据库中写入数据。 </p>
<p>4.查看结果 </p>
<p>将留言写入数据库后，主要是为了能在浏览器中查看，所以，我们要知道这么从数据库中读出数据。 </p>
<p>二、做一个填写留言的文件（write.htm） </p>
<p>&lt;form action="write_ok.php" method="post"&gt;</p>
<p>请输入您的昵称：&lt;input type="text" name="nickname"&gt;&lt;br&gt;</p>
<p>请留言：&lt;textarea name="note"&gt;&lt;/textarea&gt;&lt;br&gt;</p>
<p>&lt;input type="submit" value="确定"&gt;</p>
<p>&lt;/form&gt;<br />
三、PHP变量传送 </p>
<p>熟悉ASP的朋友可能知道，从一个文件传送变量到另一个文件后，第二个文件是request接收数据的；<br />
而PHP似乎更简单，当一个文件将变量传送到另一个文件后，自动产生一个变量，<br />
下面，我将ASP和PHP分别举个例子。 </p>
<p>1.ASP: </p>
<p>form.htm: </p>
<p>form action="asp_to.asp" method="post"&gt; </p>
<p>输入昵称：&lt; input type="text" name="nickname"&gt; </p>
<p>&lt;input type="submit" value="确定"&gt;</p>
<p>&lt;/form&gt;</p>
<p>asp_to.asp</p>
<p>您输入的昵称是：&lt;% response.write(request.form("nickname")) %&gt;</p>
<p>简单说明：在第一个文件中，有一个文本框，其名为nickname 和一个确定按钮，在文本框中输入信息后，<br />
点“确定”，浏览器将提交到asp_to.asp 该文件将你在文本框中的内容显示出来，response.write就是显<br />
示输出，而request就是接收变量“nickname”。 </p>
<p>2.PHP： </p>
<p>form.htm: </p>
<p>该文件和上面的相同，只是将asp_to.asp改为php_to.php，也就是将输入的变量提交到一个名为php_to.php<br />
的PHP文件。 </p>
<p>php_to.php： </p>
<p>您输入的昵称是：&lt;? echo $nickname； ?&gt; </p>
<p>如此而已，其中echo为显示输出，相当于ASP中的 response.write 而$表示变量，PHP的变量用$表示。</p>
<p>四、PHP操作数据库 </p>
<p>在上一节中，我介绍了MySQL数据库和数据表的建立。下面，将从一个例子简单介绍PHP操作数据库的方式。</p>
<p>[ 例一 ]</p>
<p>&lt;?</p>
<p>$id=mysql_connect('localhost','root','adminpassword'); </p>
<p>$db=mysql_select_db('gsbook',$id); </p>
<p>$result=mysql_query('select * from gsbook',$db); </p>
<p>$maxrows=mysql_num_rows($result); </p>
<p>for ($i=0;$i&lt;$maxrows;$i++) { </p>
<p>$nickname[$i]=mysql_result($result,$i,'nickname'); </p>
<p>} </p>
<p>for ($i=$i-1;$&gt;=0;$i--) </p>
<p>{ </p>
<p>echo "nickname:".$nickname[$i]."&lt;br&gt;"; </p>
<p>} </p>
<p>&nbsp;</p>
<p>?&gt; 简单说明： </p>
<p>1.函数 int mysql_connect(string [ hostname ][:port],string [username],string [password])<br />
返回一个MySql的连接ID，其参数相信大家一看就知道。 </p>
<p>2.函数 int mysql_select_db(string database_name, int [ link_identifier ])用来打开数据库，<br />
第一个函数为数据库名称，第二个为MySQL的连接ID，返回值为ture或false </p>
<p>3.函数 int mysql_query(string query, int [ link_identifier])返回一个结果(result) </p>
<p>4.函数 int mysql_num_rows(int result)返回query的行数。 </p>
<p>5.函数 int mysql_result(int result,int row,mixed field)该函数返回某字段在某行的结果，<br />
第二个参数为行数，第三个参数为字段名；需要说明的是，该字段名并不是物理字段名，<br />
比如： select field1 as alias_field from table1 那么，在该函数中的第三个参数必须为<br />
 alias_field 而不是 field1。 </p>
<p>6.PHP中的循环语句: </p>
<p>(1)do ... while </p>
<p>(2)while ... [end while] </p>
<p>(3)for (expr1;expr2;expr3)</p>
<p>和C差不多的，在这里不再详细介绍。 </p>
<p>7.在上例中，用了两个for循环语句，第一个用来将数据库中的值读到一个数组中，第二个用来将数组中<br />
的值显示出来。注意第二个for循环的“$i=$i-1;”这是因为在第一个循环后变量$i的值已经自加了1；<br />
所以从数组中取值时，应该减去1。 </p>
<p>8.PHP中字符串的相加用“.”,相当于ASP中（VB语法）的“+”或“&amp;”。 </p>
<p>9.所以，上面代码实现的功能就是从数据库中读出数据，并显示出来。 </p>
<p>下面，我们来向数据库中添加一条记录，先看代码[ 例二 ]：</p>
<p>&lt;?</p>
<p>$id=mysql_connect('localhost','root','adminpassword');</p>
<p>$db=mysql_select_db('gsbook',$id); </p>
<p>$sql='insert into gsbook values('.chr(39).$nickname.chr(39).')'; </p>
<p>if (mysql_query($sql,$db)&gt;0) </p>
<p>{ </p>
<p>echo "OK"; </p>
<p>}</p>
<p>else</p>
<p>{ </p>
<p>echo "Failed!"; </p>
<p>}</p>
<p>?&gt;</p>
<p>简单说明： 1.对于熟悉SQL语句的朋友，看了例一的简单介绍后一定知道例二的功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1875/the-message-board-the-the-how-to-use-php-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>十天学会PHP</title>
		<link>http://pzg.me/web/1874/ten-days-learn-to-php/</link>
		<comments>http://pzg.me/web/1874/ten-days-learn-to-php/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 06:16:41 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1874</guid>
		<description><![CDATA[十天学会php之第一天 　　以 Apache web server 和 MY SQL 作为WEB服务器和数据库在php-4.3.3下的环境做程序简单的构建和访问查看数据库用 PHPMYADMIN。 　　PHP的语法: 　　1、嵌入方法： 　　PHP可以是以... ]]></description>
			<content:encoded><![CDATA[<p>十天学会php之第一天</p>
<p>　　以 Apache web server 和 MY SQL 作为WEB服务器和数据库在php-4.3.3下的环境做程序简单的构建和访问查看数据库用 PHPMYADMIN。</p>
<p>　　PHP的语法:</p>
<p>　　1、嵌入方法：</p>
<p>　　PHP可以是以&lt;?php或者是&lt;?为开始符号，结束符号是?&gt;，当然也可以自己指定。</p>
<p>　　2、引用文件：</p>
<p>　　引用文件的方法有两种：require 及 include。</p>
<p>　　require 的使用方法如 require("MyRequireFile.php"); 。这个函数通常放在 PHP 程序的最前面，PHP 程序在执行前，就会先读入 require 所指定引入的文件，使它变成 PHP 程序网页的一部份。常用的函数，亦可以这个方法将它引入网页中。</p>
<p>　　include 使用方法如 include("MyIncludeFile.php"); 。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时，才将它读进来。这种方式，可以把程序执行时的流程简单化。</p>
<p>　　3、注释方法：</p>
<p>&lt;?php<br />
echo "这是第一种例子。\n" ; // 本例是 C++ 语法的注释<br />
/* 本例采用多行的<br />
注释方式 */<br />
echo "这是第二种例子。\n" ;<br />
echo "这是第三种例子。\n" ; # 本例使用 UNIX Shell 语法注释<br />
?&gt;</p>
<p>　　4、变量类型：</p>
<p>$mystring = "我是字符串" ;<br />
$NewLine = "换行了\n" ;<br />
$int1 = 38 ;<br />
$float1 = 1.732 ;<br />
$float2 = 1.4E+2 ;<br />
$MyArray1 = array( "子" , "丑" , "寅" , "卯" );</p>
<p>这里引出两个问题:第一PHP变量以"$"开头,第二PHP语句以";"结尾。这两个遗漏也是程序上大多错误所在。</p>
<p>　　5、运算符号：</p>
<p>数学运算：</p>
<p>符号    意义 <br />
+      加法运算 <br />
-       减法运算 <br />
*       乘法运算 <br />
/       除法运算 <br />
%    取余数 <br />
++   累加 <br />
--     递减 </p>
<p>　　字符串运算：</p>
<p>　　运算符号只有一个，就是英文的句号"."。它可以将字符串连接起来，变成合并的新字符串。</p>
<p>&lt;?<br />
$a = "PHP 4" ;<br />
$b = "功能强大" ;<br />
echo $a.$b;<br />
?&gt;</p>
<p>　　这里也引出两个问题，首先PHP中输出语句是echo，第二类似ASP中的&lt;%=变量%&gt;，PHP中也可以&lt;?=变量?&gt;。</p>
<p>逻辑运算：<br />
符号 意义 <br />
&lt;       小于 <br />
&gt;       大于 <br />
&lt;=  小于或等于 <br />
&gt;=  大于或等于 <br />
==     等于 <br />
!=     不等于 <br />
&amp;&amp;    而且 (And) <br />
and   而且 (And) <br />
||        或者 (Or) <br />
or      或者 (Or) <br />
xor    异或 (Xor) <br />
!          不 (Not) </p>
<p>今天就说到这里，明天说一下流程控制。</p>
<p>十天学会php之第二天<br />
学习目的：掌握php的流程控制</p>
<p>1、if..else 循环有三种结构</p>
<p>第一种是只有用到 if 条件，当作单纯的判断。解释成 "若发生了某事则怎样处理"。语法如下：</p>
<p>if (expr) { statement }</p>
<p>其中的 expr 为判断的条件，通常都是用逻辑运算符号当判断的条件。而 statement 为符合条件的执行部分程序，若程序只有一行，可以省略大括号 {}。</p>
<p>范例：本例省略大括号。</p>
<p>&lt;?php<br />
if ($state==1)echo "哈哈" ;<br />
?&gt;</p>
<p>这里特别注意的是，判断是否相等是==而不是=，ASP程序员可能常犯这个错误，= 是赋值。</p>
<p>范例：本例的执行部分有三行，不可省略大括号。</p>
<p>&lt;?php<br />
if ($state==1) {<br />
echo "哈哈 ;<br />
echo "&lt;br&gt;" ;<br />
}<br />
?&gt;<br />
第两种是除了 if 之外，加上了 else 的条件，可解释成 "若发生了某事则怎样处理，否则该如何解决"。语法如下</p>
<p>if (expr) { statement1 } else { statement2 } 范例：上面的例子来修改成更完整的处理。其中的 else 由于只有一行执行的指令，因此不用加上大括号。</p>
<p>&lt;?php<br />
if ($state==1) {<br />
echo "哈哈" ;<br />
echo "&lt;br&gt;";<br />
}<br />
else{<br />
echo "呵呵";<br />
echo "&lt;br&gt;";<br />
}<br />
?&gt;<br />
第三种就是递归的 if..else 循环，通常用在多种决策判断时。它将数个 if..else 拿来合并运用处理。</p>
<p>直接看下面的例子</p>
<p>&lt;?php<br />
if ( $a &gt; $b ) {<br />
echo "a 比 b 大" ;<br />
} elseif ( $a == $b ) {<br />
echo "a 等于 b" ;<br />
} else {<br />
echo "a 比 b 小" ;<br />
}<br />
?&gt;</p>
<p>上例只用二层的 if..else 循环，用来比较 a 和 b 两个变量。实际要使用这种递归 if..else 循环时，请小心使用，因为太多层的循环容易使设计的逻辑出问题，或者少打了大括号等，都会造成程序出现莫名其妙的问题。</p>
<p>2、 for 循环就单纯只有一种，没有变化，它的语法如下</p>
<p>for (expr1; expr2; expr3) { statement }</p>
<p>其中的 expr1 为条件的初始值。expr2 为判断的条件，通常都是用逻辑运算符号 (logical operators) 当判断的条件。expr3 为执行 statement 后要执行的部份，用来改变条件，供下次的循环判断，如加一..等等。而 statement 为符合条件的执行部分程序，若程序只有一行，可以省略大括号 {}。</p>
<p>下例是用 for 循环写的的例子。</p>
<p>&lt;?php<br />
for ( $i = 1 ; $i &lt;= 10 ; $i ++) {<br />
echo "这是第".$i."次循环&lt;br&gt;" ;<br />
}<br />
?&gt;</p>
<p>3、 switch 循环，通常处理复合式的条件判断，每个子条件，都是 case 指令部分。在实作上若使用许多类似的 if 指令，可以将它综合成 switch 循环。</p>
<p>语法如下</p>
<p>switch (expr) { case expr1: statement1; break; case expr2: statement2; break; default: statementN; break; }</p>
<p>其中的 expr 条件，通常为变量名称。而 case 后的 exprN，通常表示变量值。冒号后则为符合该条件要执行的部分。注意要用 break 跳离循环。</p>
<p>&lt;?php<br />
switch ( date ( "D" )) {<br />
case "Mon" :<br />
echo "今天星期一" ;<br />
break;<br />
case "Tue" :<br />
echo "今天星期二" ;<br />
break;<br />
case "Wed" :<br />
echo "今天星期三" ;<br />
break;<br />
case "Thu" :<br />
echo "今天星期四" ;<br />
break;<br />
case "Fri" :<br />
echo "今天星期五" ;<br />
break;<br />
default:<br />
echo "今天放假" ;<br />
break;<br />
}<br />
?&gt;</p>
<p>这里需要注意的是break;别遗漏了，default，省略是可以的。<br />
很明显的，上述的例子用 if 循环就很麻烦了。当然在设计时，要将出现机率最大的条件放在最前面，最少出现的条件放在最后面，可以增加程序的执行效率。上例由于每天出现的机率相同，所以不用注意条件的顺序。</p>
<p>今天就说到这里，明天开始说数据库的使用。</p>
<p>十天学会php之第三天<br />
学习目的：学会构建数据库</p>
<p>在PHP中，MY SQL的命令行编辑可能会令初学者感到很麻烦，不要紧，你下载一个PHPMYADMIN安装一下，以后建立编辑数据库可以靠它了。</p>
<p>下面说一下它的使用。<br />
进入了phpmyadmin后，我们首先需要建立一个数据库，<br />
Language (*) 这里选择中文简体，然后在左边的 创建一个新的数据库 这里填写数据库名字，点击创建即可。</p>
<p>然后在左边下拉菜单中选择那个已经创建的数据库。在下面的</p>
<p>在数据库 shop 中创建一个新表 :<br />
名字 :<br />
字段数 :</p>
<p>中填写表名字和大致你认为的字段数（不够或者多了都不要紧，以后可以再添加或者缺省），按执行。<br />
然后就可以开始建立表了。<br />
第一栏是字段的名字；第二栏选择字段类型：<br />
我们常用的是以下几个：<br />
1）VARCHAR，文本类型<br />
2）INT，整数类型<br />
3）FLOAT，浮点数类型<br />
4）DATE，日期型<br />
5）大家或许会问，自动添加的ID在哪里？这个只要选择INT类型，在后面的额外中选择 auto_increment 就可以了。</p>
<p>建立了表以后，可以在左边看到你建立的表，点击以后，你可以：<br />
1）按右边的结构：查看修改表结构<br />
2）按右边的浏览：查看表中的数据<br />
3）按右边的SQL：运行SQL语句<br />
4）按右边的插入：插入一行记录<br />
5）按右边的清空：删除表中所有记录<br />
6）按右边的删除：删除表</p>
<p>还有一个很重要的功能就是导入和导出，当我们本机做好了程序和数据库的时候，需要在服务器上也有一个本地镜像，如果是ASP的ACCESS简单了，直接上传MDB文件即可，如果是SQL SERVER也可以连接远端服务器进行导入。那么MY SQL中你可以导出所有的SQL语句，到了远端服务器的PHPMYADMIN上，创建数据库后按SQL，粘帖你刚才复制下来的所有本级生成的SQL语句即可。</p>
<p>今天就说到这里，明天继续说数据库操作。<br />
十天学会php之第四天<br />
学习目的：学会连接数据库</p>
<p>PHP简直就是一个函数库，丰富的函数使PHP的某些地方相当简单。建议大家down一本PHP的函数手册，总用的到。</p>
<p>我这里就简单说一下连接MYSQL数据库。</p>
<p>1、mysql_connect</p>
<p>打开 MySQL 服务器连接。<br />
语法: int mysql_connect(string [hostname] [:port], string [username], string [password]); 返回值: 整数</p>
<p>本函数建立与 MySQL 服务器的连接。其中所有的参数都可省略。当使用本函数却不加任何参数时，参数 hostname 的默认值为 localhost、参数 username 的默认值为 PHP 执行行程的拥有者、参数 password 则为空字符串 (即没有密码)。而参数 hostname 后面可以加冒号与端口号，代表使用哪个端口与 MySQL 连接。当然在使用数据库时，早点使用 mysql_close() 将连接关掉可以节省资源。</p>
<p>2、 mysql_select_db</p>
<p>选择一个数据库。<br />
语法: int mysql_select_db(string database_name, int [link_identifier]); 返回值: 整数</p>
<p>本函数选择 MySQL 服务器中的数据库以供之后的资料查询作业 (query) 处理。成功返回 true，失败则返回 false。</p>
<p>最简单的例子就是：<br />
$conn=mysql_connect ("127.0.0.1", "", "");<br />
mysql_select_db("shop");<br />
连接机MY SQL数据库，打开SHOP数据库。在实际应用中应当加强点错误判断。</p>
<p>今天就说到这里，明天再说一下数据库的读取。</p>
<p>十天学会php之第五天<br />
学习目的：学会读取数据</p>
<p>先看两个函数：<br />
1、mysql_query<br />
送出一个 query 字符串。 语法: int mysql_query(string query, int [link_identifier]); 返回值: 整数</p>
<p>本函数送出 query 字符串供 MySQL 做相关的处理或者执行。若没有指定 link_identifier 参数，则程序会自动寻找最近打开的 ID。当 query 查询字符串是 UPDATE、INSERT 及 DELETE 时，返回的可能是 true 或者 false；查询的字符串是 SELECT 则返回新的 ID 值，当返回 false 时，并不是执行成功但无返回值，而是查询的字符串有错误。</p>
<p>2、mysql_fetch_object 返回类资料。 语法: object mysql_fetch_object(int result, int [result_typ]); 返回值: 类</p>
<p>本函数用来将查询结果 result 拆到类变量中。若 result 没有资料，则返回 false 值。</p>
<p>看一个简单的例子：<br />
&lt;?<br />
$exec="select * from user";<br />
$result=mysql_query($exec);<br />
while($rs=mysql_fetch_object($result))<br />
{<br />
echo "username:".$rs-&gt;username."&lt;br&gt;";<br />
}<br />
?&gt;<br />
当然，表user中有一个username的字段，这就类似asp中的<br />
&lt;%<br />
exec="select * from user"<br />
set rs=server.createobject("adodb.recordset")<br />
rs.open exec,conn,1,1<br />
do while not rs.eof<br />
response.write "username:"&amp;rs("username")&amp;"&lt;br&gt;"<br />
rs.movenext<br />
loop<br />
%&gt;<br />
当然先要连接数据库，一般我们 require_once('conn.php');而conn.php里面就是上一次说的连接数据库的代码。</p>
<p>小小的两条命令可以完成读取数据的工作了，今天说到这里下一次说数据的添加删除修改。</p>
<p>十天学会php之第六天<br />
学习目的：学会添加删除修改数据</p>
<p>mysql_query($exec);<br />
单这个语句就可以执行所有的操作了，不同的就是$exec这个sql语句</p>
<p>添加：$exec="insert into tablename (item1,item2) values ('".$_POST['item1']."',".$_POST['item1'].")";</p>
<p>删除：$exec="delete from tablename where...";</p>
<p>修改：$exec="update tablename set item1='".$_POST['item1']."' where ...";</p>
<p>说到这里就要说一下表单和php变量传递，如果表单中的一个 &lt;input name="item1" type="text" id="item1"&gt;<br />
表单以POST提交的，那么处理表单文件就可以用$_POST['item1']得到变量值，同样以GET提交的就是$_GET['item1']</p>
<p>是不是很简单？但是通常$exec会有问题，因为可能您的SQL语句会很长，您会遗漏.连接符，或者'来包围字符型字段。<br />
我们可以注释mysql_query($exec);语句用echo $exec;代替来输出$exec以检查正确性。如果您还不能察觉$exec有什么错误的话，可以复制这个sql语句到phpmyadmin中执行，看看它的出错信息。还有需要注意的是，我们不要使用一些敏感的字符串作为字段名字，否则很可能会出现问题，比如说date什么的。变量的命名，字段的命名遵循一点规律有的时候对自己是一种好处，初学者并不可忽视其重要性。</p>
<p>今天就说到这里，大家可以DOWN一个SQL语句的参考手册，再研究研究。明天继续说SESSION。</p>
<p>十天学会php之第七天<br />
学习目的：学会SESSION的使用</p>
<p>SESSION的作用很多，最多用的就是站点内页面间变量传递。</p>
<p>在页面开始我们要session_start();开启SESSION；<br />
然后就可以使用SESSION变量了，比如说要赋值就是：$_SESSION['item']="item1";要得到值就是$item1=$_SESSION['item'];，很简单吧。这里我们可能会使用到一些函数，比如说判断是不是某SESSION变量为空，可以这么写：empty($_SESSION['inum'])返回true or false。</p>
<p>下面综合一下前面所说的我们来看一个登陆程序，判断用户名密码是否正确。<br />
登陆表单是这样：login.php<br />
&lt;table width="100%" height="100%" border="0" align="center" cellpadding="0" cellspacing="0"&gt;<br />
&lt;tr&gt;<br />
&lt;form action="checklogin.php" method="post"&gt;&lt;td align="center" valign="middle"&gt;&lt;table width="400" border="0" cellpadding="5" cellspacing="1"&gt;<br />
&lt;tr&gt;<br />
&lt;td colspan="2"&gt;&lt;div align="center"&gt;Administrators Login&lt;/div&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;div align="center"&gt;Username&lt;/div&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;div align="center"&gt;<br />
&lt;input name="username" type="text" id="username"&gt;<br />
&lt;/div&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;div align="center"&gt;Password&lt;/div&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;div align="center"&gt;<br />
&lt;input name="password" type="password" id="password"&gt;<br />
&lt;/div&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td colspan="2"&gt;&lt;div align="center"&gt;<br />
&lt;input type="submit" name="Submit" value="Submit"&gt;<br />
&lt;input type="reset" name="Submit2" value="Clear"&gt;<br />
&lt;/div&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;&lt;/td&gt;&lt;/form&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;</p>
<p>处理文件是这样<br />
&lt;?<br />
require_once('conn.php');<br />
session_start();<br />
$username=$_POST['username'];<br />
$password=$_POST['password'];<br />
$exec="select * from admin where username='".$username."'";<br />
if($result=mysql_query($exec))<br />
{<br />
  if($rs=mysql_fetch_object($result))<br />
  {<br />
    if($rs-&gt;password==$password)<br />
    {<br />
      $_SESSION['adminname']=$username;<br />
      header("location:index.php");<br />
    }<br />
    else<br />
    {<br />
      echo "&lt;script&gt;alert('Password Check Error!');location.href='login.php';&lt;/script&gt;";<br />
    }<br />
  }<br />
  else<br />
  {<br />
  echo "&lt;script&gt;alert('Username Check Error!');location.href='login.php';&lt;/script&gt;";<br />
  }<br />
  }<br />
else<br />
{<br />
echo "&lt;script&gt;alert('Database Connection Error!');location.href='login.php';&lt;/script&gt;";<br />
}</p>
<p>?&gt;</p>
<p>conn.php是这样：<br />
&lt;?<br />
$conn=mysql_connect ("127.0.0.1", "", "");<br />
mysql_select_db("shop");<br />
?&gt;</p>
<p>由于 $_SESSION['adminname']=$username;我们可以这样写验证是否登陆语句的文件：checkadmin.php<br />
&lt;?<br />
session_start();<br />
if($_SESSION['adminname']=='')<br />
{<br />
echo "&lt;script&gt;alert('Please Login First');location.href='login.php';&lt;/script&gt;";<br />
}<br />
?&gt;</p>
<p>呵呵，今天说到这里，明天说一下怎么弄一个分页。</p>
<p>十天学会php之第八天<br />
学习目的：做一个分页显示</p>
<p>关键就是用到了SQL语句中的limit来限定显示的记录从几到几。我们需要一个记录当前页的变量$page，还需要总共的记录数$num</p>
<p>对于$page如果没有我们就让它=0，如果有&lt;0就让它也=0，如果超过了总的页数就让他=总的页数。</p>
<p>$execc="select count(*) from tablename ";<br />
$resultc=mysql_query($execc);<br />
$rsc=mysql_fetch_array($resultc);<br />
$num=$rsc[0];</p>
<p>这样可以得到记录总数<br />
ceil($num/10))如果一页10记录的话，这个就是总的页数</p>
<p>所以可以这么写<br />
if(empty($_GET['page']))<br />
{<br />
$page=0;<br />
}<br />
else<br />
{<br />
$page=$_GET['page'];<br />
if($page&lt;0)$page=0;<br />
if($page&gt;=ceil($num/10))$page=ceil($num/10)-1;//因为page是从0开始的，所以要-1<br />
}</p>
<p>这样$exec可以这么写 $exec="select * from tablename limit ".($page*10).",10";<br />
//一页是10记录的</p>
<p>最后我们需要做的就是几个连接：<br />
&lt;a href="xxx.php?page=0"&gt;FirstPage&lt;/a&gt;<br />
&lt;a href="xxx.php?page=&lt;?=($page-1)?&gt;"&gt;PrevPage&lt;/a&gt;<br />
&lt;a href="xxx.php?page=&lt;?=($page+1)?&gt;"&gt;NextPage&lt;/a&gt;<br />
&lt;a href="xxx.php?page=&lt;?=ceil($num/10)-1?&gt;"&gt;LastPage&lt;/a&gt;</p>
<p>这是一个大致的思路，大家可以想想怎么来优化？今天说到这里，明天说一下一些注意的问题。</p>
<p>十天学会php之第九天</p>
<p>学习目的：注意事项</p>
<p>1、注意不要漏了分号<br />
2、注意不要漏了变量前的$<br />
3、使用SESSION的时候注意不要遗漏session_start();</p>
<p>　　如果发生错误的时候，可以采用以下方法：<br />
1、如果是SQL语句出错，就注释了然后输出SQL语句，注意也要注释调后续的执行SQL语句<br />
2、如果是变量为空，大多是没有传递到位，输出变量检查一下，检查一下表单的id和name<br />
3、如果是数据库连接出错，检查是否正确打开MY SQL和是否遗漏了连接语句<br />
4、注意缩进，排除括号不区配的错误</p>
<p>　　在做大网站的时候，我的思路是先构建数据库，确定每一个字段的作用，和表之间的关系。然后设计后台界面，从添加数据开始做起，因为添加是否成功可以直接到数据库里面验证，做好了添加再做显示的页面，最后才是两者的结合。一般来说后台就包括添加删除修改和显示，后台没有问题了，前台也没有什么大问题。前台还需要注意安全性和容错还有就是输出格式。</p>
<p>　　好了，今天说到这里，明天说一下如果用PHP上传文件和发邮件。</p>
<p>十天学会php之第十天<br />
　　学习目的：学会用PHP上传文件和发邮件</p>
<p>　　上传文件表单必须加上 enctype="multipart/form-data" 和 &lt;input type="file" name="file"&gt;下面看一下代码：</p>
<p>$f=&amp;$HTTP_POST_FILES['file'];<br />
$dest_dir='uploads';//设定上传目录<br />
$dest=$dest_dir.'/'.date("ymd")."_".$f['name'];//我这里设置文件名为日期加上文件名避免重复<br />
$r=move_uploaded_file($f['tmp_name'],$dest);<br />
chmod($dest, 0755);//设定上传的文件的属性</p>
<p>　　上传的文件名为date("ymd")."_".$f['name'] ，可以在以后插入到数据库的时候用到，PHP实际上是把你上传的文件从临时目录移动到指定目录。move_uploaded_file($f['tmp_name'],$dest);这是关键</p>
<p>　　至于发邮件就更加简单，可以使用mail()函数mail("收件人地址","主题","正文","From:发件人\r\nReply-to:发件人的地址");</p>
<p>　　不过mail()需要服务器的支持，在WINDOWS下还需要配置SMTP服务器，一般来说外面的LINUX空间都行。</p>
<p>　　好像上传文件和发邮件比ASP简单很多，只要调用函数就可以了。ASP还需要用到服务器的不同组件比如FSO、JMAIL什么的。</p>
<p>　　十天学会PHP说到这里了，想告诉大家的是PHP入门可以是十天，但是精通决不是十天啊，还需要大家自己去研究。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1874/ten-days-learn-to-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中CKEditor和CKFinder配置</title>
		<link>http://pzg.me/web/1873/php-ckeditor-and-ckfinder-configuration/</link>
		<comments>http://pzg.me/web/1873/php-ckeditor-and-ckfinder-configuration/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 04:48:46 +0000</pubDate>
		<dc:creator>countmeon</dc:creator>
				<category><![CDATA[网页设计]]></category>
		<category><![CDATA[ckeditor]]></category>
		<category><![CDATA[ckfinder]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://pzg.me/?p=1873</guid>
		<description><![CDATA[1、/ckeditor/config.js， 配置文件，如果不想写太多，可以直接写好默认配置（语言，菜单栏，宽度），有需要可以百度config配置 config.language = ‘en’；config.skin = ‘v2’；config.uiColor = ‘#AADC6E’；c... ]]></description>
			<content:encoded><![CDATA[<p>1、/ckeditor/config.js， 配置文件，如果不想写太多，可以直接写好默认配置（语言，菜单栏，宽度），有需要可以百度config配置<br />
config.language = ‘en’；config.skin = ‘v2’；config.uiColor = ‘#AADC6E’；config.toolbar = ‘Basic’；…。</p>
<p>2、官方的demo大多都喜欢用js配置editor区域，习惯写php的我就嫌麻烦，只好看内置的php类。</p>
<p>require_once ROOTPATH 。 “ckeditor/ckeditor.php”；$CKEditor = new CKEditor（）；$CKEditor-》returnOutput = true； //设置输出可用变量的情况$CKEditor-》basePath = ‘/ckeditor/’；//设置路径$contentarea = $CKEditor-》editor（“content”， $rs［‘contents’］）； //生成一个以name为content的textarea</p>
<p>echo $contentarea；</p>
<p>3、需要上传了 ，只好加入ckfinder.把ckfinder和ckeditor放在同级目录下。</p>
<p>打开/ckfinder/config.php， 首先设置第一个函数CheckAuthentication（），这个函数需要按照自己的规则写，只要return true的情况才能允许上传文件到服务器的，当然不建议直接写return true，这将导致安全问题。可以采用session来处理比较方便。</p>
<p>session_start（）；function CheckAuthentication（）{ if（isset（$_SESSION［‘UseEidtor’］））</p>
<p>return true；else return false；}</p>
<p>4、上传文件位置：也在/ckfinder/config.php， 找到$baseUrl，之前一直想自己写一个方法用来定位路径，实在不好办，后来只好用sesssion，如果一个网站中，有需要上传到不同的位置，正好可以利用session定位。</p>
<p>if （isset（$_SESSION［‘UseEidtor’］）） {</p>
<p>switch （$_SESSION［‘UseEidtor’］） { case ‘Addr1’：$baseUrl = ‘/addr1/uploadfile/’；case ‘Addr2’：$baseUrl = ‘/addr2/upfiles/’；}</p>
<p>} else {</p>
<p>$baseUrl = ‘/upfiles/’；</p>
<p>} 5、对于上传文件名，ckfinder会按照原有的名字命名，中文的情况下可能会乱码，所以建议使用日期重命名。打开/ckfinder/core/connector/php/php5/CommandHandler/FileUpload.php 找到《 /p》</p>
<p>$sUnsafeFileName =CKFinder_Connector_Utils_FileSystem：：convertToFilesystemEncoding（CKFinder_Connector_Utils_Misc：：mbBasename（$uploadedFile［‘name’］））；后面加上</p>
<p>$sExtension = CKFinder_Connector_Utils_FileSystem：：getExtension（$sUnsafeFileName）；$sUnsafeFileName=date（‘YmdHis’）。‘。’.$sExtension；6、 最后就是使用ckfinder</p>
<p>require_once ROOTPATH 。 “ckeditor/ckeditor.php”；require_once ROOTPATH 。 ‘ckfinder/ckfinder.php’ ；</p>
<p>$CKEditor = new CKEditor（）；$CKEditor-》returnOutput = true；$CKEditor-》basePath = ‘/ckeditor/’；</p>
<p>CKFinder：：SetupCKEditor（$CKEditor， ‘/ckfinder/’） ；//注意这里是相对路径，相对于根目录，不能用绝对路径</p>
<p>$contentarea = $CKEditor-》editor（“content”， $rs［‘contents’］）；两者配合用起来还是挺不错的，更重要的原因是安全性高了很多。</p>
]]></content:encoded>
			<wfw:commentRss>http://pzg.me/web/1873/php-ckeditor-and-ckfinder-configuration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>1</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 href="http://pzg.me/web/779/wordpress-database-clean-up/" title="wordpress数据库清理" >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 href="http://pzg.me/web/280/wp-cleaner-no-longer-need-to-delete-a-revised-version-of/" title="WP Cleaner 删除wordpress不再需要的修订版" >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 target="_blank" rel="nofollow" href="http://pzg.me/goto/http://www.jiangmiao.org/blog/138.html" >http://www.jiangmiao.org/blog/138.html</a></p>
<p>本站提供修改版下载地址：<a target="_blank" rel="nofollow" href="http://pzg.me/goto/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>2</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 target="_blank" rel="nofollow" href="http://pzg.me/goto/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>
	</channel>
</rss>

