<?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>omiga &#187; LAMP</title>
	<atom:link href="http://omiga.org/blog/archives/category/lamp/feed" rel="self" type="application/rss+xml" />
	<link>http://omiga.org/blog</link>
	<description>简单就好</description>
	<lastBuildDate>Thu, 26 Apr 2012 04:18:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>SSI详解</title>
		<link>http://omiga.org/blog/archives/2069</link>
		<comments>http://omiga.org/blog/archives/2069#comments</comments>
		<pubDate>Fri, 30 Sep 2011 09:24:24 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[httpd.conf]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[SSI]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=2069</guid>
		<description><![CDATA[SSI（Server Side Include）使用在HTML中，用于在请求内容返回到客户端前执行页面中的SSI命令，生成动态内容。通常用于多个页面引用公共的内容模块，将此模块分离出来，使用SSI引入即可。 &#60;!--#include virtual="/inc/header.html"--&#62; 以上代码便能在服务端完成header.html的动态引入，非常简单。 服务端配置 使用SSI之前需要服务端进行简单的配置，开启SSI功能。SSI是针对HTML增加动态内容的技术，所以只对HTML类型文件（.html,.shtml），使用SSI功能的文件建议使用.shtml后缀，便于维护。如果使用.shtml后缀需在服务端作一些配置： AddType text/html .shtml AddOutputFilter INCLUDES .shtml 第一行命名配置将.shtml作为html文件返回 第二行命令用于在返回请求内容前执行页面中的SSI命令，如果你在.html文件中使用SSI，那么将.shtml改为.html即可。 SSI命令 SSI的语法有点像HTML注释，所以如果SSI不能识别，那么将被视作HTML注释处理。SSI的语法功能主要包括：变量的设置/获取，文件的引用，可执行命令，条件表达式等。 SSI基本语法 &#60;!--#command param="value"--&#62; SSI的语法非常简单，但使用中需注意以下几点： &#60;!&#8211;与#之间无空格 SSI大小写敏感 所有value需写在引号中 config命令 config命令主要用于修改SSI的默认设置，诸如时间格式，默认错误信息，文件大小单位。 设置默认错误信息：errmsg &#60;!--#config errmsg="Error,please contact webmaster@mail.com"--&#62; 定义日期和时间格式：timefmt &#60;!--#config timefmt="%A, %B %d, %Y"--&#62; 定义文件大小单位 &#60;!--#config sizefmt="bytes"--&#62; config命令只对其后使用的命令生效。同时，后定义的设置具有更高的优先级，会覆盖之前的设置。 include命令 include命名可能是SSI中使用最多的命令，也是SSI最主要的功能体现，include命令可以将其他文件引用到当前文档中。 &#60;!--#include virtual="/inc/header.inc"--&#62; &#60;!--#include file="inc/desc.inc"--&#62; include命令支持通过虚拟路径引入文件（virtual），以及相对路径引入文件（file）。 include命令支持引用任何类型的文件，不过我建议最好将需要引入的文件名后缀设置为.inc，或放入固定的文件目录，方便管理。 set命令 使用SSI同样可以使用set进行变量的定义： &#60;!--#set var="blog" value="http://omiga.org/"--&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>SSI（Server Side Include）使用在HTML中，用于在请求内容返回到客户端前执行页面中的SSI命令，生成动态内容。通常用于多个页面引用公共的内容模块，将此模块分离出来，使用SSI引入即可。</p>
<pre>&lt;!--#include virtual="/inc/header.html"--&gt;</pre>
<p>以上代码便能在服务端完成header.html的动态引入，非常简单。</p>
<h2>服务端配置</h2>
<p>使用SSI之前需要服务端进行简单的配置，开启SSI功能。SSI是针对HTML增加动态内容的技术，所以只对HTML类型文件（.html,.shtml），使用SSI功能的文件建议使用.shtml后缀，便于维护。如果使用.shtml后缀需在服务端作一些配置：</p>
<pre>AddType text/html .shtml
AddOutputFilter INCLUDES .shtml</pre>
<p>第一行命名配置将.shtml作为html文件返回</p>
<p>第二行命令用于在返回请求内容前执行页面中的SSI命令，如果你在.html文件中使用SSI，那么将.shtml改为.html即可。</p>
<h2>SSI命令</h2>
<p>SSI的语法有点像HTML注释，所以如果SSI不能识别，那么将被视作HTML注释处理。SSI的语法功能主要包括：变量的设置/获取，文件的引用，可执行命令，条件表达式等。</p>
<h3>SSI基本语法</h3>
<pre>&lt;!--#command param="value"--&gt;</pre>
<p>SSI的语法非常简单，但使用中需注意以下几点：</p>
<ol>
<li>&lt;!&#8211;与#之间无空格</li>
<li>SSI大小写敏感</li>
<li>所有value需写在引号中</li>
</ol>
<h3>config命令</h3>
<p>config命令主要用于修改SSI的默认设置，诸如时间格式，默认错误信息，文件大小单位。</p>
<p>设置默认错误信息：errmsg</p>
<pre>&lt;!--#config errmsg="Error,please contact webmaster@mail.com"--&gt;</pre>
<p>定义日期和时间格式：timefmt</p>
<pre>&lt;!--#config timefmt="%A, %B %d, %Y"--&gt;</pre>
<p>定义文件大小单位</p>
<pre>&lt;!--#config sizefmt="bytes"--&gt;</pre>
<p>config命令只对其后使用的命令生效。同时，后定义的设置具有更高的优先级，会覆盖之前的设置。</p>
<p><span id="more-2069"></span></p>
<h3>include命令</h3>
<p>include命名可能是SSI中使用最多的命令，也是SSI最主要的功能体现，include命令可以将其他文件引用到当前文档中。</p>
<pre>&lt;!--#include virtual="/inc/header.inc"--&gt;
&lt;!--#include file="inc/desc.inc"--&gt;</pre>
<p>include命令支持通过虚拟路径引入文件（virtual），以及相对路径引入文件（file）。</p>
<p>include命令支持引用任何类型的文件，不过我建议最好将需要引入的文件名后缀设置为.inc，或放入固定的文件目录，方便管理。</p>
<h3>set命令</h3>
<p>使用SSI同样可以使用set进行变量的定义：</p>
<pre>&lt;!--#set var="blog" value="http://omiga.org/"--&gt;</pre>
<p>变量定义后便可以使用了：</p>
<pre>&lt;!--#echo var="blog"--&gt;</pre>
<pre>定义变量时使用环境变量：</pre>
<pre>&lt;!--#set var="fname" value="${DOCUMENT_NAME}${DOCUMENT_URI}"--&gt;</pre>
<p>如果是单个环境变量可以不使用{}分割：</p>
<pre>&lt;!--#set var="fname" value="$DOCUMENT_NAME"--&gt;</pre>
<p>环境变量的引用都需要使用$前缀，如果$仅作为字符使用，通过\$转义即可。</p>
<h3>echo命令</h3>
<p>echo显示变量值，包括自定义变量、环境变量</p>
<p>&lt;!&#8211;#echo var=”DOCUMENT_NAME”&#8211;&gt;</p>
<p>注意：echo命令中使用的环境变量不需要使用$前缀。</p>
<p>SSI的主要环境变量如下：</p>
<table>
<tbody>
<tr>
<th>name</th>
<th>description</th>
<th>type</th>
</tr>
<tr>
<td>DOCUMENT_NAME</td>
<td>当前文档名</td>
<td>SSI</td>
</tr>
<tr>
<td>DOCUMENT_URI</td>
<td>当前文档虚拟路径</td>
<td>SSI</td>
</tr>
<tr>
<td>QUERY_STRING_UNESCAPED</td>
<td>未经转义处理的由客户端发送的查询字串，所有的特殊字符前面都有转义符”\”</td>
<td>SSI</td>
</tr>
<tr>
<td>DATE_LOCAL</td>
<td>服务器设定时区的日期和时间</td>
<td>SSI</td>
</tr>
<tr>
<td>DATE_GMT</td>
<td>功能与DATE_LOCAL一样，但返回的是以格林尼治标准时间为基准的日期</td>
<td>SSI</td>
</tr>
<tr>
<td>LAST_MODIFIED</td>
<td>当前文档的最后更新时间</td>
<td>SSI</td>
</tr>
<tr>
<td>SERVER_SOFTWARE</td>
<td>服务器软件的名称和版本</td>
<td>CGI</td>
</tr>
<tr>
<td>SERVER_NAME</td>
<td>服务器的主机名称，DNS别名或IP地址</td>
<td>CGI</td>
</tr>
<tr>
<td>SERVER_PROTOCOL</td>
<td>客户端请求所使用的协议名称和版本</td>
<td>CGI</td>
</tr>
<tr>
<td>SERVER_PORT</td>
<td>服务器的响应端口</td>
<td>CGI</td>
</tr>
<tr>
<td>REMOTE_HOST</td>
<td>发出请求信息的客户端主机名称</td>
<td>CGI</td>
</tr>
<tr>
<td>REMOTE_ADDR</td>
<td>发出请求信息的客户端IP地址</td>
<td>CGI</td>
</tr>
<tr>
<td>AUTH_TYPE</td>
<td>用户身份的验证方法</td>
<td>CGI</td>
</tr>
<tr>
<td>REMOTE_USER</td>
<td>访问受保护页面的用户所使用的帐号名称</td>
<td>CGI</td>
</tr>
</tbody>
</table>
<p>更多的环境变量可使用printenv命令查看</p>
<h3>printenv命令</h3>
<p>显示所有环境变量</p>
<pre>&lt;!--#printenv --&gt;</pre>
<h3>fsize命令</h3>
<p>显示指定文件的大小，可结合config sizefmt指定输出格式。</p>
<pre>&lt;!--输出当前文档大小--&gt;
&lt;!--#fsize file="$DOCUMENT_NAME"--&gt;
&lt;!--#fsize virtual="$DOCUMENT_URI"--&gt;</pre>
<h3>flastmod命令</h3>
<p>显示指定文件的最后更新日期，可结合config sizefmt指定输出格式。</p>
<pre>&lt;!--输出当前文档大小--&gt;
&lt;!--#flastmod file="$DOCUMENT_NAME"--&gt;
&lt;!--#flastmod virtual="$DOCUMENT_URI"--&gt;</pre>
<h3>exec命令</h3>
<p>Exec 命令可以执行 CGI 脚本或者 shell 命令。使用方法如下：</p>
<ul>
<li>CMD：使用 /bin/sh 执行指定的字串。如果 SSI 使用了 IncludesNOEXEC 选项，则该命令将被屏蔽</li>
<li>CGI：可以用来执行 CGI 脚本</li>
</ul>
<h3>if…语句</h3>
<p>SSI中也可以是用条件判断语句if，语法如下：</p>
<pre>&lt;!--#if expr="test_condition" --&gt;
&lt;!--#elif expr="test_condition" --&gt;
&lt;!--#else --&gt;
&lt;!--#endif --&gt;</pre>
<p>示例：</p>
<pre>&lt;!--#if expr="$DOCUMENT_NAME=index.shtml"--&gt;
&lt;p&gt;这是通过if判断当前文档名为"index.shtml"后显示&lt;/p&gt;
&lt;!--#elif expr="$DOCUMENT_NAME=index.html"--&gt;
&lt;p&gt;这是通过if判断当前文档名为"index.html"后显示&lt;/p&gt;
&lt;!--#else --&gt;
&lt;p&gt;既不是"index.shtml"，也不是"index.html"&lt;/p&gt;
&lt;!--#endif --&gt;</pre>
<p><a title="SSI详解" href="http://omiga.org/lab/ssi/" target="_blank">demo</a></p>
<p>&nbsp;</p>
<p>SSI还是在之前公司的使用经常用，好几月不用，所剩已经寥寥。挺好的技术，而且简单方便，于是整理篇文章记录一下。</p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2011. |
<a href="http://omiga.org/blog/archives/2069">Permalink</a> |
<a href="http://omiga.org/blog/archives/2069#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/2069&title=SSI详解">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/apache" rel="tag">apache</a>, <a href="http://omiga.org/blog/archives/tag/httpd-conf" rel="tag">httpd.conf</a>, <a href="http://omiga.org/blog/archives/tag/include" rel="tag">include</a>, <a href="http://omiga.org/blog/archives/tag/ssi" rel="tag">SSI</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/2069/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress theme C32</title>
		<link>http://omiga.org/blog/archives/1669</link>
		<comments>http://omiga.org/blog/archives/1669#comments</comments>
		<pubDate>Mon, 07 Mar 2011 12:33:31 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[C32]]></category>
		<category><![CDATA[ND]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=1669</guid>
		<description><![CDATA[上一个theme(ND)是08年的时候做的，2年多了，一直也没换，期间也做过好几个theme，种种原因，都没有替换上来，感觉是无法超越！-_-! C32也一样，但是毕竟ND已经有了2年多了，怎么都要换换了，而且这两年中，总想要加一些东西进来，可能有插件，但是插件总还是有局限，而且我也很厌烦后台一大堆插件更新提示，所以C32所有的功能都没有依靠插件实现，随机日志、最新评论、评论、相关日志、分页、分类等，都是通过现写的C32_random_posts,C32_recent_comments,C32_comments,C32_related_posts,C32_page_nav,C32_cats这几个函数来实现的。无图片、无插件，低碳环保！ 不经常做theme，每做一次就像第一次做一样，到处翻资料，为了写这几个函数，还去翻源代码，觉得wp异常强大。文件的组织，函数的命名都相当规范，以致有时候自己都能完全猜出要的函数名称，然后到源码或者codex一查果然有，节约了大量时间。 发现了很多无敌的函数和变量，比如： get_posts() get_categories() get_category_link() get_permalink() get_the_tags() get_comments() get_edit_comment_link() esc_url() add_query_arg() get_avatar() get_bookmarks() wp_count_posts() get_pagenum_link() WP_Query/$wp_query $paged current_user_can 部分函数或变量没有官方文档，但是可以去翻翻源码，应该问题都不大。 C32也用了几个HTML5标签和一点CSS3。opera下发表评论的表单控件很cool，placeholder属性很好用，搜索框safari下也多了一个&#8217;x'～··· 分类列表增加了预览最近10篇文章的功能，其实我也想给页码加上这么个功能，暂时没时间先搁一搁。（PS：页码预览已实现！） 另外wordpress合并分类的一个小技巧：在设置-&#62;撰写选项中把某分类设置为默认分类，删除的分类文章将自动归类到默认分类下。 &#160; © omiga for omiga, 2011. &#124; Permalink &#124; 13 comments &#124; Add to del.icio.us Post tags: C32, ND, theme, wordpress]]></description>
			<content:encoded><![CDATA[<p><a href="http://omiga.org/img/c32.jpg"><img class="alignnone size-full wp-image-1679" title="WordPress theme C32" src="http://omiga.org/img/c32.jpg" alt="WordPress theme C32" width="300" height="225" /></a></p>
<p>上一个<a title="WordPress theme ND" href="http://omiga.org/blog/archives/494">theme(ND)</a>是08年的时候做的，2年多了，一直也没换，期间也做过好几个theme，种种原因，都没有替换上来，感觉是无法超越！-_-! C32也一样，但是毕竟ND已经有了2年多了，怎么都要换换了，而且这两年中，总想要加一些东西进来，可能有插件，但是插件总还是有局限，而且我也很厌烦后台一大堆插件更新提示，所以C32所有的功能都没有依靠插件实现，随机日志、最新评论、评论、相关日志、分页、分类等，都是通过现写的C32_random_posts,C32_recent_comments,C32_comments,C32_related_posts,C32_page_nav,C32_cats这几个函数来实现的。无图片、无插件，低碳环保！</p>
<p>不经常做theme，每做一次就像第一次做一样，到处翻资料，为了写这几个函数，还去翻源代码，觉得wp异常强大。文件的组织，函数的命名都相当规范，以致有时候自己都能完全猜出要的函数名称，然后到源码或者<a title="wordpress codex" href="http://codex.wordpress.org/" target="_blank">codex</a>一查果然有，节约了大量时间。</p>
<p>发现了很多无敌的函数和变量，比如：</p>
<ul>
<li><a href="http://codex.wordpress.org/Function_Reference/get_post" target="_blank">get_posts()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_categories" target="_blank">get_categories()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_category_link" target="_blank">get_category_link()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_permalink" target="_blank">get_permalink()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_the_tags" target="_blank">get_the_tags()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_comments" target="_blank">get_comments()</a></li>
<li>get_edit_comment_link()</li>
<li>esc_url()</li>
<li>add_query_arg()</li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_avatar" target="_blank">get_avatar()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/get_bookmarks" target="_blank">get_bookmarks()</a></li>
<li><a href="http://codex.wordpress.org/Function_Reference/wp_count_posts" target="_blank">wp_count_posts()</a></li>
<li>get_pagenum_link()</li>
<li><a href="http://codex.wordpress.org/Function_Reference/WP_Query" target="_blank">WP_Query</a>/<a href="http://codex.wordpress.org/Function_Reference/WP_Query" target="_blank">$wp_query</a></li>
<li>$paged</li>
<li><a href="http://codex.wordpress.org/Function_Reference/current_user_can" target="_blank">current_user_can</a></li>
</ul>
<p>部分函数或变量没有官方文档，但是可以去翻翻<a href="http://core.trac.wordpress.org/browser/trunk" target="_blank">源码</a>，应该问题都不大。</p>
<p>C32也用了几个HTML5标签和一点CSS3。opera下发表评论的表单控件很cool，placeholder属性很好用，搜索框safari下也多了一个&#8217;x'～···</p>
<p>分类列表增加了预览最近10篇文章的功能，其实我也想给页码加上这么个功能，暂时没时间先搁一搁。（PS：页码预览已实现！）</p>
<p>另外wordpress合并分类的一个小技巧：在设置-&gt;撰写选项中把某分类设置为默认分类，删除的分类文章将自动归类到默认分类下。</p>
<p>&nbsp;</p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2011. |
<a href="http://omiga.org/blog/archives/1669">Permalink</a> |
<a href="http://omiga.org/blog/archives/1669#comments">13 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/1669&title=WordPress theme C32">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/c32" rel="tag">C32</a>, <a href="http://omiga.org/blog/archives/tag/nd" rel="tag">ND</a>, <a href="http://omiga.org/blog/archives/tag/theme" rel="tag">theme</a>, <a href="http://omiga.org/blog/archives/tag/wordpress" rel="tag">wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/1669/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>substr()</title>
		<link>http://omiga.org/blog/archives/777</link>
		<comments>http://omiga.org/blog/archives/777#comments</comments>
		<pubDate>Thu, 18 Dec 2008 04:51:44 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[substr]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=777</guid>
		<description><![CDATA[写了个获取最新评论的函数，用substr截取，后面总会莫名其妙地多个乱码，原来 ，substr() 函数只能正确截取单字节字符串，所以针对双字节或多字节编码的字符就得自己动手了～··· function sysSubStr($String,$Length,$Append=false){ if (strlen($String) &#60;= $Length ){ return $String; } else{ $I = 0; while ($I &#60; $Length){ $StringTMP = substr($String,$I,1); if ( ord($StringTMP) &#62;=224 ){ $StringTMP = substr($String,$I,3); $I = $I + 3; } elseif( ord($StringTMP) &#62;=192 ){ $StringTMP = substr($String,$I,2); $I = $I + 2; }else{ $I = $I + 1; [...]]]></description>
			<content:encoded><![CDATA[<p>写了个获取最新评论的函数，用substr截取，后面总会莫名其妙地多个乱码，原来<span class="dark bold"> </span><span id="articleSummary"> ，substr() 函数只能正确截取单字节字符串，所以针对双字节或多字节编码的字符就得自己动手了～···</span></p>
<pre><span>function sysSubStr($String,$Length,$Append=false){
	if (strlen($String) &lt;= $Length ){
		return $String;
	}
	else{
		$I = 0;
		while ($I &lt; $Length){
			$StringTMP = substr($String,$I,1);
			if ( ord($StringTMP) &gt;=224 ){
				$StringTMP = substr($String,$I,3);
				$I = $I + 3;
			}
			elseif( ord($StringTMP) &gt;=192 ){
				$StringTMP = substr($String,$I,2);
				$I = $I + 2;
			}else{
				$I = $I + 1;
			}
			$StringLast[] = $StringTMP;
		}
		$StringLast = implode("",$StringLast);
		if($Append){
			$StringLast .= "...";
		}
		return $StringLast;
	}
}
</span></pre>
<p><span>更多的在这里：<a href="http://www.codebit.cn/pub/html/php_mysql/tip/data/substr/" target="_blank">http://www.codebit.cn/pub/html/php_mysql/tip/data/substr/</a></span></p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2008. |
<a href="http://omiga.org/blog/archives/777">Permalink</a> |
<a href="http://omiga.org/blog/archives/777#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/777&title=substr()">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/php" rel="tag">PHP</a>, <a href="http://omiga.org/blog/archives/tag/substr" rel="tag">substr</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/777/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>再玩PHP</title>
		<link>http://omiga.org/blog/archives/565</link>
		<comments>http://omiga.org/blog/archives/565#comments</comments>
		<pubDate>Thu, 13 Nov 2008 05:45:19 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=565</guid>
		<description><![CDATA[上一次玩PHP是在遥远的半年前的毕业设计，然后就是一个畸形儿，然后就导致我毕业答辩做了两次～···往事不堪回首～···这次还是给别人做了个小站，做完后都心有余悸～···半年之后忘光光，基本是边翻手册边做的。记下来免得以后到处翻～···（PHP高手请绕道～） PHP-MySQL 首先建立一个到MySQL服务器的连接： $link = mysql_connect(’数据库所在位置’，’数据库账号’，’数据库密码’); 当没有提供可选参数时使用以下默认值：server=&#8217;localhost:3306&#8242;，username=服务器进程所有者的用户名，password=空密码。 连接数据库： 上面只是连接到MySQL，而没有连接到具体的数据库，所以需要连接到数据库才能进行相关操作。 mysql_select_db("数据库名","mysql连接名"); 如果数据库连接成功就可以执行sql命令进行相关的数据库操作了： $result = mysql_query("select * from user"，$link); 如果没有指定$link，则使用上一个打开的连接。如果没有打开的连接，会尝试无参数调用mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。 数据查询结果(针对有结果的sql操作)： while ($row = mysql_fetch_row($result)) { 　　echo $row['field']; } 也可以这样： while ($row = mysql_fetch_row($result)){ 　　for($i=0;$i&#60;count($row);$i++){ 　　　　echo $row[$i]; 　　} } 操作完成后最好释放无用的资源以提高系统性能： mysql_free_result($result); mysql_close($link); 文件上传（POST） 首先表单需设置属性：enctype=”multipart/form-data”，否则文件无法上传。 $_FILES数组： $_FILES['userfile']['name']　客户端机器文件的原名称。 $_FILES['userfile']['type']　文件的 MIME 类型，如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查，因此不要想当然认为有这个值。 $_FILES['userfile']['size']　已上传文件的大小，单位为字节。 $_FILES['userfile']['tmp_name']　文件被上传后在服务端储存的临时文件名。 $_FILES['userfile']['error']　和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的。 文件被上传后，默认地会被储存到服务端的默认临时目录中，除非php.ini中的upload_tmp_dir设置为其它的路径。服务端的默认临时目录可以通过更改PHP运行环境的环境变量TMPDIR来重新设置，但是在PHP脚本内部通过运行putenv()函数来设置是不起作用的。该环境变量也可以用来确认其它的操作也是在上传的文件上进行的。 使文件上传生效 is_uploaded_file　判断文件是否是通过HTTP POST上传的。 move_uploaded_file(string filename, string destination)　本函数检查并确保由filename指定的文件是合法的上传文件（即通过PHP的HTTP POST上传机制所上传的）。如果文件合法，则将其移动为由destination指定的文件。 md5加密 PHP中有现成的函数——string [...]]]></description>
			<content:encoded><![CDATA[<p>上一次玩PHP是在遥远的半年前的<a href="http://omiga.org/blog/archives/133">毕业设计</a>，然后就是一个<a href="http://omiga.org/bk/">畸形儿</a>，然后就导致我毕业答辩做了<a href="http://omiga.org/blog/archives/149">两次</a>～···往事不堪回首～···这次还是给别人做了个小站，做完后都心有余悸～···半年之后忘光光，基本是边翻手册边做的。记下来免得以后到处翻～···（PHP高手请绕道～）</p>
<p><strong>PHP-MySQL</strong></p>
<p>首先建立一个到MySQL服务器的连接：</p>
<pre>$link = mysql_connect(’数据库所在位置’，’数据库账号’，’数据库密码’);</pre>
<p>当没有提供可选参数时使用以下默认值：server=&#8217;localhost:3306&#8242;，username=服务器进程所有者的用户名，password=空密码。</p>
<p>连接数据库：</p>
<p>上面只是连接到MySQL，而没有连接到具体的数据库，所以需要连接到数据库才能进行相关操作。</p>
<pre>mysql_select_db("数据库名","mysql连接名");</pre>
<p>如果数据库连接成功就可以执行sql命令进行相关的数据库操作了：</p>
<pre>$result = mysql_query("select * from user"，$link);</pre>
<p>如果没有指定$link，则使用上一个打开的连接。如果没有打开的连接，会尝试无参数调用mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。</p>
<p>数据查询结果(针对有结果的sql操作)：</p>
<pre>while ($row = mysql_fetch_row($result)) {
　　echo $row['field'];
}</pre>
<p>也可以这样：</p>
<pre>while ($row = mysql_fetch_row($result)){
　　for($i=0;$i&lt;count($row);$i++){
　　　　echo $row[$i];
　　}
}</pre>
<p>操作完成后最好释放无用的资源以提高系统性能：</p>
<pre>mysql_free_result($result);
mysql_close($link);</pre>
<p><strong>文件上传（POST）</strong></p>
<p>首先表单需设置属性：enctype=”multipart/form-data”，否则文件无法上传。</p>
<p>$_FILES数组：</p>
<ul>
<li>$_FILES['userfile']['name']　客户端机器文件的原名称。</li>
<li>$_FILES['userfile']['type']　文件的 MIME 类型，如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查，因此不要想当然认为有这个值。</li>
<li>$_FILES['userfile']['size']　已上传文件的大小，单位为字节。</li>
<li>$_FILES['userfile']['tmp_name']　文件被上传后在服务端储存的临时文件名。</li>
<li>$_FILES['userfile']['error']　和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的。</li>
</ul>
<p>文件被上传后，默认地会被储存到服务端的默认临时目录中，除非<var class="filename"><span style="font-style: normal;">php.ini</span></var>中的upload_tmp_dir设置为其它的路径。服务端的默认临时目录可以通过更改PHP运行环境的环境变量<span class="envar">TMPDIR</span>来重新设置，但是在PHP脚本内部通过运行putenv()函数来设置是不起作用的。该环境变量也可以用来确认其它的操作也是在上传的文件上进行的。</p>
<p><strong>使文件上传生效</strong></p>
<p>is_uploaded_file　判断文件是否是通过HTTP POST上传的。</p>
<p>move_uploaded_file(string filename, string  destination)　本函数检查并确保由<tt class="parameter">filename</tt>指定的文件是合法的上传文件（即通过PHP的HTTP  POST上传机制所上传的）。如果文件合法，则将其移动为由<tt class="parameter">destination</tt>指定的文件。</p>
<p><strong>md5加密</strong></p>
<p>PHP中有现成的函数——string md5( string str [, bool raw_output])，raw_output默认为false，函数返回32位字符串，如果将其设置为true则返回16位字符。</p>
<p><strong>session</strong></p>
<p>首先使用session_start()启用session，然后就可注册变量了，$_session['login'] = true，然后就可以跨页面访问该session变量了～···</p>
<p><strong>中文编码问题</strong></p>
<p>所有页面和数据库均使用的utf8编码，但是中文数据在phpmyadmin中总显示乱码，能正确读取，这个问题从一开始就搞到我崩溃，最后修改phpMyAdmin\libraries\select_lang.lib.php数组$GLOBALS['mysql_charset_map']中&#8217;utf-8&#8242;=&gt; &#8216;latin1&#8242;才算搞定～···(感谢TZ～)</p>
<p>关于JSON部分看<a href="http://omiga.org/blog/archives/153">这里</a>。</p>
<p>over～···</p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2008. |
<a href="http://omiga.org/blog/archives/565">Permalink</a> |
<a href="http://omiga.org/blog/archives/565#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/565&title=再玩PHP">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/json" rel="tag">JSON</a>, <a href="http://omiga.org/blog/archives/tag/mysql" rel="tag">mysql</a>, <a href="http://omiga.org/blog/archives/tag/php" rel="tag">PHP</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/565/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SimplePageNavi页码bug</title>
		<link>http://omiga.org/blog/archives/182</link>
		<comments>http://omiga.org/blog/archives/182#comments</comments>
		<pubDate>Thu, 24 Jul 2008 01:42:27 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[SimplePageNavi]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=182</guid>
		<description><![CDATA[昨天发现SimplePageNavi的页码计算有误，我原本不到130篇日志，页码却显示到16。 查看SimplePageNavi源文件发现以下代码： $postsnum = $wpdb-&#38;gt;get_var("SELECT COUNT(*) FROM $wpdb-&#38;gt;posts where post_status='draft'"); 问题就在这里，查看WP的表结构发现这条查询条件有误。仅仅过滤掉了草稿，但是数据表中还存在post_status=inherit的数据项。所以将原代码做如下修改即可解决问题： $postsnum = $wpdb-&#38;gt;get_var("SELECT COUNT(*) FROM $wpdb-&#38;gt;posts where post_type='post' and post_status='publish'"); （7月31日更新） 除了日志数量读取bug外，还确实在页码计算上存在一个bug。问题代码： $pagenum=intval($postsnum/get_option('posts_per_page')); 解决办法： $pagenum=ceil($postsnum/get_option('posts_per_page')); © omiga for omiga, 2008. &#124; Permalink &#124; 4 comments &#124; Add to del.icio.us Post tags: bug, SimplePageNavi, wordpress]]></description>
			<content:encoded><![CDATA[<p>昨天发现<a href="http://www.JerryHong.com">SimplePageNavi</a>的页码计算有误，我原本不到130篇日志，页码却显示到16。</p>
<p>查看SimplePageNavi源文件发现以下代码：</p>
<pre>$postsnum = $wpdb-&amp;gt;get_var("SELECT COUNT(*) FROM $wpdb-&amp;gt;posts where post_status='draft'");</pre>
<p>问题就在这里，查看WP的表结构发现这条查询条件有误。仅仅过滤掉了草稿，但是数据表中还存在post_status=inherit的数据项。所以将原代码做如下修改即可解决问题：</p>
<pre>$postsnum = $wpdb-&amp;gt;get_var("SELECT COUNT(*) FROM $wpdb-&amp;gt;posts where post_type='post' and post_status='publish'");</pre>
<p>（7月31日更新）</p>
<p>除了日志数量读取bug外，还确实在页码计算上存在一个bug。问题代码：</p>
<pre>$pagenum=intval($postsnum/get_option('posts_per_page'));</pre>
<p>解决办法：</p>
<pre>$pagenum=ceil($postsnum/get_option('posts_per_page'));</pre>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2008. |
<a href="http://omiga.org/blog/archives/182">Permalink</a> |
<a href="http://omiga.org/blog/archives/182#comments">4 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/182&title=SimplePageNavi页码bug">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/bug" rel="tag">bug</a>, <a href="http://omiga.org/blog/archives/tag/simplepagenavi" rel="tag">SimplePageNavi</a>, <a href="http://omiga.org/blog/archives/tag/wordpress" rel="tag">wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/182/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP and JSON</title>
		<link>http://omiga.org/blog/archives/153</link>
		<comments>http://omiga.org/blog/archives/153#comments</comments>
		<pubDate>Tue, 24 Jun 2008 09:02:32 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[json_decode]]></category>
		<category><![CDATA[json_encode]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=153</guid>
		<description><![CDATA[PHP5中新增加两个函数json_encode和json_decode以加强对JSON的支持～第一个函数将把任意类型的数据对象转换为一组序列化数据，以供 JavaScript 处理。第二个函数将把序列化数据解码，并将其转换为基本 PHP 对象或联合数组。 json_encode主要用于将数组转换成JSON格式返回给客户端的JavaScript，转换时我们需注意以下几点： PHP自动分配的数字索引的数组转换后依然返回的是原数组，无法转换成JSON格式的数据，自定义的数字索引数组array(1=&#62;”omiga”,2=&#62;”http://omiga.org”)则可正常转换； 转换后的JSON数据的name与数组的索引对应。数组array(“name”=&#62;”omiga”,”homepage”=&#62;”http://omiga.org”)转换后的JSON数据是：{“name”:”omiga”,”homepage”:”http://omiga.org”}； 非UTF-8编码下的中文无法正常转换，必须先将数组转换成UTF-8再用json_encode进行转换（很麻烦～等会还得转回去）。 json_decode默认返回的是stdClass 的对象，可以使用json_decode(jsonData,true)创建数组。 相关阅读 http://www.openphp.cn/blog.php?blog_id=12 http://www.ibm.com/developerworks/cn/opensource/os-php-v523 http://hi.baidu.com/yeakyang/blog/item/604357078f835ec87b89478c.html © omiga for omiga, 2008. &#124; Permalink &#124; No comment &#124; Add to del.icio.us Post tags: JSON, json_decode, json_encode, PHP]]></description>
			<content:encoded><![CDATA[<p>PHP5中新增加两个函数json_encode和json_decode以加强对JSON的支持～第一个函数将把任意类型的数据对象转换为一组序列化数据，以供 JavaScript 处理。第二个函数将把序列化数据解码，并将其转换为基本 PHP 对象或联合数组。</p>
<p>json_encode主要用于将数组转换成JSON格式返回给客户端的JavaScript，转换时我们需注意以下几点：</p>
<ol>
<li><span style="color: #000000;">PHP自动分配的数字索引</span><span style="color: #000000;">的数组转换后依然返回的是原数组，无法转换成JSON格式的数据，</span><span style="color: #000000;">自定义的数字索引数组array(1=&gt;”omiga”,2=&gt;”http://omiga.org”)则可正常转换；</span></li>
<li><span style="color: #000000;">转换后的JSON数据的name与数组的索引对应。数组array(“name”=&gt;”omiga”,”homepage”=&gt;”http://omiga.org”)转换后的JSON数据是：{“name”:”omiga”,”homepage”:”http://omiga.org”}；</span></li>
<li><span style="color: #000000;">非UTF-8编码下的中文无法正常转换，必须先将数组转换成UTF-8再用json_encode进行转换（很麻烦～等会还得转回去）。</span></li>
</ol>
<p><span style="color: #000000;">json_decode默认返回的是</span><code>stdClass</code> 的对象，可以使用json_decode(jsonData,true)创建数组。</p>
<p><br/><br />
<strong>相关阅读</strong></p>
<ul>
<li><a href="http://www.openphp.cn/blog.php?blog_id=12" target="_blank">http://www.openphp.cn/blog.php?blog_id=12</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-v523" target="_blank">http://www.ibm.com/developerworks/cn/opensource/os-php-v523</a></li>
<li><a href="http://hi.baidu.com/yeakyang/blog/item/604357078f835ec87b89478c.html" target="_blank">http://hi.baidu.com/yeakyang/blog/item/604357078f835ec87b89478c.html</a></li>
</ul>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2008. |
<a href="http://omiga.org/blog/archives/153">Permalink</a> |
<a href="http://omiga.org/blog/archives/153#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/153&title=PHP and JSON">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/json" rel="tag">JSON</a>, <a href="http://omiga.org/blog/archives/tag/json_decode" rel="tag">json_decode</a>, <a href="http://omiga.org/blog/archives/tag/json_encode" rel="tag">json_encode</a>, <a href="http://omiga.org/blog/archives/tag/php" rel="tag">PHP</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/153/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

