2012-02-07 37 views
-1

我需要在我的代码中使用goto运算符,因为我似乎无法想象如何绕过它。但问题是我的主机只安装了PHP 5.2.17版本。转到PHP版本<5.3.0转换等效?

任何想法?

下面是我的代码:

if ($ready !=="y") 
{ 
    $check=mysql_query("SELECT `inserted` FROM `team`"); 
    $numrows = mysql_num_rows($check); 

    $i="0"; 

    while ($i<$numrows && $row = mysql_fetch_assoc($check)) 
    { 

     $array[$i] = $row['inserted']; 
     $i++; 

    } 
    if (in_array("n", $array)) 
    { 

     goto skip; 

    } 
    else 
    { 
     mysql_query(" 

      UPDATE game SET ready='y' 

     "); 
    } 

} 

skip: 
+4

为什么你会想要使用'goto'?更重要的是,我很惊讶地看到这个**在PHP 5.3中添加**而不是删除。令人咋舌。 – Brad 2012-02-07 18:25:28

+4

“我需要在我的代码中使用goto运算符”意味着糟糕的设计。 – Griwes 2012-02-07 18:25:46

+0

“我需要在我的代码中使用goto运算符,因为我似乎无法想到绕过它的方法。” Impossible – PeeHaa 2012-02-07 18:25:56

回答

8

有代码中的一些反模式。让我们清理它。我会解释一下jiffy中发生了什么变化。第一

if($ready !== "y") { 
    $sth = mysql_query("SELECT inserted FROM team WHERE inserted = 'n'"); 
    if(mysql_num_rows($sth) > 0) { 
     mysql_query("UPDATE game SET ready = 'y'"); 
    } 
} 

第一件事:有没有必要进行查询,获取结果的所有,然后遍历这些结果(in_array)寻找一个特定的值。让数据库通过明确查找inserted是字符串文字"n"的行来为您做。

因为我们知道我们只收到"n"记录,所以我们只需检查是否有任何结果。如果是这样,请运行查询。如果没有"n"记录,则不会运行UPDATE

如果你需要知道的是,UPDATE跑,添加一个检查吧:

$ran_update = false; 
if($ready !== "y") { 
    $sth = mysql_query("SELECT inserted FROM team WHERE inserted = 'n'"); 
    if(mysql_num_rows($sth) > 0) { 
     mysql_query("UPDATE game SET ready = 'y'"); 
     $ran_update = true; 
    } 
} 
if($ran_update) { 
// ... 
} 
+0

好吧,@Charles也清理了代码,+1 – Markus 2012-02-07 18:33:04

+0

谢谢Charles我是一名编程新手,想在短时间内为学校项目学习几种语言让我感到非常慌乱倍。我很感激帮助。 – NeverPhased 2012-02-07 18:34:49

+1

编程永远不是一件容易的事情,也永远不会轻松学习如何一次编写多种语言。祝你好运!一旦你不再为时间紧张,考虑重新审视你编写的所有代码,并找到更简洁的方法,更好地表达你的实际意图。这是[重构](http://en.wikipedia.org/wiki/Code_refactoring)中的一个步骤。虽然这样做,你还应该认真考虑切换到[PDO](http://php.net/pdo),而不是使用可怕的史前'mysql_'系列函数。 – Charles 2012-02-07 18:41:15

1

你要使用正确的控制字从环打破:

if ($ready !=="y") 
{ 
    $check=mysql_query("SELECT `inserted` FROM `team`"); 
    $numrows = mysql_num_rows($check); 

    $i="0"; 


    while ($i<$numrows && $row = mysql_fetch_assoc($check)) 
    { 


    $array[$i] = $row['inserted']; 
    $i++; 

    } 
    if (in_array("n", $array)) 
    { 

     break; 

    } 
    else 
    { 
    mysql_query(" 

    UPDATE game SET ready='y' 

    "); 
    } 

} 

break关键字将按照你想要的完成:结束while循环的执行。永远不要使用goto!

+1

纠正我,如果我错了,但我敢肯定你不能使用'break',因为你的文章中的'break'不在while循环中。 – nickb 2012-02-07 18:40:54

+0

@nickb考虑自己纠正:)查看链接中列出的第一个例子http://www.php.net/manual/en/control-structures.break.php – Nicolas 2012-02-15 07:52:47

+0

但第一个例子中有'break'语句'while'循环。在你的文章中,break语句在while循环之外。 – nickb 2012-02-15 07:55:12

0

首先,您可以使用break退出您的初始循环。其次,如果您需要测试任何内容,请在调用break之前将变量(必须为全局非本地)设置为标志或指示符,然后执行条件测试语句,其中您的skip行将执行所需的任何其他步骤。

0

至于这个帖子的标题的直接回应:

do{ 

    if (!$condition){ 
    break; 
    } 

    // Code called if conditions above are met 

}while(0); 

//Code always called 

在某些情况下,这一点,或跳转,可以非常整齐和可读的代码。