标签归档:php

ip-国家查询之MySQL+PHP版

这个IP-国家查询库使用Webnet77整理的数据,包含了9万多个IP段,在免费数据中是最完整的了(原地址)。我把它转换成了MySQL数据表,同时加入了中文国家名。

使用时,先把SQL文件导入数据库。数据库有点大,完整大小8390KB,压缩后1.19MB,如果你无法一次性导入这么大的数据,可以考虑使用一些导入工具,比如Bigdump

查询时,先用ip2long()函数把xxx.xxx.xxx.xxx形式的IP(标准地址)转换成int数据(IPv4地址),然后执行查询:

$query = “SELECT * FROM iptocountry WHERE lower_bound <= $ip AND upper_bound >= $ip”;

详细代码就不写了,大致就是上面的那个意思。

下载SQL文件

解决Zend_Filter_Input中文乱码问题

Zend_Filter_Input默认会给所有通过的数据添加一个HtmlEntities的过滤器。不幸的是,这个HtmlEntities使用的是ISO-8859-1编码,如果你使用的是GB2312或者UTF-8一类的编码,那中文字符就惨了,乱码无疑。

想要避开这个问题,就不能再用$input->field的方式访问数据了,要用$input->getUnescaped(‘field’)的方式,这样会忽略掉默认的HtmlEntities过滤器。如果你仍然喜欢用$input->field的方式,往下看:

一个简单的解决方法是直接去改Zend/Filter/HtmlEntities.php文件,把构造函数(public function __construct($quoteStyle = ENT_COMPAT, $charSet = ‘ISO-8859-1’))里第二个参数的默认值改成你的网站使用的编码。

这个方法还有一个额外的好处,以后当你使用HtmlEntities时也无需再指定编码了。虽然通常不鼓励直接修改Zend Framework的源文件,但是这一点小小的改动不会有什么英系那个。唯一的弊端就是每次升级Zend Framework时必须再改一次。

另一个方法是用别的过滤器替换掉默认的HtmlEntities过滤器。你可以使用其他的标准过滤器,比如StringTrim;也可以模仿HtmlEntities写个你自己的html转移过滤器,用上你自己的网站编码;还可以创建一个空过滤器,不进行任何过滤。然后在实例化Zend_Filter_Input时这样写:

 $myFilter);
$input = new Zend_Filter_Input($filters, $validators, $data, $options);
?>

或者:

setDefaultEscapeFilter($myFilter);
?>

大功告成!

解决Xdebug与Zend Optmizer不兼容问题的方法

xdebug的官方手册中指出xdebug应当作为zend extension加载:

zend_extension_ts=”c:/php/modules/php_xdebug-4.4.1-2.0.2.dll”

但这样的话xdebug就会与ZendOptmizer冲突,导致Apache无法启动。

如何让xdebug与ZendOptmizer共存呢?解决方法就是不以zend extension的形式加载xdebug,用加载常规扩展的方法。把xdebug的dll文件放入php的ext文件夹中,然后在php.ini中加入:

extension=php_xdebug-4.4.1-2.0.2.dll

这样xdebug就能与ZendOptmizer共存了。

虽然phpinfo()里会提示:XDEBUG NOT LOADED AS ZEND EXTENSION,但据我观察这样并不影响xdebug的正常使用。

以上方法在WinXP,Apache2.2,PHP5.2,Xdebug2.0.3下试验成功。