我知道goto声明不赞成但我想知道以下情况是否会使它最容易被接受。
我想为列值创建一个唯一的随机数,但要做到这一点,我需要创建一个随机数并检查它是否存在于表中。
a:
$rnumber = rand(1, 10);
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);
if ($queryresult->num_rows > 0) //if random number exists a row would be returned
{goto a;} //try again
else {//insert into table}
答案 0 :(得分:6)
请改用它,因此数字将是唯一的
$id = uniqid(rand(), true);
答案 1 :(得分:3)
你不需要转到那里。
do
{
$rnumber = rand(1, 10);
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);
}
while($queryresult->num_rows > 0);
//insert into table}
编辑:这个答案只是为了证明原始代码中不需要goto。在这个特定的例子中,我建议不要使用这段代码,并在你的代码中使用WereWolf - The Alpha的答案。
答案 2 :(得分:2)
相反,您应该使用while循环来计算重试次数:
$attempt = 0; $success = false;
while ($attempt++ < 3) {
// ... make sure $success gets marked true!
// in case of success, make sure you break here!
}
if (!$success) {
// Failure
}
这可确保您的脚本永远不会冻结(无限循环)。
答案 3 :(得分:0)
goto 语句主要是 - 如果有的话 - 用于错误处理:在一长串语句中,每个语句都能够触发错误,跳转(goto)在函数底部附近跳过所有剩余的语句,并在函数末尾运行一个常见的错误处理器。
但是现在,即使PHP有异常处理,因此 goto 的使用更不合理。
修复上述问题
在您的情况下,您可以实现一个简单的算法来执行等效函数
do {
$rnumber = rand(1, 10);
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);
} while ($queryresult->num_rows > 0);
有可能处于无限(或很长)的循环......
改进空间
由于尝试次数有限(1 ... 10),
会更好即,执行10次尝试的最大,如果行不存在或者所有10次尝试都已完成,则退出。要从1到10随机尝试,请使用shuffle函数随机随机播放1到10个元素的数组。
$tries = array();
for ($i=1 ; $i<=10 ; $i++) $tries[] = $i; // create an array (1,2,3,4,5...)
shuffle ($tries); // shuffle the array, eg now $tries is (8,2,9,1,7...)
$index = 0; // start with first element of $tries
do {
$rnumber = $tries[$index++];
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber);
} while ($queryresult->num_rows > 0 && $tries < 10);
通过这种方式,您可以随机尝试所有10个可能的值,而不是更多。
while 添加
之后if ($queryresult->num_rows < 1) {
// found a non existing number: $tries[$index-1]
}
else {
// all 10 numbers exist in the DB...
}
处理这两个条件。
答案 4 :(得分:-1)
goto
不是一个好的编码实践,它会使您的代码无法解释且无法管理。不要使用goto
。否则,在编译代码时会有一个快速减震器击中你。
但如果您正在制作控制台应用程序,那没关系。没关系。