使用while()并在PHP中继续

时间:2013-07-22 18:48:42

标签: php php-5.4

我正在学习PHP并尝试正确使用while和continue表达式。

我有一个创建6位数PIN的脚本,我想确保它是唯一的,否则我想生成另一个PIN。

while(1) {
    $pin = rand(111111,999999);
    $sel = mysql_query("SELECT * FROM formusers WHERE pin = '$pin'");
    if(mysql_num_rows($sel) != 0) { continue; }

    mysql_query("INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')");
    if(mysql_affected_rows()!=-1)  {
        echo "Pin:" . $pin;
        exit;
    } else {
        echo "Existing email, try again<br />";
    }
    break;
}

我是否有正确的循环语法?它似乎有用,但是在我的实例中调试它没有办法rand()函数创建相同的PIN两次。

另外,如果我确实用完了唯一的PIN,那么会发生什么?据推测它会无限循环?有什么方法可以阻止这种情况吗?

3 个答案:

答案 0 :(得分:2)

是的,代码有效,但正如所述,无限循环是关注的。你可以解决这个问题:

var $i = 0;

while($i < 10) {
    $i++;

    $pin = rand(111111,999999);
    $sel = mysql_query("SELECT * FROM formusers WHERE pin = '$pin'");
    if(mysql_num_rows($sel) != 0) { continue; }

    mysql_query("INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')");
    if(mysql_affected_rows()!=-1)  {
        echo "Pin:" . $pin;
        exit;
    } else {
        echo "Existing email, try again<br />";
    }
    break;
}

这将确保您永远不会进行超过10次迭代。然而,更大的问题可能是即使采样大小将来也不会起作用。这提出了一个难题。一种可能的方法是确定在开始循环之前存在多少个唯一数字,通过计算它们然后多次迭代,但这种方法类似于n 2 (也许,我不是真的很好大O,我只知道这会很糟糕。

答案 1 :(得分:2)

你可以利用php数组键的独特性。

function getPins($qty){
    $pins = array();
    while (count($pins) < $qty){
        $pins[rand(111111,999999)] = ""; 
    }
    return array_keys($pins);
}

这将确保对于给定的运行,您将获得$ qty数量的唯一引脚。您可能希望查看为函数的每次运行附加唯一的前缀,以避免多次运行在两者之间创建冲突。

答案 2 :(得分:0)

你可以随机种子,所以每次运行它都会给你相同的值:

srand (55 );  //Or some other value.

while循环语法对我来说没问题。