浏览模式: 标准 | 列表

一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。但是对于带有中文的参数来说,这种编码会使编码后的字符串变得很长。如果希望有短一点的方式对参数编码,可以采用 base64 编码方式对字符串进行编码,但是 base64 编码方式不能处理 JavaScript 中的中文,因为 JavaScript 中的中文都是以 UTF-16 方式保存的。而 base64 只能处理单字节字符,所以不能直接用 base64 对带有中文的 JavaScript 字符串进行编码。但是可以通过 utf.js 这个程序中提供的 utf16to8 来将 UTF-16 编码的中文先转化为 UTF-8 方式,然后再进行 base64 编码。这样编码后的字符串,在传递到服务器端后可以直接通过 base64_decode 解码成 UTF-8 的中文字符串。但是还有个问题需要注意。base64 编码中使用了加号(+),而 + 在 URL 传递时会被当成空格,因此必须要将 base64 编码后的字符串中的加号替换成 %2B 才能当作 URL 参数进行传递。否则在服务器端解码后就会出错。

原来在编写 PHPRPC 1.1 的 JavaScript 客户端实现时,就是因为没有注意到这个问题,所以在传递中文参数时,有时候传递的参数正确,有时候参数在服务器端解码时就会出错。后来费了好大劲才发现是这个问题。

» 阅读全文

Google Video 虽然现在还处于 beta 阶段,但上面的 Video 却不少。但是很遗憾的是,对于中国用户来说,还不能直接在 Google Video 网站上看其中的视频,如果打开一个 Google Video 观看视频的页面,将会显示:
Thanks for your interest in Google Video. Currently, the playback feature of Google Video isn't available in your country. We hope to make this feature available more widely in the future, and we really appreciate your patience.
的错误信息。不过没关系。现在你可以通过 CoolPlayer 插件提供的播放功能来看 Google Video 了。 操作也很简单,在下面这个播放窗口的下载栏上双击,然后你会发现下载栏变成了输入框,可以输入网址,你只要把刚才出错的那个页面地址,复制到其中,然后按回车键,就可以观看那个本来不能播放的 Google Video 了,而且你会发现刚才的输入框也变成了这个 Google Video 的下载地址,直接点击就可以下载这个 Google Video 了。如果你还不明白,可以看下面这个视频教程。 当然,可以这样播放的不只有 Google VideoYoutubevSocial 也可以,其他类型的在线媒体(比如mp3、rm、mov、wmv 等等)也可以。 怎么样,方便吧? How to watch Google Video

» 阅读全文

在 PHP 中本身带有一个用 C 语言实现的 xmlrpc 扩展,叫 xmlrpc-epi。因为它是用 C 语言实现的,所以从速度上来说比用 PHP 实现的那些 xmlrpc 扩展要快的多。但是在实际应用中却发现很少有人用这个扩展,大都是用 PHP 脚本实现的 xmlrpc 的扩展。原因可能有以下两点:一是这个扩展需要在服务器上打开,如果没有服务器操作权限,使用这个扩展就不现实了。第二个原因就是这个扩展在 PHP 手册中的说明太少了,而且提供的函数都很基础,要使用的话就很麻烦了。针对第二个问题,我对这个扩展进行了封装,将它封装成了3个 类:xmlrpc_error、xmlrpc_client 和 xmlrpc_server。当然最主要的是后两个类,即 xmlrpc_client 和 xmlrpc_server。这两个类大大简化了创建 xmlrpc 客户端和服务器的步骤。

2006年1月11日 更新

修正了某些非标准端口的服务器上指定相对路径进行调用的错误。

2006年1月6日 更新

增加了对 PHP5 的支持。

» 阅读全文

以前只用 PHP + MySQL,从来没在 PHP 中用过 MSSQL,今天转过来的那个站点正好用的是 MSSQL。刚给他调好了 Register Globals 问题,又一个奇怪的问题就来了。他说他这个系统里面发的新闻有的内容能发,有的不能发,有的能改,有的不能改了。还说以前用着没事。后来发现有两个问题,一个是 php.ini 中有两个选项会影响查询的内容长度。这两个选项是 mssql.textlimit 和 mssql.textsize,把他们改的尽量大一点就好了。另外还有个问题就是 MSSQL 的查询语句跟 MySQL 不太一样,在字符串转义时不是用 \,而是把一个单引号写成两个单引号。这些都是从 PHP 手册的用户注释中发现了,看来 PHP 用户手册的注释真是个好东西。

» 阅读全文

今天,学校一个部门网站要转移到虚拟主机上来,学校虚拟主机上已经挂了 n 多个站点,跑 ASP、PHP、JSP、ASP.NET 的站点都有。因此为了保证安全性,许多不安全的选项都没有开启。所以该网站放上来以后发现许多功能不能用了。这个网站是 PHP 的,原来跑在一台单独的 Apache 服务器上。这个网站编码属于早期的很烂的编码风格,提交的变量都不是通过 $_GET、$_POST 等变量获取,而是直接使用变量名。也就是说这种编码的网页需要在 php.ini 中打开 Register Globals 选项才能正确执行。如果它是一台单独的服务器,打开那个选项也无所谓,大不了就那一个站点被入侵。可是放在虚拟主机上就不同了。要是开了那个选项,其他的 站点也就会受到威胁了。可是要全面修改这个程序也不太可能,一是这个网站不是我开发的,我只是帮他们发布,我没有义务给他们改程序,二是程序太多,我也不 可能一个个的给他们改。于是找了个简单的办法,那个网站虽然比较烂,但有一点不错,每个程序开头都包含了一个 global.php 文件。于是在这个程序中加了一段代码。实现了跟开启 Register Globals 同样的功能。代码如下:

  1. <?php
  2. function register_globals($item, $key) {
  3.     global $$key;
  4.     $$key = $item;
  5. }
  6.  
  7. array_walk($_GET , 'register_globals');
  8. array_walk($_POST , 'register_globals');
  9. array_walk($_COOKIE , 'register_globals');
  10. array_walk($_SERVER , 'register_globals');
  11.  
  12. ...
  13. session_start();
  14. array_walk($_SESSION , 'register_globals');
  15. ...
  16. ?>

其中 array_walk($_SESSION , ‘register_globals’); 要放在 session_start(); 之后才管用。

这样子,就算被入侵了,也就这一个站点倒霉,其他站点不会跟着受牵连。

» 阅读全文