0

我开发了这个使用递归调用自身的函数。我需要生成一个唯一的激活码。

它是这样的: 1. 使用单独的类文件中的函数生成一个随机字符串。(参见第二个代码) 2. 我正在检查激活表中该字符串的唯一性,以便没有重复项。3.万一重新生成随机字符串虽然我知道机会很小,但我不想冒险。所以我正在对照表记录检查它。

如果生成的激活码已经存在,那么函数应该再次调用自身以生成新的激活码,整个过程继续进行,直到我们得到一个唯一的激活码,该激活码不存在于表记录中。

我的问题是,我是否正确编码了它,即递归部分。如果它不正确或者是否有人有更好或有效的方法来实现这一点,请告诉我。

注意:我从类文件中调用这些函数。简单地说,我正在使用 OOP。所以我需要知道调用递归的代码应该是

return generateUniqueActivationCode();

或者

return $this->generateUniqueActivationCode();

任何帮助将不胜感激。

    // Generate Unique Activation Code
    //*********************************************************************************
    public function generateUniqueActivationCode()
    {
        $mysql = new Mysql();
        $string = new String();

        // This is coming from the 2nd part of code snippet that I have added
        $activation_code = $string->generateActivationCode();

        // Is Activation Code Unique Check
        $sql = "SELECT activation_id FROM ". TABLE_ACTIVATION_CODES ." WHERE activation_code='$activation_code' LIMIT 1";
        $query = $mysql->query($sql);

        if($mysql->rowCount($query) > 0)
        {
            // This function is calling itself recursively
            return generateUniqueActivationCode();
        }
        else
        {
            return $activation_code;
        }
    }

这是生成随机激活码的代码

class String
{
    // Generates A Random String (Can be used for generating password etc.)
    //*********************************************************************************
    public function generateRandomString($noofchars=8)
    {
        $salt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabchefghjkmnpqrstuvwxyz0123456789";
        srand((double)microtime()*1000000);
        $i = 0;
        while ($i <= $noofchars)
        {
            $num = rand() % 33;
            $tmp = substr($salt, $num, 1);
            $string = $string . $tmp;
            $i++;
        }
        return $string;
    }   
}
?>
4

1 回答 1

0

我会这样输入:

public function generateUniqueActivationCode(){
        $mysql = new Mysql();
        $string = new String();
        do{
            $activation_code = $string->generateActivationCode();
            $sql = "SELECT activation_id FROM ". TABLE_ACTIVATION_CODES ." WHERE activation_code='$activation_code' LIMIT 1";
            $query = $mysql->query($sql);
        }while($mysql->rowCount($query) > 0);
        return $activation_code;
    }

执行(至少运行一次),但只要您的 rowCount 返回大于 0 的值就会重复。

于 2012-12-18T06:27:31.273 回答