Archive for the ‘技术’ Category

解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

Friday, March 26th, 2010

其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了.

这次又遇到这个问题了, 在网上一番寻找, 在一篇java的文章里找到了原因, 是由于输出的CSV文件中没有BOM.

什么是BOM?

在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

那么如何在PHP中输出BOM呢?

在所有内容输出之前

print(chr(0xEF).chr(0xBB).chr(0xBF));

识别用户是否是通过手机访问

Thursday, October 9th, 2008

今天花了些时间研究这个问题, 不过目前为止没有找到比较完美的解决方案, 简单说说吧.

现在网上一般有这样几种方法:

第一种是根据浏览器发送的HTTP_USER_AGENT来判断用户是否是通过手机访问网站. 这种方法比较普遍, 可以通过匹配关键字适应大多数手机, 但由于HTTP_USER_AGENT格式并没有标准规范并且不是HTTP协议必须的参数, 所以无法适应所有手机或者所有浏览器, 有些手机甚至不发送HTTP_USER_AGENT.

注: 可以在网上搜到别人搜集的各型号手机和浏览器的HTTP_USER_AGENT

第二种方法是根绝浏览器发送的HTTP_ACCEPT, HTTP_ACCEPT可以判断浏览器支持哪些格式的页面, 比如WAP, HTML, XHTML, XML等, 但对于判断用户是否通过手机访问并不是非常准确, 因为HTTP_ACCEPT不是同样必须的, 多数浏览器并不会在HTTP_ACCEPT中进行过多的描述, 比如一个浏览器如果声明了自己支持wml那它可能支持wml, 但是如果不声明wml并不代表就一定不支持wml.

比如Firefox3的HTTP_ACCEPT是这样的:

text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 

而黑莓8800的HTTP_ACCEPT是这样的

application/vnd.rim.html, text/html, application/vnd.wap.xhtml+xml, text/vnd.sun.j2me.app-descriptor, image/vnd.rim.png,image/jpeg, application/x-vnd.rim.pme.b, application/vnd.rim.ucs, image$1.gif;anim=1, application/vnd.rim.jscriptc;v=0-8-8, application/x-javascript, application/vnd.rim.css;v=1, text/css;media=handheld, application/vnd.wap.wmlc;q=0.9, application/vnd.wap.wmlscriptc;q=0.7, text/vnd.wap.wml;q=0.7, */*;q=0.5 

还有一种方法有人说可以判断用户的IP, 原理也简单, 因为在国内GPRS上网是通过代理连接的, 所以用户的IP可能是固定的几个, 但是我并不确定手机不能够通过其他方式上网, 比如3G, 或者说我用手机模拟器登录的时候就有可能出错, 或者说如果我用手机当猫那么会将我通过电脑进行的访问当作手机来处理.

还有一种方法我觉得很不错, 如果浏览器支持javascript的话, 可以判断显示器的尺寸, 没有人会用一个19寸大的手机吧?

说来说去, 还是没有找到完美的解决方法, 不过综合这几种方法写了一个函数.

/**
 * 是否是通过手机访问
 *
 * @return bool 是否是移动设备
 */
function isMobile()
{
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return true;
    }

    $keywords = array('nokia', 'sony', 'ericsson', 'mot',
        'samsung', 'sgh' ,'lg', 'sie-',
        'philips', 'panasonic', 'alcatel', 'lenovo',
        'cldc', 'midp', 'wap', 'mobile');
    // 从HTTP_USER_AGENT中查找手机浏览器的关键字
    if (preg_match("/(" . implode('|', $keywords) . ")/i",
        strtolower($_SERVER['HTTP_USER_AGENT']))) {
        return true;
    }

    if (isset($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false)
        && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false
        || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml')
        < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }

    return false;
}

面向对象的访问控制

Monday, May 5th, 2008

这两天有在看php5的面向对象的一些教程, 因为php4用的比较多,所以对面向对象这个概念并不是很熟悉.

这里只是简单记录一下关于public, private和protected.

public(公共的)应该比较容易理解, 完全公开, 任何地方都可以访问, 包括该类内部, 外部, 子类等等.

a = "1";
	}

	function test(){
		echo $this->a;
	}
}

class b extends a{
	function test2(){
		echo $this->a;
	}
}

$a = new a;
$a->test();
// 这里说明public属性对象内部可访问, 而该语句没报错是
// 因为test方法也可以访问, 说明方法默认为public

echo $a->a; // 这里说明public属性外部也可以访问
$b = new b;
$b->test2(); // 这里说明public属性在子类中可以访问
echo $b->a;  // 这里说明public属性在子类外部也可以访问
?>

