我正在学习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,那么会发生什么?据推测它会无限循环?有什么方法可以阻止这种情况吗?
答案 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循环语法对我来说没问题。