PHP:使用Goto的有效理由?

时间:2013-05-25 17:28:58

标签: php

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

5 个答案:

答案 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),

会更好
  • 一旦没有重复
  • ,请尝试从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个可能的值,而不是更多。

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。否则,在编译代码时会有一个快速减震器击中你。

enter image description here

  

但如果您正在制作控制台应用程序,那没关系。没关系。