private(私有的)可以理解为只有对象的内部可以访问, 但是其中有可比较难理解的概念, 就是继承来的public方法可以访问到父类的private方法和属性, 而且实际上private属性和方法在技术上是无法被覆写的, 这个我目前还没有研究太透彻.

a = "2";
	}

	function test(){
		echo $this->a;
	}
}

class d extends c{
	function test2(){
		echo $this->a;
	}
}

class e extends c{
	private $a="3";
	function test2(){
		echo $this->a;
	}
}

$c = new c;
$c->test();// 这里说明private属性对象内部可访问
// echo $c->a; // 这里会报错说明private属性外部不可以访问
$d = new d;
echo '[';
$d->test(); // 这里输出2,说明在test()中可以访问到class c 的$a
echo ']';
$d->test2(); // 这里没有产生输出说明private属性在子类中不可见
echo $d->a;  // 这里也没有产生输出说明private属性在子类外部也是不可见的
$e = new e;
echo '{';
$e->test();  // 这里输出2, 说明该方法可见, 但访问的是父类的$a
echo '}';
$e->test2();
// 这里输出了3说明$a被覆写了, 但其实在class e中
// 其父类的$a并不可见,所以并不是覆写而是创建
?>

protected (受保护的)我个人理解就是在对象和子对象中你想怎么用都可以, 就是不可以在外面用.

a;
	}
}

class g extends f{
	function test2(){
		echo $this->a;
	}
}
$f = new f;
$f->test(); // 这里产生了输出,说明protected属性对象内部可以访问
//echo $f->a; // 这里报错说明protected属性对象外部不可以访问
$g = new g;
$g->test2(); // 这里输出4,说明protected属性在子类中可以访问
$g->test();  // 这里输出4,说明protected属性在子类中可以访问
// echo $g->a;  //这里报错,说明protected属性在子类的外部不可访问
?>

Sablog-X 1.6 => Wordpress 2.2.3 转换程序 – 080422 测试版

Thursday, April 24th, 2008

这个转换程序终于算是完成了, 不过我只简单测试了一下, 欢迎各位网友进行测试.

我不建议菜鸟进行这个测试, 因为比较危险, 我当初转了2天, 试了不知道多少次才转过来, 虽然这个是全自动的, 但我也不敢保障, 如果有很需要转换而且觉得不把握的, 可以留言或者发email免费咨询, 如果觉得自己做不了的但很需要转的, 我可以提供收费援助.

注意: 使用前一定要备份! 一定 !!! 否则后果自负 !!!!!

__ 使用说明 __
准备事项:
1)备份要转换的sablog-x数据表及附件
2)准备一个本地php+mysql环境, 推荐xampp
3)创建程序目录结构如下
sa-wp/
sa-wp/sa/
sa-wp/wp/
4)分别在sa/和wp/下安装sablog-x 1.6和wordpress 2.2.3, 要转换其他版本的请对比一下版本之间数据库有没有改动, 没有才可以进行转换, 然后再升级wordpress就可以, 如果数据库结构不同, 那不好意思了. 注意sablog-x的表名前缀要和要转换的设置相同,sa和wp的表要放在同一数据库下.
5)将备份导入sablog-x, 将附件附件放到sablog-x内
6)将转换程序放在sa-wp/目录下

配置参数:
修改转换程序的设置,修改如下内容:

$s['hostname'] = ‘localhost’;    # 数据库地址
$s['username'] = ‘root’;    # 数据库帐号
$s['password'] = ”;        # 数据库密码
$s['dbname']   = ’s-w’;        # 数据库名
$s['sa_pre']   = ’sablog_’;    # sablog-x表名前缀
$s['wp_pre']   = ‘wp_’;        # wordpress表名前缀
$s['sa_dir']   = ’sa/’;        # sablog-x安装目录
$s['wp_dir']   = ‘wp/’;        # wordpress安装目录
$s['wp_url']   = ‘http://www.foolbird.net/’;    # 网站访问地址, 注意后面加/

运行转换程序…

收尾工作:

1)进入wordpress后台, 或者使用phpmyadmin导出数据表内容
2)将空间上的sablog-x彻底删除. 全新安装wordpress 2.2.3, 将wp-content/uploads上传到服务器的wp-content下, 然后清空数据库, 导入刚刚导出的数据.

转换程序:

sa-wp_080422

当年我做过的面试题目

Wednesday, April 23rd, 2008

刚刚看了老陈准备的考试题, 是做留言本的, 所以想起了我以前做的一套面试题.

个人觉得这套题还是不错的, geel花了不少心思出的, 题先发出来, 答案整理过后再跟上.

