作者归档:admin

PHP 和 Mysql 日期问题

最近在php 和 mysql上碰到了一个计算日期Bug:在mysql中使用date_add计算日期,比如date_add(now(),interval 30 year),然后保存进去的值就变成了’0000-00-00 00:00:00’;在php 中使用strtotime计算日期,比如(‘2143-08-22 15:23:56 -100 year’),然后格式化后就变成了’1970-01-01 ‘。后来google了下,发现这是著名的2038年问题
这个问题是因为在32位操作系统上日期类型是一个有正负号的32位整数,2147483647 是能表示的最大32为正整数,对应2038-01-19 03:14:07,超出了就“绕回”,所以不能正常处理。 继续阅读

PHP __destruct函数

PHP引擎会在脚本执行完成后进行垃圾回收,那么是否还需要destruct呢?在stackoverflow上看到的一个很好的答复

析构函数本身跟内存释放没有任何直接的关系,它只是当一个对象被回收时执行自定义代码的“钩子”。它的作用跟构造函数刚好相反-构造函数本身也不申请内存(内存的申请和释放都是GC的事)。
GC能够很好的管理PHP原生的资源(比如对象),但是对于外部资源却必须手动处理。比如,一个文件管理的类,析构函数的作用就是保证如果文件被打开了,就应该被关闭。虽然“最好”在一个对象上要求去调用一个关闭或处理操作,这时析构函数就作为一种援助机制。
我本身反对将析构函数与GC一起使用。有许多微妙的问题他们可以引入如明显的非确定性和意外的能力保持对象存活——甚至在像PHP这种使用引用计数的语言里面。(Java/JVM和.net使用终结器更为挑剔。)

继续阅读

Jquery 滚轮事件

在项目中有采用到一个下拉列表插件jquery.ui.ufd发现在jquery 1.7以上版本中文取值过滤有问题,总是显示前几项而非过滤项。查了半天才发现是jquery的滚轮事件originalEven的问题。StatckOverflow上的解释说在1.7以上的版本jquery event对象的detail属性不再可用而应使用event.originalEvent.detail来代替。

this.listScroll.bind("DOMMouseScroll mousewheel", function(e) {
	self.stopEvent(e);
	e = e ? e : window.event;
	e=e.originalEvent;//在>1.7版本的Jquery中得这样才能获取detail/wheelDelta
	var normal = e.detail ? e.detail * -1 : e.wheelDelta / 40;
			
	var curST = self.listScroll.scrollTop();
	var newScroll = curST + ((normal > 0) ? -1 * self.itemHeight : 1 * self.itemHeight);
	self.listScroll.scrollTop(newScroll);
});

参考链接:
event.wheelDelta returns undefined
Binding mousewheel returns undefined

PHP strtotime计算月份

今天同事发现了一个php的月份bug,说月份列表里怎么出现了两个3月份,代码是大概是这样的:

$month[]=date('Y年m月',strtotime('today'));
$month[]=date('Y年m月',strtotime('-1 month'));
$month[]=date('Y年m月',strtotime('-2 month'));
$month[]=date('Y年m月',strtotime('-3 month'));
$month[]=date('Y年m月',strtotime('-4 month'));
$month[]=date('Y年m月',strtotime('-5 month'));

利用strtotime来计算最近了六个月份,这个bug之前没有被发现因为只有在每月的29,30,31号才会发作:因为php默认取当前时间来做计算,比如今天7月29号减去5个月应该是2月29号,因为今年的2月份没有29号,所以就到了3月份了。 继续阅读