2011-11-21 539 views
0

下面是隨機字符串生成的代碼,它正在工作,但這裏有一些問題,我目前無法弄清楚這裏發生了什麼,它總是返回長度爲1的值,我期待一個長度爲10的隨機字符串。我也傳遞了10個長度。請引導我在這裏做錯了什麼。隨機字符串生成php

<?php 
function random_string($length) { 
    $len = $length; 
    $base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789"; 
    $max = strlen($base) - 1; 
    $activatecode = ''; 
    mt_srand((double) microtime() * 1000000); 

    while (strlen($activatecode) < $len + 1) { 
     $activatecode.=$base{mt_rand(0, $max)}; 

     return $activatecode; 
    } 
} 

?> 

回答

1

似乎爲我工作。

修復您編寫了一下:

function random_string($length) { 
$len = $length; 
$base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789"; 
$max = strlen($base) - 1; 
$activatecode = ''; 
mt_srand((double) microtime() * 1000000); 

while (strlen($activatecode) < $len + 1) { 
    $activatecode.=$base[mt_rand(0, $max)]; 
} 

    return $activatecode; 
} 

演示:http://codepad.org/gq0lqmB3

6

您從而內返回,造成while循環只運行一次,並返回該點的結果(這是隻有1個字符)

將您返回線路1倒(脫離while循環),它應該工作。

+0

/facepalm工作大聲笑索姆時間複製粘貼是最糟糕的,那麼你認爲THx回答 –

+0

不客氣;) – matthiasmullie

1

return語句是while循環內。

將它移到while循環結束之後。

1

您的return語句位於while循環內部,使其立即退出函數,並將其移至函數的末尾。

一些補充說明:

  • 無需mt_srand((double) microtime() * 1000000);時下。
  • 不要使用strlen,你不需要它。
  • {}子串語法已過時。

例子:

<?php 
function random_string($length) 
{ 
    $length = (int) $length; 
    if ($length < 1) return ''; 

    $base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789"; 
    $max = strlen($base) - 1; 

    $string = '';  
    while ($len--) 
    { 
     $string .= $base[mt_rand(0, $max)]; 
    } 
    return $string; 
}  
?> 

我建議你添加一個最大長度爲好,以防萬一。

1

只是好奇,什麼是乘microtime()* 1000000?

每次microtime()被調用它都會產生不同的種子!