__ 1.php __

__ 试题 __

XHTML和CSS方面的问题不允许借用dreamweaver之类的工具。

一、php方面

1、打开1.php,在文件里写一个类Test实现ITest接口。(如果不会实现接口可以直接改写成类)
2、在当前目录下写一个文件 1-1.php,依次调用你刚才写的Test类的所有method。
3、上述代码(interface ITest)中,public修饰符是什么意思?同类修饰符还有哪些?各有什么意义?
4、上述代码中,function前面为什么要加static关键字?php的关键字和函数区别大小写吗?
4.1、文件 1.php 中不添加结尾的 “?>” 可以运行吗?不添加 “?>” 有什么作用吗?
5、=== 和 == 有什么区别?
6、引用的利弊?一般来说各自在什么情况下用?function如何返回引用?如何给一个function传递引用?
7、一个典型web程序(例如一个论坛)的性能瓶颈通常来说在什么地方?一般采用什么什么方法来提高执行效率?
8、一般用什么办法判断当前页面是用户 post而不是get?

二、XHTML和CSS以及javascript方面
9、简述两条w3c关于XHTML1.0的规范
10、访问过的超链接样式不再具有css里定义的hover和active了,问题的原因可能是?解决方法是?
答案::visited
11、定义一个层,用css实现下列样式:高200px,宽300px,其边框宽度为1px,边框颜色为红色,背景颜色为蓝色,文字颜色为白色,文字水平和垂直居中,文字大小14px,粗体
12、设有 <ul><li>aaa</li><li>bbb</li></ul>,用css使aaa和bbb显示在同一行上。
答案:display:inline;
13、onblur事件在什么时机被触发?
答案:失去焦点
14、请指出body是什么元素的子元素?
答案:document
15、设有如下HTML代码:
<input type=”text” id=”companyName” />
<p id=”company”></p>
<input type=”button” onclick=”setCompanyName()” value=”设置公司名” />
请完成 setCompanyName() 方法,使点击按钮的时候,将<p>中的文字设置为输入框中的文字。如果点击按钮时输入框里没有文字,弹出“请输入文字”的提示。
16、使用过哪些js类库?

三、其他部分
17、使用过哪些发行版本的Linux?喜欢他们的哪些地方?
18、在linux下面你一般用什么方法安装一个软件?
19、bash下面 ls -lah 代表什么意思?
19、rm -i 代表什么意思?rm -f 呢?
20、你用什么办法登录到一台 linux 主机?21、一个文件的权限为 764,表示什么意思?用什么命令将这个文件的权限改为 700?
22、FTP传输过程中binary和ascii模式有什么区别?
23、一个ftp服务器ip为1.2.3.4,端口为123,用户名是 andy,密码是 xyz,要求下载 movie 目录下的 1.rm,请写出可以直接下载这个文件的 URL
24、HTTP返回代码中404代表什么含义?302呢?
25、<script src=”a.js?0607″></script>,请问为什要写问号及其后面的内容?
答案:防止缓存
26、假设第1题中某一个方法你不知道怎么实现,一般情况下你会通过哪些途径来解决?

CentOS+Apache+PHP+MYSQL+Python+Trac

Wednesday, April 16th, 2008

这个是我给公司配服务器时候做的记录, 先占个位置, 以后补全.

# CentOS 4.5

操作系统用的是CentOS 4.5 , 主要是因为CentOS不会有版权问题.

#
# MYSQL 5.0.5la
#
# root@localhost
#
shell> groupadd mysql
shell> useradd -g mysql mysql

shell> ./configure –prefix=/usr/local/mysql
shell> make
shell> make install
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> cd /usr/local/mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> bin/mysql_install_db –user=mysql
shell> chown -R root .
shell> chown -R mysql var
shell> bin/mysqld_safe –user=mysql &

#echo ‘/usr/local/mysql/bin/mysqld_safe –user=mysql &’ >> /etc/rc.local

Apache没有用2.2, 而是用了2.0, 比较稳定也足够用.

#
# APACHE 2.0.63
#
# DocumentRoot /usr/local/apache2/htdocs
#

shell> ./configure –prefix=/usr/local/apache2 –enable-dav –enable-dav-fs –enable-so –enable-rewrite
shell> make
shell> make install

#
# PHP 5.2.5
#

shell> ./configure –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql –prefix=/usr/local/php5

shell> make
shell> make install
shell> cp php.ini-dist /usr/local/php5/lib/php.ini

shell> vim /usr/local/apache2/conf/httpd.conf

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

DirectoryIndex index.php index.html index.htm

AllowOverride All

/etc/rc.d/rc5.d/S97lamp

