Перейти эквивалент для версии PHP <5.3.0? - PullRequest
0 голосов
/ 07 февраля 2012

Мне нужно использовать оператор goto в моем коде, так как я не могу придумать, как обойти это. Однако проблема в том, что на моем хосте установлен только PHP версии 5.2.17.

Есть идеи?

Ниже мой код:

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 ]

8 голосов
/ 07 февраля 2012

В вашем коде есть несколько анти-паттернов. Давайте очистим это. Я объясню, что было изменено в один миг.

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) {
// ...
}
1 голос
/ 07 февраля 2012

Вы хотите использовать правильное управляющее слово для прерывания цикла:

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!

0 голосов
/ 28 июля 2014

Как прямой ответ на заголовок этого поста:

do{

  if (!$condition){
    break;
  }

  // Code called if conditions above are met

}while(0);

//Code always called

В некоторых случаях это или goto может привести к очень аккуратному и читабельному коду.

0 голосов
/ 07 февраля 2012

Во-первых, вы можете использовать break для выхода из вашего начального цикла. Во-вторых, если вам нужно что-то проверить, установите переменную (должна быть глобальной, а не локальной) в качестве флага или индикатора перед вызовом break, затем выполните условный оператор проверки, где ваша строка skip должна выполнить любые дополнительные шаги, которые вы выполняете. необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...