• 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

Object Storage Arubacloud
0 głosów
242 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 766 wizyt
0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 23 marca 2020 w PHP przez THEJOKERRED Nowicjusz (120 p.)
0 głosów
1 odpowiedź 82 wizyt

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...