/usr/local/mysql/bin/mysqld_safe –user=mysql &
/usr/local/apache2/bin/apachectl start

下面这些东西是给php提供gd支持的.

#
# zlib 1.2.3
# freetype 2.1.10
# libpng 1.2.25
# jpeg-6b
# gd 2.0.33
#

tar zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make
make install

tar zxvf freetype-2.1.10.tar.gz
cd freetype-2.1.10
./configure –prefix=/usr/local/modules/freetype
make
make install

tar zxvf libpng-1.2.8-config.tar.gz
cd libpng-1.2.8-config
./configure
make
make install

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure –prefix=/usr/local/modules/jpeg6 –enable-shared –enable-static
make
make install

tar zxvf gd-2.0.33.tar.gz
cd gd-2.0.33
./configure –prefix=/usr/local/modules/gd –with-jpeg=/usr/local/modules/jpeg6 –with-png –with-zlib –with-freetype=/usr/local/modules/freetype
make
make install

先把目录建了, 要不编译的时候会找不到文件夹.

# mkdir jpeg6
# mkdir jpeg6/include
# mkdir jpeg6/lib
# mkdir jpeg6/bin
# mkdir jpeg6/man
# mkdir jpeg6/man/man1

shell> ./configure –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql –prefix=/usr/local/php5 –with-iconv –with-mbstring –enable-mbstring –with-jpeg-dir=/usr/local/jpeg6/ –with-zlib –with-png –with-freetype-dir=/usr/local/freetype/ –with-gd=/usr/local/gd/

#
# Subversion 1.4.6
#

shell>./configure –prefix=/usr/local/subversion

一开始打算用mysql来存放账号密码的, 建好了数据表但是没有用.

