1

我知道 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}
4

5 回答 5

6

改用这个,所以数字将是唯一的

$id = uniqid(rand(), true);
于 2013-05-25T17:34:33.283 回答
3

你不需要 goto 。

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's answer。

于 2013-05-25T17:33:08.200 回答
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
}

这可以确保您的脚本永远不会冻结(无限循环)。

于 2013-05-25T17:32:20.743 回答
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),最好

  • 重复尝试从 1 到 10(最大)的所有数字
  • 随机(例如 7 2 3 9 ...)

即,最多执行 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 个可能的值,而不是更多。

一段时间后添加

if ($queryresult->num_rows < 1) {
  // found a non existing number: $tries[$index-1]
}
else {
  // all 10 numbers exist in the DB...
}

处理这两种情况。

于 2013-05-25T17:38:07.420 回答
-1

goto这不是一个好的编码实践,它会让你的代码变得不负责任和难以管理。永远不要使用goto. 否则,当您编译代码时,速激肽会击中您。

在此处输入图像描述

但是如果你在做一个控制台应用程序就可以了,没关系。

于 2013-05-25T17:40:28.690 回答