1

我正在学习 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,这里会发生什么?大概它会无限循环?有什么办法可以防止这种情况发生吗?

4

3 回答 3

2

为此,您可以利用 php 数组键的独特性。

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

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

于 2013-07-22T19:07:33.767 回答
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(也许,我在 big-O 上不是很好,我只知道这会很糟糕)。

于 2013-07-22T19:02:05.710 回答
0

You can seed random, so it gives you the same values every time, you run it:

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

The while loop syntax looks okay to me.

于 2013-07-22T18:54:42.580 回答