CREATE DATABASE `svn`;
CREATE TABLE `user` (
`username` varchar(25) collate utf8_unicode_ci NOT NULL default ‘’,
`passwd` varchar(25) collate utf8_unicode_ci NOT NULL default ‘’,
`groups` varchar(25) collate utf8_unicode_ci NOT NULL default ‘’,
PRIMARY KEY (`username`),
KEY `groups` (`groups`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

#
# mod_python 3.3.1
#
./configure –with-apxs=/usr/local/apache2/bin/apx
make
make install

#
# clearsilver-0.10.5
#

shell>./configure –disable-apache –disable-csharp –disable-ruby –prefix=/usr/local/clearsliver –with-python

shell>make

shell>make install

shell>cd python/

PYTHON_SITE=’python -C \
“import sys; print [path for path in sys.path if path.find('site-packages') != -1][0]“‘

shell>python setup.py install

#
# mysql-python 1.2.2
#

set.cfg
修改mysql_config绝对路径
安全线程->false
shell>python setup.py build
shell>puthon setup.py install

#
# trac 0.11b2
#

# tar zxvf trac-0.10.4.tar.gz

# python ./setup.py install

# trac-admin /usr/local/trac/order initenv    (/usr/loca/trac 目录会自动创建)
#Project Name [My Project]> test
#Database connection string [sqlite:db/trac.db]> mysql://trac:trac@localhost/trac  //前面创建数据库所用的到信息
#Repository type [svn]>     //这里为空,直接回车
#Path to repository [/path/to/repos]> /var/svn/order   //SVN仓库地址

<Location /trac>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /usr/local/trac
SetEnv PYTHON_EGG_CACHE /tmp
PythonOption TracUriRoot /trac
AuthType Basic
AuthName “test’s trac”
AuthUserFile /var/svn/passwd
Require valid-user
</Location>

debian下编译pidgin2.4.0

Tuesday, April 15th, 2008

edited on March 7, 2008 3:50 PM, 这篇文章是在服务器down掉的日子里写在google doc里的.

终于在debian下成功编译了pidgin2.4.0,简单记录一下.

多数情况下编译不成功或者不能编译都是因为缺少库文件, 下面是编译pidgin2.4.0用到的库,我的debian版本是4.*

gcc
autoconf
gdb
automake1.9

libgtk2.0-dev
libxml2-dev
gettext
libnss3-dev
libnspr4-dev
build-essential
libxml-parser-perl
libglib2.0-dev
libglib2.0-dev
libgstreamer0.10-dev
libnss-dev(用来解决msn的ssl支持问题)

然后
./configure  
make
make install

后记: 刚刚用linux的时候在网上找编译相关的教程, 一个网友说解决编译失败最简单的方法是把光盘中全部的库都装上… 不过由于我比较懒, 并没有那么长时间来试.

vForm ver1.3 build 20071207

Friday, December 7th, 2007

为了简化烦琐的javascript前端验证代码,

为了更好的通过w3c标准认证,

Oh yeah, vForm诞生了!

下载程序请直接拉到文章最后的附件部分.

什么是vForm?

vForm是一个php和一个javascript的结合, 再具体点说,vform由一个php类和一个javascript验证函数库组成, php的作用就是控制调用和生成javascript.

为什么开发vForm?

javascript验证是我们公司每个项目必须要做的工作, 为了避免反复写大量的javascript验证代码, 所以抽出了一些时间开发vForm.

vForm有多方便?

因为本人很懒, 所以需要程序一定要完成大部分工作.不说废话,上代码,看看vform如何完成一个表单验证. 注:需要将vform.php和vform.js放到同目录下.可以直接下载程序包,里面也有这个例子.

___________________simple.php____________________

<?php
/**
*   这是一个vfrom使用的一个离子.本例中为大家演示了各种验证规则
* 的使用和同页面多表单验证的实现方法.
*/
require_once(’vform.php’);
$config  = array(
array(”,’username’,’require’,’请输入帐号’),
array(’len’,’username’,’10′,’帐号不能超过10位’,’5′,’帐号不能少于5位’),
array(”,’pass’,’require’,’请输入密码’),
array(’len’,’pass’,’16′,’密码不能超过16位’,’6′,’密码不能少于6位’),
array(’s’,’repass’,’pass’,’两次输入的密码必须相同’),
array(”,’qq’,’number’,’QQ号码必须为数字’),
array(’len’,’qq’,’9′,’QQ号码不能超过9位’,’5′,’QQ号码不能少于5位’),
array(”,’phone’,’phone’,’电话号码由-和数字组成’),
array(”,’name’,’chinese’,’姓名必须是汉字’),
array(’len’,’name’,’4′,’这里不欢迎日本人’,’2′,’名字太短了’),
array(”,’ename’,’english’,’英文名必须是英文’),
array(’len’,’name’,’25′,’你是火星人么?’,’2′,’名字太短了’),
array(”,’age’,’number’,’年龄要是数字才行’),
array(”,’postcode’,’postcode’,’这个是邮政编码’),
array(”,’p’,’percent’,’一个百分比’),
array(”,’f’,’float’,’一个有理数,正负小数整数等等’),
array(”,’nc’,’nochinese’,’不能输入汉字’),
);
$config2  = array(
array(”,’username2′,’require’,’请输入帐号2′),
array(”,’pass2′,’require’,’请输入密码2′),
array(’s’,’repass2′,’pass2′,’两次输入的密码2必须相同’)
);
$vform   = new vform($config, ‘form1′);
$xform   = new vform($config2, ‘b_2′, ‘click’);
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>vForm示例</title>
<style type=”text/css”>
*{
margin:0;
}
body,html{
font:12px;
text-align:center;
}
h1{
font:36px;
font-weight:bold;
text-align:left;
background:#ccc;
border-bottom:2px solid #666;
margin-bottom:10px;
}
form{
margin:10px;
}
img{
border:0;
}
#main{
width:275px;
margin:0 auto;
text-align:left;
}
#main p{
text-align:right;
padding:2px;
}
.text{
width:150px;
background:#eee;
border:1px solid #666;
}
.botton{
width:75px;
color:#fff;
font-weight:bold;
background:#555;
border:1px solid #000;
padding:2px;
}
</style>
<?=$vform->p();?>
<?=$xform->p(true);?>
</head>
<body>
<h1>vForm示例</h1>
<div id=’main’>
<form action=’http://www.m4ker.net’ method=’get’ id=’form1′ >
<p><b>帐号:</b><input name=’username’ class=’text’ id=’username’ /></p>
<p><b>密码:</b><input name=’pass’ class=’text’ id=’pass’ /></p>
<p><b>重复密码:</b><input name=’repass’ class=’text’ id=’repass’ /></p>
<p><b>电话号码:</b><input name=’phone’ class=’text’ id=’phone’ /></p>
<p><b>QQ号码:</b><input name=’qq’ class=’text’ id=’qq’ /></p>
<p><b>姓名:</b><input name=’name’ class=’text’ id=’name’ /></p>
<p><b>英文名:</b><input name=’ename’ class=’text’ id=’ename’ /></p>
<p><b>年龄:</b><input name=’age’ class=’text’ id=’age’ /></p>
<p><b>邮政编码:</b><input name=’postcode’ class=’text’ id=’postcode’ /></p>
<p><b>百分比:</b><input name=’p’ class=’text’ id=’p’ /></p>
<p><b>有理数:</b><input name=’f’ class=’text’ id=’f’ /></p>
<p><b>非汉字:</b><input name=’nc’ class=’text’ id=’nc’ /></p>

