在我的for循环中生成一个不同的随机字符串

时间:2013-06-24 10:50:09

标签: php loops for-loop

我有以下函数来生成随机字符串:

public function generateString(){
    function generateCharacter () {
        $possible = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $char = substr($possible, mt_rand(0, strlen($possible)-1), 1);
        return $char;
    }
    function generateNumber () {
        $GUID = generateCharacter().generateCharacter().generateCharacter().generateCharacter().generateCharacter().generateCharacter().generateCharacter().generateCharacter().generateCharacter();
        return $GUID;
    }
    $string = generateNumber();
    return $string;
}

然后我需要能够使用for循环生成这些随机字符串x次并将它们插入我的MySQL表中:

$how_many是我要选择循环次数的地方。

for ($i = 1; $i <= $how_many; $i++) {

        $random = $this->generateString();

        $query_params = array( 
            ':code' => $random,
        );
        $query = " 
            INSERT INTO table
            ( 
                code
            ) 
            VALUES 
            ( 
                :code
            )
        ";
        try { 
            $stmt = DB::get()->prepare($query); 
            $stmt->execute($query_params); 
        }  
        catch(PDOException $ex) {} 

    }

上面给出了一个错误:

Fatal error: Cannot redeclare generateCharacter() (previously declared in....

我知道我不能在for循环中使用该函数,否则我会收到此错误但是如果我在循环之外它只生成一次字符串并且每次都插入相同的字符串。

我怎样才能得到它,以便循环中的每个插入都是一个新的随机字符串?

3 个答案:

答案 0 :(得分:3)

不要编写已编写的函数。

PHP具有名为uniqid()

的功能

来自手册

  

uniqid()根据当前时间(以微秒为单位)获取带前缀的唯一标识符。

uniqid()返回的值长度为13个字符。如果more_entropy为 TRUE ,则为23个字符。

要获得随机数,您可以使用rand()函数。

在您的代码中,您可以循环多次准备相同的语句。这是非常糟糕的习惯。在循环之前准备语句然后只在循环中执行和绑定参数。它更有效。

答案 1 :(得分:1)

你可以更好地尝试: -

function generateString()
 {
  $number = base64_encode(openssl_random_pseudo_bytes(20, $strong));
  $newstr = preg_replace('/[^a-zA-Z0-9\']/', '', $number);
  return substr($newstr,0,10); return string of 10 random character 
 }
 ///same code after this
  for ($i = 1; $i <= $how_many; $i++) 
   {
    $random = $this->generateString();
    $query_params = array( 
        ':code' => $random,
    );
    $query = " 
        INSERT INTO table
        ( 
            code
        ) 
        VALUES 
        ( 
            :code
        )
    ";
    try { 
        $stmt = DB::get()->prepare($query); 
        $stmt->execute($query_params); 
    }  
    catch(PDOException $ex) {} 

}

答案 2 :(得分:0)

我将尝试解释简要发生的事情,因此从技术角度来看,我会使用可能不完全正确的术语。

在您的代码中,两个内部函数generateCharactergenerateNumber外部的正文中定义函数generateString

最初,只有外部函数(generateString)对于其余代码是“可用的”。

当调用外部函数时,它“定义”两个内部函数,这些函数在全局范围内可用。即内部函数不是真正的私有 - 它们被导出到全局,甚至不是类范围!

当您不止一次调用外部函数generateString时,内部函数会被多次“定义” - 就好像您将在全局中手动定义它们一样多次范围。由于错误,PHP中不允许这样做。


可能的修复:

  • 将内部函数移动到全局范围内(无论如何,它们都会在第一次调用时导出)。这是最糟糕的方式。

  • 制作generateCharactergenerateNumber个简单私有方法。

  • 按照其他答案的建议使用PHP的uniqid


这是一个简化的场景,看看会发生什么:

class Test {
  public function aaa() {
    function bbb() {
      echo("bbb");
    }
    echo "aaa";
    bbb();
  }
}

// bbb(); // would produce fatal error: undefined function bbb()
$test = new Test();
$test->aaa(); // outputs "aaabbb"
bbb(); // ok here, outputs "bbb"