Archive for the 'Programming' Category

解决PHP存取MySQL 4.1乱码问题

Saturday, January 1st, 2005

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章“Character Set Support”后终于找到了解决方法并测试通过。
MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client [...]

Trackback乱码:我的解决方法

Wednesday, September 22nd, 2004

昨天ZoomQuiet大哥在Trackback完我的帖子后又发了一顿牢骚:
你的 TB 实在是对 GB2312 不识别哪!
赶紧处理一下子是也乎!让MT 也真正国际化吧!
呵呵,这个就是广泛存在于中文Blog上“著名”的Trackback乱码问题——由于Trackback协议并没有考虑不同编码(Charset)的Blog之间发送Trackback Ping需要转换编码而造成的。
我用了一个“诡计”部分解决了这个问题,欢迎大家帮忙测试——向我开Ping ^_^

改造我们的美味书签del.icio.us (1)

Tuesday, August 31st, 2004

美味书签真是个好东东,今天第一次玩,感觉想法创意都很不错。但是我总觉得还有一些美中不足:
1. 那个书签页面的摘要(description)每次都要手工去写,要是像MT的小书签(Bookmarklet)那样直接选择页面里面的内容作为摘要多方便!
2. 网络瞬息万变,要是像furl那样能够留下网页快照就好了,furl好是好,但是我以前试用的时候存下来的页面不支持中文的,会乱码:(
嘿嘿,突然一道闪电划过俺的脑袋,我自己做一个前端来完成这两个工作不就OK了~~
说干咱就干,今天首先来完成任务1!

一个javascript的combo box实现方法

Sunday, August 29th, 2004

combo box和list box的区别就是combo box = list box + input,也就是说即可以使用现成的选项值,也可以用户自己输入值。
今天在使用gmail的时候,看到了它的一个实现方法,特”拿来”学习一下。

ipb2的用户验证机制的原理

Saturday, August 14th, 2004

近日制作一个和ipb整合的网站,需要搞清ipb的验证机制,以便整合登陆。
今天把ipb升级到了ibp2,才发现不能用了…原来ipb2对用户验证机制作了比较大的改动。
ipb1中用户密码经过md5 hash后存放在ibf_members表中,字段为password。如果使用cookies,在cookie中存放的就是这个hash值。
ipb2首先去掉了ibf_members表中的password字段,转而在其中添加了一个member_login_pass字段。另外增加了一个ibf_members_converge表,其结构如下:
converge_id, converge_email, converge_joined, converge_pass_hash, converge_pass_salt
“converge”即”集中”之意。ipb2除了ipb1中的用户名登录方式外,还增加了一种email名登录方式。设用户输入的密码为”passwd”;salt值为”salt”(该值即converge表中的converge_pass_salt字段,其值为由generate_password_salt($len)函数随机生成的5位字符串。)。则通过判断 md5(md5(”salt”).md5(”passwd”)) 是否与converge_pass_hash字段相同来验证登陆。看那三个md5有够BT吧~~
而存放在用户cookie中的pass_hash则是ibf_members表中的member_login_pass字段,其值为对一个由generate_password_salt($len)函数随机生成的60位长的随机字符串md5 hash后的值。这样就算cookie中的pass_hash失窃,用“爆破”的方式得到的也是一个毫无意义的密码。这个还是很有意义的。
录此备忘。
update:
posted by POPOEVER, 08/15/04 00:47:08
那是要为 IPS Converge 脚本应用做准备,它是一个 IPS 的各种程序的登陆中心,类似于 MSN 的 Passport 机制,一处登陆,各处通行~~~
http://www.invisionboard.com/converge/index.php

让 Editplus 的 HTML 工具条支持 XHTML

Friday, August 13th, 2004

相信很多开发PHP朋友和我一样使用Editplus编辑源代码,有很多代码编辑方面便利的功能,如它的HTML工具条。但是这个工具条直到现在最新的2.12版本也输出的也还是HTML代码,如”<br>”,而不是现在推荐的XHTML标准代码”<br />”,还有一些已经是现在标准建议不再使用的代码,比如”<b></b>”最好用”<strong></strong>”来代替等等。今天偶然间发现原来直接编辑Editplus目录下的htmlbar.acp就可以了,随便改^_^
BTW, 今天开会了,不过怎么赶上个黑色星期五啊?怕怕ing…

常见浏览器上传常见图片文件格式返回的文件类型信息

Tuesday, August 10th, 2004

 
IE 6
Mozilla Firefox 0.8
Opera 7.23

jpg
image/pjpeg
image/jpeg
image/jpeg

gif
image/gif
image/gif
image/gif

png
image/x-png
image/png
image/png

bmp
image/bmp
image/bmp
image/x-windows-bmp

tif
application/octet-stream
image/tiff
image/tiff

tif格式IE居然识别为8进制流,这也够离谱的,总之一句话,和其他的领域一样,大家还都不统一呢

“require” “include”告诉我, 到底你们要哪个?

Tuesday, July 27th, 2004

今天再次遇到怪问题,我的目录结构如下:
index.php
libs/config.php
libs/common.php
libs/member.php
index.php内容是
require “libs/common.php”;
libs/common.php的内容是
require “config.php”;
require “member.php”;
开始运行index.php都很正常,但当我在/下也放了一个member.php后,奇迹出现了。
member.php的内容开头也是
requre “libs/common.php”;

index.php提示我重复声明了libs/member.php中的类~ 可是明明只有引用一次呀~
原来.. index.php优先搜索了/下的member.php,并包含进来了..
别以为这个问题很弱智呀,保不准你就会遇到!改成绝对路径require吧! (别以为用require_once就能逃避问题,那东西毕竟效率比require要低)

传说中的“变量污染”

Monday, July 26th, 2004

今天改一个原来变的程序,一高兴就把HTML form中的一个input变量的名称由subop改成了action,一没留心就和form的属性action重复了,结果就出现了IE中无法提交的错误~~ 但在FireFox中还能用。奇怪,后来是用windiff比较才认识到问题所在,不然还以为我有RPWT呢…录此存照 :P

MYSQL高级特性 — 事务处理

Thursday, June 17th, 2004

下面以两个银行账户之间的转账为例子进行演示。
要使用MySQL中的事务处理,首先需要创建使用事务表类型(如BDB = Berkeley DB或InnoDB)的表。
CREATE TABLE account (
account_id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
balance DOUBLE
) TYPE = InnoDB;
要在事务表上使用事务处理,必须要首先关闭自动提交:
SET AUTOCOMMIT = 0;
事务处理以BEGIN命令开始:
BEGIN;
现在mysql客户处在于服务器相关的事物上下文中。任何对事务表所做的改变在提交之前不会成为永久性的改变。
UPDATE ACCOUNT SET balance = 50.25 WHERE account_id = 1;
UPDATE ACCOUNT SET balance = 100.25 WHERE account_id = 2;
在做出所有的改变之后,使用COMMIT命令完成事务处理:
COMMIT;
当然,事务处理的真正优点是在执行第二条语句发生错误时体现出来的,若在提交前终止整个事务,可以进行回滚操作:
ROLLBACK;
下面是另一个例子,通过MYSQL直接进行数学运算:
SELECT @first := balance FROM account WHERE account_id = 1;
SELECT @second := balance FROM account WHERE account_id [...]