<p><input type=’submit’ value=’验证’ class=’botton’ id=’b_1′ /></p>
</form>
<form action=’http://www.m4ker.net’ method=’get’ id=’form2′ >
<p><b>帐号2:</b><input name=’username’ class=’text’ id=’username2′ /></p>
<p><b>密码2:</b><input name=’pass’ class=’text’ id=’pass2′ /></p>
<p><b>重复密码2:</b><input name=’repass’ class=’text’ id=’repass2′ /></p>

<p><input type=’submit’ value=’验证’ class=’botton’ id=’b_2′ /></p>
</form>
<p><a href=”http://validator.w3.org/check?uri=referer”><img src=”http://www.w3.org/Icons/valid-xhtml10” alt=”Valid XHTML 1.0 Transitional” height=”31″ width=”88″ /></a></p>
</div>
</body>
</html>

______________________________________

Ok了, 一点javascript都不需要.更详细的使用方法就需要大家自己发掘了.

附件:vform ver1.3 bulid 20071207

SaBlog-X1.6 -> WordPress 2.2.3 数据完美转移.

Sunday, November 18th, 2007

因为有很多的朋友向我要 sablog转wordpress 的程序, 但由于我当初写的程序只处理了数据, 而图片缩略图是用acdsee转的, 所以如果大家想进行数据转移可能需要等一阵子, 我有时间会完善一下程序然后发给大家.  – 08.4.19

全自动的转换程序已于昨晚完工, 现在是测试阶段, 预计在这周之内可以发出来. – 08.4.22

转换程序已经发上来了, 地址: http://www.foolbird.net/?p=738 , 最近要换空间, 地址可能会变, 大家可以在标签里找关键字 “转换程序”. – 08.4.24

Sunday, November 18th, 2007

写了2天的代码,终于把数据全转移过来了,但是程序还没有完全完成,生成缩略图是我用ACDSEE完成的.

WordPress真是个好东西,也是个奇怪的东西,我花了整整一天的时间研究它的数据库结构,这种结构让我很难理解,但它的确做到了很多程序做不到的事情,这一点很值得我们学习.

下面来说一说进行转移的具体步骤吧.

1.移动附件

2.生成缩略图

3.导入分类
categories -> category

4.导入附件
attachments -> posts
-> postmeta

5.导入文章
articles -> posts
-> post2cat

6.修改附件所属文章
posts.parent_id

修改文章guid
post.guid

7.导入评论
comments -> comment

8.导入链接
links -> link
-> link2cat

这些全部都做完之后基本上就OK了,就是本站现在这个效果.

程序写完可能会发到网上,这个我还很犹豫,因为我还是很舍不得sablog的,我不希望sablog用户都跑来用wordpress,但无论怎样,如果您需要我的帮助,还是可以联系我的.

sablog模板设计教程[3] – default/style.css文件分析

Friday, January 5th, 2007

———————————————————-        +                +
titlelogo                                |
}pageheader
navlink         |
———————————————————-             +                |
description        |     guestlink                }topmenu
———————————————————-+           +                 |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
left        |         right                  |                        |
|                           |                        |
|                           }page                }这部分是inmain 这之外是outmain
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|                           |                        |
|        page**                   |                        |

———————————————————–                        |
footer
———————————————————–                         +

