omiga

简单就好

SSI详解

发表评论»

SSI(Server Side Include)使用在HTML中,用于在请求内容返回到客户端前执行页面中的SSI命令,生成动态内容。通常用于多个页面引用公共的内容模块,将此模块分离出来,使用SSI引入即可。

<!--#include virtual="/inc/header.html"-->

以上代码便能在服务端完成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基本语法

<!--#command param="value"-->

SSI的语法非常简单,但使用中需注意以下几点:

  1. <!–与#之间无空格
  2. SSI大小写敏感
  3. 所有value需写在引号中

config命令

config命令主要用于修改SSI的默认设置,诸如时间格式,默认错误信息,文件大小单位。

设置默认错误信息:errmsg

<!--#config errmsg="Error,please contact webmaster@mail.com"-->

定义日期和时间格式:timefmt

<!--#config timefmt="%A, %B %d, %Y"-->

定义文件大小单位

<!--#config sizefmt="bytes"-->

config命令只对其后使用的命令生效。同时,后定义的设置具有更高的优先级,会覆盖之前的设置。

阅读全文»

WordPress theme C32

13条评论»

WordPress theme C32

上一个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一查果然有,节约了大量时间。

发现了很多无敌的函数和变量,比如:

部分函数或变量没有官方文档,但是可以去翻翻源码,应该问题都不大。

C32也用了几个HTML5标签和一点CSS3。opera下发表评论的表单控件很cool,placeholder属性很好用,搜索框safari下也多了一个’x'~···

分类列表增加了预览最近10篇文章的功能,其实我也想给页码加上这么个功能,暂时没时间先搁一搁。(PS:页码预览已实现!)

另外wordpress合并分类的一个小技巧:在设置->撰写选项中把某分类设置为默认分类,删除的分类文章将自动归类到默认分类下。

 

substr()

2条评论»

写了个获取最新评论的函数,用substr截取,后面总会莫名其妙地多个乱码,原来 ,substr() 函数只能正确截取单字节字符串,所以针对双字节或多字节编码的字符就得自己动手了~···

function sysSubStr($String,$Length,$Append=false){
	if (strlen($String) <= $Length ){
		return $String;
	}
	else{
		$I = 0;
		while ($I < $Length){
			$StringTMP = substr($String,$I,1);
			if ( ord($StringTMP) >=224 ){
				$StringTMP = substr($String,$I,3);
				$I = $I + 3;
			}
			elseif( ord($StringTMP) >=192 ){
				$StringTMP = substr($String,$I,2);
				$I = $I + 2;
			}else{
				$I = $I + 1;
			}
			$StringLast[] = $StringTMP;
		}
		$StringLast = implode("",$StringLast);
		if($Append){
			$StringLast .= "...";
		}
		return $StringLast;
	}
}

更多的在这里:http://www.codebit.cn/pub/html/php_mysql/tip/data/substr/

再玩PHP

2条评论»

上一次玩PHP是在遥远的半年前的毕业设计,然后就是一个畸形儿,然后就导致我毕业答辩做了两次~···往事不堪回首~···这次还是给别人做了个小站,做完后都心有余悸~···半年之后忘光光,基本是边翻手册边做的。记下来免得以后到处翻~···(PHP高手请绕道~)

PHP-MySQL

首先建立一个到MySQL服务器的连接:

$link = mysql_connect(’数据库所在位置’,’数据库账号’,’数据库密码’);

当没有提供可选参数时使用以下默认值:server=’localhost:3306′,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<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 md5( string str [, bool raw_output]),raw_output默认为false,函数返回32位字符串,如果将其设置为true则返回16位字符。

session

首先使用session_start()启用session,然后就可注册变量了,$_session['login'] = true,然后就可以跨页面访问该session变量了~···

中文编码问题

所有页面和数据库均使用的utf8编码,但是中文数据在phpmyadmin中总显示乱码,能正确读取,这个问题从一开始就搞到我崩溃,最后修改phpMyAdmin\libraries\select_lang.lib.php数组$GLOBALS['mysql_charset_map']中’utf-8′=> ‘latin1′才算搞定~···(感谢TZ~)

关于JSON部分看这里

over~···

SimplePageNavi页码bug

4条评论»

昨天发现SimplePageNavi的页码计算有误,我原本不到130篇日志,页码却显示到16。

查看SimplePageNavi源文件发现以下代码:

$postsnum = $wpdb-&gt;get_var("SELECT COUNT(*) FROM $wpdb-&gt;posts where post_status='draft'");

问题就在这里,查看WP的表结构发现这条查询条件有误。仅仅过滤掉了草稿,但是数据表中还存在post_status=inherit的数据项。所以将原代码做如下修改即可解决问题:

$postsnum = $wpdb-&gt;get_var("SELECT COUNT(*) FROM $wpdb-&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'));