2012-02-07 73 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 

在某些情況下,這一點,或跳轉,可以非常整齊和可讀的代碼。