body {//整体页面的样式
margin: 0px;//外补丁设置为0,主要为了去掉页面内容和浏览器间的空隙
font: 12px “Verdana”, “Tahoma”, “sans-serif”;//字体样式
line-height: 140%;//行高
color: #000;//字体颜色
background-color: #cdd6dd;//最底层背景颜色
text-align: center;//页面内容对齐方式,居中
}
form {//表单样式
padding: 0px;//表单内补丁为0,为了去掉表单其他内容间的空隙
margin: 0px;//表单外补丁为0,为了去掉表单其他内容间的空隙
}
h1 {
font-size: 14px;
color: #000;
margin: 0px;
padding: 0px;
}
ol li {//列表的样式
list-style-position: outside;
list-style-type: decimal;
}
a {//链接的样式
color: #333399;
text-decoration: underline;//默认有下划线
}
a:hover {//鼠标在链接上停留时链接的样式
color: #CC0000;
text-decoration: none;//停留时无下划线
}
td {//表格中的样式
font: 12px “Verdana”, “Tahoma”, “sans-serif”;
line-height: 160%;
color: #000;
}
textarea {//表单文本域的样式,添加评论时的文本域等都被这个控制着
font: 12px “Verdana”, “Tahoma”, “sans-serif”;
padding: 4px;
}
input  {//控制文本框 密码框和按钮的样式
background-color: #fff;
color: #000;
font: 12px “Verdana”, “Tahoma”, “sans-serif”;
padding: 3px;
}
hr {//输出一条横线  sablog中很多地方都是用这个来分隔内容的
height: 1px;
border: 1px solid #B3CBE1;
margin-top: 15px!important;
margin-top: 5px;
margin-bottom: 15px!important;
margin-bottom: 5px;
}
#description {//站点描述样式
float: left;
padding-top: 0px!important;
padding-top: 3px;
text-indent:2px;
font: 12px “Verdana”, “Tahoma”, “sans-serif”;
color: #003366;
}
#guestlink {//菜单链接的样式   就是 注册 | 登陆 字样的样式
float: right;
font: 12px “Verdana”, “Tahoma”, “sans-serif”;
color: #003366;
}
#page {//中间部分整体样式
width: 100%;
background-repeat: repeat-y;
margin: 0px;
padding: 0px;
float: left;
background-color: #fff;
background-image: url(sidebar_border       $1.gif);
border-bottom: 1px dotted #386792;
margin-bottom: 1px;
clear:both;
}
#viewmode {//浏览模式 标准 列表 字样的样式
float: right;
}
#right {//中间右侧部分的样式
float: right;
width: 525px;
padding: 12px 15px 15px 15px;
text-align: left;
}
#top {
padding-bottom: 12px;
margin-bottom: 15px;
border-bottom: 1px solid #386792;
}
#left {//中间右侧部分的样式
float: left;
margin: 0px;
width: 180px;
padding: 20px 15px 15px 15px;
text-align: left;
}
#left h2 {//标题的样式 在default里用来控制左侧 日志分类 热门标签 日志归档 搜索文章 等字样的样式
font-size: 14px;
color: #999;
padding: 15px 0px;
margin: 15px 0px 0px 0px;
border-top: 1px solid #B3CBE1;
}
#left ul {
margin: 0px;
padding: 0px;
list-style-type: none;
}
#left ul li {
margin-bottom: 2px;
overflow:hidden;
display:block;
width:178px !important;
width /**/:178px;
clear: both;
}
#left #icp {//备案信息样式
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid #B3CBE1;
}
.formbox {
line-height: 150%;
padding: 5px 0px;
}
.title {//标题
font-size: 14px;
clear:both;
position:relative;
height:18px;
font-weight: bold;
text-indent: 5px;
border-left: 6px solid #d6e3ef;
border-bottom: 1px solid #d6e3ef;
padding: 2px;
}
.newcminfo {
font-size: 11px;
padding-bottom: 7px;
color: #606060;
line-height: 13px
}
.formfield {
color: black;
background-color: #edf2f8;
border:1px solid #bbb;
padding: 3px;
}
.formbutton {//表单按钮
color: black;
background: #edf2f8;
border:1px solid #bbb;
padding-top: 0px!important;
padding-bottom: 3px!important;
padding: 3px 2px 0px 2px;
height: 21px;
border-left: 4px solid #bbb;
}

