mt_srand() expects parameter 1 to be integer, float given

今天周末,发现之前写的代码存在一个问题。因此在这里订正一下,受影响的版本主要是采用tp-admin开发的一些系统。

本次错误为:“mt_srand() expects parameter 1 to be integer, float given”。出错代码主要位于common.php中一段关于随机字符生成的函数。我们看下原始代码:

  1. /*
  2.  * 随机字符生成
  3.  */
  4. function randStr($len=6,$format='all') {
  5.     switch($format) {
  6.         case 'all':
  7.             $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-@#~'; break;
  8.         case 'char':
  9.             $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-@#~'; break;
  10.         case 'number':
  11.             $chars='0123456789'; break;
  12.         case 'charnum':
  13.             $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  14.             break;
  15.         case 'verify':
  16.             $chars='ABCDEFGHIJKMNPQRSTUVWXYZ23456789';
  17.             break;
  18.     }
  19.     mt_srand((double)microtime()*1000000*getmypid());
  20.     $data="";
  21.     while(strlen($data)<$len)
  22.         $data.=substr($chars,(mt_rand()%strlen($chars)),1);
  23.     return $data;
  24. }

波波分析了下原因,造成此次错误主要是因为里面种子生成的数有些大,超出了Large int的范围,之前写了很多系统一直很稳定,没有出现过这样的错误。我们可以将19行的代码简单修改下就可以了:

  1. mt_srand();

也就是删除播种的参数就可以了,系统会自动播种。除此之外生成随机数还有很多种不同的方法,最简单的我们可以用以下代码替换:

  1. $data .= $chars[mt_rand(0,strlen($chars)-1)];

这完全是波波的疏忽造成的。int超出最大值之后在系统种会以double方式存储,一些系统不会报错,而在其他情形下则会报错,好了问题解决。

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!