Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z file_get_contents i pętlą for
Forum PHP.pl > Forum > PHP
Warmix
Najpiewr przedstawię skrypt, a potem opiszę problem...
  1. $kod = 'forum.php.pl
  2. forum.php.pl
  3. forum.php.pl
  4. <a href="http://phpedia.pl/wiki/Specjalna:Ostatnie_zmiany';" target="_blank">http://phpedia.pl/wiki/Specjalna:Ostatnie_zmiany';</a>
  5.  
  6. $exp = explode("\n", $kod);
  7. $ile_exp = count($exp);
  8.  
  9. for($x = 0; $x < $ile_exp; $x++)
  10. {
  11.  
  12. $down_html = file_get_contents($exp[$x]);
  13.  
  14.  
  15. if(!preg_match('/Przedszkole/', $down_html))
  16. {
  17. $ilescan++;
  18.  
  19. }
  20. }
  21. echo $ilescan;


Oczywiście tutaj tylko przykład, nie wiem, czy działa...

Na początku wszystko działa dobrze. Explode robija mi zmianną $kod po \n oraz w zmiennej $ile_exp zapisuje się ile mamy wartości w tablicy (w tym przypadku 4).
I teraz zaczyna się problem... Funkcje w pętli for nie dzialają, jak powinny...
Do zmiennej down_html pobierany jest HTML strony. Dzięki '(exp[$x])' za każdym wykoaniem pętli jest inny HTML. I teraz źle sprawdza mi instrukcja. Czyli jeżeli nie znajdzie mi w tym HTML 'Przedszkole', to do zmiennej $ilescan dodaje +1. Słowo 'Przedszkole' znajduje w 'forum.php.pl', ale w 'http://phpedia.pl/wiki/Specjalna:Ostatnie_zmiany'. Czyli zgodnie z warunkiem, podczas pierwszego wykonania skryptu, do zmiennej $ilescan nie powinno dodawać się +1, dlatego, że warunek nie zostaje spełniony, powieważ znajduje "przedszkole'. Pętla leci dalej i 3 razy warunek nie zostaje spełniony.
Teraz pojawia się problem. Za czartym razem także sprawdza mi, czy jest słowo "przedszkole' i tym razem warunek zostaje spełniony, czyli do zmiennej $ilescan dodaje się +1.
Teraz koniec pętli. Wyświetlam $ilescan, i pojawia mi się wartość '4', a powinno '1', ponieważ warunek został spełniony tylko jeden raz.

Co może być nie tak?

Dodatkowo powiem tak:
W pętli zaraz po $down_html = file_get_contents($exp[$x]);
Dodałem dla testu, żeby mi wyświetliło te HTMLy (echo $down_html)...
Po uruchomieniu skryptu okazało się, że nie wyświetlają się 3 pierwsze HTML. Pojawia się błąd "bad request', ale to zrozumiałe, bo przy wyświetlaniu nie może się na jednaj stronie wyświetlić kilka stron.
Wyświetlił mi się tylko ostatni HTML i teraz ważne. Czyli jeżeli za 3 razami pętli pojawiało się 'Bad request', to od razu wiadome, że warunek if(!preg_match('/Przedszkole/', $down_html)) zostaje spełniony, dlatego dodaje mi +1 do $ilescan, a sprawdza mi tylko ostatnie, a ze względu na to, że w tym ostatnim nie ma tego słowa 'Predszkole', to też dodaje +1.
Łącznie zmienna $ilescan ma '4'.
I teraz nasuwa się pytanie. Bad request pojawia się tylko w przypadku, gdy chcę wyświetlić HTML, czy może nawet wtedy, gdy nie wyświetlam??

Co zrobić, aby działało dobrze?
kaki2308
Użyć curla:

  1. <?php
  2. function curl($url){
  3.  
  4. $ch = curl_init($url);
  5. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7. $page=curl_exec($ch);
  8. curl_close($ch);
  9. return $page;
  10. }
  11. $kod = 'http://www.forum.php.pl/
  12. <a href="http://www.forum.php.pl/" target="_blank">http://www.forum.php.pl/</a>
  13. <a href="http://www.forum.php.pl/" target="_blank">http://www.forum.php.pl/</a>
  14. <a href="http://www.phpedia.pl/wiki/Specjalna:Ostatnie_zmiany/';" target="_blank">http://www.phpedia.pl/wiki/Specjalna:Ostatnie_zmiany/';</a>
  15.  
  16. $exp = explode("\n", $kod);
  17.  
  18.  
  19.  
  20. $ile_exp = count($exp);
  21. $ilescan=0;
  22.  
  23. for($x = 0; $x < $ile_exp; $x++)
  24. {
  25.  
  26. $down_html = curl($exp[$x]);
  27.  
  28.  
  29.  
  30.  
  31. if(!preg_match('/Przedszkole/', $down_html))
  32. {
  33. $ilescan++;
  34.  
  35. }
  36. }
  37. echo $ilescan;
  38.  
  39. ?>
Warmix
Najlepsze jest to, że używam curla, tylo napisałem tutaj file_get_contents, bo to nie duża różnica...

Mam taką funkcję:
  1. function curl_file_get_contents($URL)
  2. {
  3. $c = curl_init();
  4. curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  5. curl_setopt($c, CURLOPT_URL, $URL);
  6. $contents = curl_exec($c);
  7. curl_close($c);
  8.  
  9. if($contents)
  10. {
  11. return $contents;
  12. }
  13. else
  14. {
  15. return FALSE;
  16. }
  17. }


I to samo...
kaki2308
Zauważ jak daję linki w tablicy:

http://pastebin.com/0SR6eZ4a
W twoim były jeszcze tabulatory/spację a nie tylko znak nowej linii.

btw.
Na xampp kiedy używam file_get_contents wywala 404, dlatego wolę curla - bardziej niezawodny.
Warmix
ALe to akurat nie ma znaczenia... Oprócz tego, co jest tutaj, sprawdza mi warunek, czy linki są poprawne i żadnych błędów nie ma...
mortus
forum.php.pl nie jest prawidłowym adresem url. Prawidłowy adres to http://forum.php.pl (odnośnik sam się z tego zrobił).

EDIT:
  1. ini_set('display_errors', 'on');

załatwiłoby sprawę

Poza tym sprawdzaj, czy file_get_contents(), czy też CURL pobiera to, co powinien - curl_error()
Warmix
Wiem, wiem... mam linki zaczęte od http...

A co to robi? Żadnych zmian nie ma...
mortus
Cytat(Warmix @ 25.02.2012, 18:27:55 ) *
Wiem, wiem... mam linki zaczęte od http...

Jeśli tak, to użyj trim() na $exp[$x].

Poza tym - jak wyżej - curl_error().

Cytat(Warmix @ 25.02.2012, 18:27:55 ) *
A co to robi? Żadnych zmian nie ma...

To umieszczasz na początku pliku i powinieneś otrzymać trzy ostrzeżenia.
Warmix
Dzięki, wystarczyło zastosować trim... tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.