.cal_day1 {//日历
font-size: 11px;
text-align: center;
}
.cal_day1 a {//日历
text-decoration: underline;
}
.cal_day1 a:hover {//日历
text-decoration: none;
}
.cal_day2 {//日历 今天的样式
font-size: 11px;
text-align: center;
border: 1px solid #999;
font-weight: bold;
}
.cal_day2 a {//日历 今天的链接样式
text-decoration: underline;
}
.cal_day2 a:hover {//日历 鼠标停留在今天的链接上时的样式
text-decoration: none;
}
.curdate {//日历 年月的样式
font-weight: bold;
font-size: 11px;
text-align: center;
padding-bottom: 10px;
}
.curdate a {//日历 年月的链接样式
text-decoration: none;
}
.curdate a:hover {//日历 鼠标停留在年月的链接上时的样式
text-decoration: underline;
}
.attach {//附件
padding: 10px 0px;
}
.attach-desc {//附件
background-color: #edf2f8;
padding: 5px;
border: 1px solid #000;
display: inline;
}
.content {//文章正文样式
clear: both;
display: block;
margin-right: auto;
margin-left: auto;
}
.tags {//标签的样式
padding: 10px 0px;
}
.pagelink {//翻页部分 普通页码样式
padding:1px 3px;
font-size:11px;
font-weight:normal;
border:1px solid #386792;
}
.pagelink a {//翻页部分 普通页码链接样式
color: #333399;
text-decoration: none;
}
.pagelink2 {//翻页部分 第一页 最后一页 上页 下页的样式
padding:1px 3px;
font-size:11px;
font-weight:bold;
border:1px solid #386792;
}
.pagelink2 a {//翻页部分 第一页 最后一页 上页 下页的链接样式
color: #333399;
text-decoration: none;
}
.pagelink3 {//翻页部分,Record:的样式
padding:1px 3px;
font-size:11px;
font-weight:normal;
border:1px solid #386792;
background-color:#edf2f8;
}
.pagecurrent {//翻页部分,当前页链接的样式,如果当前是第一页,那么1就为此样式
padding:1px 3px;
font-size:11px;
font-weight:bold;
color:#000;
background-color:#d6e3ef;
border:1px solid #386792;
}
.post {//文章整体样式
margin-right: auto;
margin-left: auto;
overflow: hidden;
}
.posttitle {//文章标题样式
text-indent: 8px;
border-left: thick solid #386792;
font-size: 14px;
font-weight: bold;
padding: 2px;
margin-top: 5px;
clear:both;
}
.posttitle a {//文章标题链接样式
color: #333399;
text-decoration: underline;
}
.posttitle a:hover{//鼠标停留在文章标题链接上时的样式
height: 70px!important;
background-color: #d6e3ef;
border-bottom: 1px solid #386792;
vertical-align: text-bottom;
}
#titlelogo {//博客名称 或者 logo 的样式
padding: 10px;
float: left;
}
#article-other {
text-align: center;
margin-bottom: 15px;
}
#tburl {
margin: 5px 0px 15px 0px;
}
#trackbacks {//引用部分的样式
margin: 5px 0px 15px 0px;
}
.tbcontent {
margin: 5px 0px 10px 0px;
}
.tbdate {
color: #777777;
font-size: 11px;
padding-top: 2px;
text-align: right;
margin-bottom: 12px;
padding-bottom: 12px;
border-bottom: 1px solid #B3CBE1;
}
.cmcontent {//评论内容样式
margin: 5px 0px 15px 0px;
overflow:hidden;
display:block;
width:523px !important;
width /**/ :571px;
clear: both;
}
.cmdate {//评论日期样式
color: #777777;
font-size: 11px;
padding-top: 2px;
text-align: right;
margin-bottom: 12px;
padding-bottom: 12px;
border-bottom: 1px solid #B3CBE1;
}
#message {//message.htm中消息的样式
margin-top: 100px;
background-color: #fff;
text-align:center;
width: 500px;
padding: 20px;
border: 1px dotted #386792;
margin-right: auto;
margin-left: auto;
}
.navlink {//Home Archives Users Attachments Rss Tags Trackbacks Wap  菜单的样式
float:right;
padding-bottom:5px;
font-family: “Tahoma”, “sans-serif”;
font-weight: bold;
margin-top: 50px;
}
.navlink a {//Home Archives Users Attachments Rss Tags Trackbacks Wap  菜单的链接样式
padding-right:10px;
text-decoration: none;
}
.navlink a:hover {//Home Archives Users Attachments Rss Tags Trackbacks Wap  菜单的链接样式
padding-right:10px;
text-decoration: underline;
}
#topmenu { //description + guestlink的整体样式
height: 18px!important;
background-color: #edf2f8;
border-bottom: 1px dotted #386792;
padding: 5px;
}
.week {//日历中 星期 一 二 三 四 无 六 日 的样式
padding: 3px;
font: 11px “Tahoma”, “sans-serif”;
background-color: #eee;
border-bottom: 2px solid #aaa;
text-align: center;
}
.keywordtd {
padding: 3px 10px;
border-bottom: 1px solid #ccc;
}
.listtd {
padding: 3px 0px;
border-bottom: 1px solid #ddd;
}
.listtd a {
text-decoration: none;
}
.listtd a:hover {
text-decoration: underline;
}
.phpcode {//这个是在添加文章时用的,用来显示php或者其他代码,要手动添加
border: 1px solid #b3cbe1;
border-left: 3px solid #b3cbe1;
background-color: #f8f8f8;
color: #000000;
margin: 5px;
padding: 5px;
}
.quote {
margin: 5px 0px;
padding: 5px;
border: 1px solid #000;
background-color: #edf2f8;
}
.divOFF {
display:none;
}
.divON {
display:block;
}
.attachttitle {//日志归档标题样式
font-weight: bold;
}
.attachicon {//日志归档
float: right;
}
.attachdesc {//日志归档
padding: 10px 0px;
}

先写这些吧,台湾地震之后博客访问就奇慢,又连不上了,有高手帮补充一下
未完待续

作者:maker

发表时间:2007.1.5