• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

kontynuuj pętle po FATAL error

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
293 wizyt
pytanie zadane 6 września 2019 w PHP przez Bartek2210 Obywatel (1,310 p.)

Witam mam pytanie. Jak zrobić żeby po wystąpieniu FATAL error skrypt kontynuował pętlę? Nie wiem czy jest to możliwe. Mój skrypt pobiera informacje z zewnętrznej strony na temat kilku graczy w grze. W tym celu w bazie danych mam nazwy osób, które mnie interesują i skrypt ma wstawiać ich nicki w linku w odpowiednim miejscu , a następnie wyciągnąć potrzebne mi o nich informacje

Wygląda to w taki sposób:

$html = file_get_html('https://Przykladowa_strona/eu/'.$data['nazwa'].'')-> find('.slider.active',0)->find('tr',1);

Problem pojawia się jeżeli w w zmiennej $data['nazwa'] znajdzie się nick osoby, która nie istnieje bo wtedy nie może znaleźć takiej strony i pokazuje błąd

Warning: PHP Startup: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /simple_html_dom.php

Chciałbym żeby w przypadku jak wystąpi ten błąd było to ignorowane i po prostu żeby pętla kontynuowała bez tego gracza.

2 odpowiedzi

+1 głos
odpowiedź 6 września 2019 przez Chess Szeryf (76,710 p.)
edycja 13 września 2019 przez Chess
 
Najlepsza

php.net

<?php
// Create a cURL handle
$ch = curl_init('http://www.example.com/');

// Execute
curl_exec($ch);

// Check HTTP status code
if (!curl_errno($ch)) {
  switch ($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
    case 200:  # OK
      break;
    default:
      echo 'Unexpected HTTP code: ', $http_code, "\n";
  }
}

// Close handle
curl_close($ch);
?>

Pod default napisz continue i powinno być OK i zależnie od potrzeb wyrzuć break. Pamiętaj, że możesz przerywać i kontynuować najbardziej zewnętrzne pętle. Musisz wtedy podać numer pętli zewnętrznej np. continue 2;.

Aha i lepiej byłoby raczej abyś przepisował swój kod pod cURLa, ponieważ teraz korzystasz z "file_get_html", którzy strzelam jest pod spodem file_get_contents. Wydaje mi się, że cURL w tym konkretnym zastosowaniu lepiej by się sprawdził.

Edit:


<?php

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
// curl_setopt($ch, CURLOPT_TIMEOUT, 30);

$urls = ['http://127.0.0.1:8000/backend1.php', 'http://127.0.0.1:8000/backend2.php'];

$as_a_matter_of_fact = false;

foreach($urls as $url) {  // 2
  
  curl_setopt($ch, CURLOPT_URL, $url);
  $content = curl_exec($ch);

  if(!curl_errno($ch)) {
    switch($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {  // 1
      case 200:
        $as_a_matter_of_fact = true;
        break;
      default:
        $as_a_matter_of_fact = false;
        continue 2;
    }
  }

  if($as_a_matter_of_fact == true) {
    $doc = new DOMDocument();
    $doc->loadHTML($content);
    echo $doc->textContent . "<br />";
  }

}

?>

Zamiast tych linii kodu pod ostatnim ifem możesz napisać swój kod, który wyłapie tekst ze znaczników HTML.

<div>Hello World</div>
<?php
http_response_code(404); // 404 or 200
?>
<div>Welcome</div>

Utwórz wszystkie trzy pliki w tym samym katalogu i ustaw odpowiednie ścieżki do nich. Później w pliku backend2.php zmień 404 na 200 i później z 200 na 404 i zobacz, co się stanie odświeżając stronę client1.php.

Zwróć uwagę na linię continue 2; w pliku client1.php dzięki której nie zostaje sprawdzona instrukcja warunkowa if pod spodem, tylko od razu "skacze" do swojej "definicji" i sprawdza, czy wykonywać się dalej, czy nie (pętla foreach).

hexainclude.com/ https://gynvael.coldwind.pl/

komentarz 6 września 2019 przez Bartek2210 Obywatel (1,310 p.)
a to rozwiązanie co dałeś zadziała przy tym co mam teraz? Czy najpierw trzeba przepisać na tego cURL
komentarz 6 września 2019 przez Bartek2210 Obywatel (1,310 p.)

@Chess,
 Nie da się zrobić kontynuowania pętli jak wystąpi ten błąd z tym co mam teraz czyli php simple dom parser?

+1 głos
odpowiedź 7 września 2019 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Może użycie bloku try catch w pętli i w catchu użyć instrukcji sterującej continue
 

    $values = [];

    foreach ($values as $value) {
      try {
        $html = file_get_html('https://Przykladowa_strona/eu/'.$value['nazwa'].'')-> find('.slider.active',0)->find('tr',1);
        /**
         * reszta logiki
         */
      } catch (\Exception $exception) {
        if ($exception instanceof UnexpectedException) {
          break;
        }
        continue;
      }
    }

Nigdy nie próbowałem takiej konstrukcji, więc nie mam pewności co do jej działania

Podobne pytania

0 głosów
0 odpowiedzi 1,188 wizyt
0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 23 marca 2020 w PHP przez THEJOKERRED Nowicjusz (120 p.)
0 głosów
1 odpowiedź 97 wizyt

93,113 zapytań

142,093 odpowiedzi

321,656 komentarzy

62,453 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...