今天周末,发现之前写的代码存在一个问题。因此在这里订正一下,受影响的版本主要是采用tp-admin开发的一些系统。
本次错误为:“mt_srand() expects parameter 1 to be integer, float given”。出错代码主要位于common.php中一段关于随机字符生成的函数。我们看下原始代码:
- /*
- * 随机字符生成
- */
- function randStr($len=6,$format='all') {
- switch($format) {
- case 'all':
- $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-@#~'; break;
- case 'char':
- $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-@#~'; break;
- case 'number':
- $chars='0123456789'; break;
- case 'charnum':
- $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- break;
- case 'verify':
- $chars='ABCDEFGHIJKMNPQRSTUVWXYZ23456789';
- break;
- }
- mt_srand((double)microtime()*1000000*getmypid());
- $data="";
- while(strlen($data)<$len)
- $data.=substr($chars,(mt_rand()%strlen($chars)),1);
- return $data;
- }
波波分析了下原因,造成此次错误主要是因为里面种子生成的数有些大,超出了Large int的范围,之前写了很多系统一直很稳定,没有出现过这样的错误。我们可以将19行的代码简单修改下就可以了:
- mt_srand();
也就是删除播种的参数就可以了,系统会自动播种。除此之外生成随机数还有很多种不同的方法,最简单的我们可以用以下代码替换:
- $data .= $chars[mt_rand(0,strlen($chars)-1)];
这完全是波波的疏忽造成的。int超出最大值之后在系统种会以double方式存储,一些系统不会报错,而在其他情形下则会报错,好了问题解决。