Заменить goto в цикл while?

#php #loops #error-handling #goto

#php #циклы #обработка ошибок #goto

Вопрос:

Я использую goto , если есть какая-либо ошибка, и она начнется снова вверху.

Я также не могу использовать goto в функции для перехода за пределы функции.

Я знаю, goto это плохо, но как бы while цикл вписался в мой код?

Например:

 $ch = curl_init();

retry:

$result = curlPost($ch, "home.php", http_build_query($arg));

if (strpos($postResult, "Welcome") !== false) {
    sleep(10);
    goto retry;
}

$sql = "SELECT * FROM data";
$q = mysql_query($sql) or die(mysql_error());

while($row =  mysql_fetch_assoc($q)) {
    $name['something'] = $row['name'];
    submitData($ch,$name);
}


function submitData($ch,$name) {

    $result2 = curlPost($ch, "submit.php", http_build_query($name));

    if (strpos($postResult, "Website close") !== false) {
        sleep(10);
        goto retry; //goto wouldnt work.
    }

   // do something here
}
  

Комментарии:

1. Это подойдет лучше, чем goto.

2. @Phantom Публикует ответ, используя while цикл с моим примером.

Ответ №1:

В принципе, у вас было бы что-то вроде этого:

 $success = false;
while(!$success) {
    // do stuff here
    // psuedocode follows:
    if failure {
        continue; // skip remainder of `while` and retry
    }
    if complete {
        $success = true; // loop will end
        // or "break;" to exit loop immediately
    }
}
  

Просто имейте в виду, что если ваш «if failure» сам по себе находится внутри цикла, вам понадобится continue 2; . Или если вы находитесь во вложенном цикле, continue 3; и так далее.

Комментарии:

1. Спасибо, это было полезно. Я думаю, мне удалось заменить мой пример, используя while цикл .. не могли бы вы проверить, правильно ли это? pastebin.com/U5Bpkt7A

2. Почти. Просто false опечатано как flase и вам не нужно $tryAgain . Также повторите попытку с submitData логикой в обратном направлении. Попробуйте это